1

次のテンプレートをお読みください。

PID     Status      LPID

10       Closed      25
11       Open        25
31       Open        31
25       Closed      25
54       Open        31
17       Open        17
20       Closed      31
88       closed      77
77       closed      77
201      open       202
205      open        500

これで、PID!= LPIDの場合、そのPIDはCPID(子プロセスID)として定義されます。それ以外の場合は、PPID(親プロセスID)になります。

今、私はどちらが親でどちらが子であるかを示すコードを探しています-それは別のシートでそれらをマークすることを意味します。同時に、同じ行にPPIDがあるすべてのCPIDをリストしたいのですが、いずれかのPPIDに子プロセスがある場合彼ら自身。出力は次のようになります

PID   Type Of Process?    Child List
10       Child
11       Child
31       Parent              54 20
25       Parent              10 11
54       Child
17       Parent
20       Child
88       Child
77       Parent              88

VBScriptを使用してコードを記述しましたが、実際のシートでは遅すぎます。2500のデータの場合、1時間近くかかるので、自分のプロセスよりも高速なプロセスが必要です。

ここでVBscriptの使用を手伝ってもらえますか?

コード1:

  Set objExcel1 = CreateObject("Excel.Application")'Object for W2W Report Dump


  strPathExcel1 = "D:\VA\CopyofGEWingtoWing_latest_dump_21112012.xls"
  objExcel1.Workbooks.open strPathExcel1

  Set objSheet1 = objExcel1.ActiveWorkbook.Worksheets(2)
  Set objSheet2 = objExcel1.ActiveWorkbook.Worksheets(1)

    IntRow1=1
 Do While objSheet1.Cells(IntRow1, 1).Value <> ""

    IntRow2=4
    IntChildListColumn=3

    If objSheet1.Cells(IntRow1,2).Value="Parent" Then

        Do While objSheet2.Cells(IntRow2, 1).Value <> ""

             If objSheet2.Cells(IntRow2,11).Value=objSheet1.Cells(IntRow1,1).Value And objSheet2.Cells(IntRow2,11).Value <> objSheet2.Cells(IntRow2,1).Value Then

                 objSheet1.Cells(IntRow1,IntChildListColumn).Value=objSheet2.Cells(IntRow2,1).Value
                 IntChildListColumn=IntChildListColumn+1

             End If

      IntRow2=IntRow2+1

      Loop

   End If

 IntRow1=IntRow1+1

Loop

Code2:

 Flag=0
 IntColTemp=1
 IntRowTemp=3

 Set objExcel1 = CreateObject("Excel.Application")'Object for Condition Dump


 strPathExcel1 = "D:\VA\CopyofGEWingtoWing_latest_dump_21112012.xls"
 objExcel1.Workbooks.open strPathExcel1

 Set objSheet1 = objExcel1.ActiveWorkbook.Worksheets(1)
 Set objSheet2 = objExcel1.ActiveWorkbook.Worksheets(2)

 IntRow1=4
 IntRow2=1

Do While objSheet1.Cells(IntRow1, 1).Value <> ""

  objSheet2.Cells(IntRow2, 1).Value = objSheet1.Cells(IntRow1, 1).Value


   IntColTemp=1
   Flag=0
  'This will travarse to the Parent Business Process ID column horizantally in the excel.
  Do While Flag=0

  If objSheet1.Cells(IntRowTemp,IntColTemp).Value="Parent Business Process ID" Then

      Flag=1       

  End If

      IntColTemp=IntColTemp+1


Loop
      IntColTemp=IntColTemp-1
      'MsgBox(IntColTemp)

  Strcmp1=trim(objSheet1.Cells(IntRow1, 1).Value)
  Strcmp2=trim(objSheet1.Cells(IntRow1,IntColTemp).Value)

  If Strcmp1=Strcmp2 Then

      objSheet2.Cells(IntRow2, 2).Value="Parent" 

  Else

      objSheet2.Cells(IntRow2, 2).Value="child"

  End If


   IntRow1=IntRow1+1
   IntRow2=IntRow2+1

  Loop

編集2つのID201と205には子と親の関係があることを確認してください。ただし、子IDは出力列に表示される必要がありますが、メインテーブルにエントリがないため、親202と500は出力リストに表示されません。202 close/open 202500 open/close 500

4

1 に答える 1

1

2つのアイデア/戦略:

  1. セルにアクセスする代わりに、範囲を配列にロードします((c)@DanielCook)
  2. 要素(のセット)に関するデータを処理する必要がある場合は、辞書を使用してください。

コード内:

Option Explicit

Class cP
  Public m_sRel
  Public m_dicC
  Private Sub Class_Initialize()
    m_sRel     = "Child"
    Set m_dicC = CreateObject("Scripting.Dictionary")
  End Sub
  Public Function show()
    show = m_sRel & " " & Join(m_dicC.Keys)
  End Function
End Class

Dim oFS   : Set oFS  = CreateObject("Scripting.FileSystemObject")
Dim oXls  : Set oXls = CreateObject("Excel.Application")
Dim oWb   : Set oWb  = oXls.Workbooks.Open(oFs.GetAbsolutePathName(".\00.xlsx"))
Dim aData : aData    = oWb.Worksheets(1).Range("$A2:$C10")
Dim dicP  : Set dicP = CreateObject("Scripting.Dictionary")

Dim nRow
For nRow = LBound(aData, 1) To UBound(aData, 1)
    Set dicP(aData(nRow, 1)) = New cP
Next

For nRow = LBound(aData, 1) To UBound(aData, 1)
    If aData(nRow, 1) = aData(nRow, 3) Then
       dicP(aData(nRow, 1)).m_sRel = "Parent"
    Else
       dicP(aData(nRow, 3)).m_dicC(aData(nRow, 1)) = 0
    End If
Next

Dim nP
For Each nP In dicP.Keys()
    WScript.Echo nP, dicP(nP).show()
Next

oWb.Close
oXls.Quit

出力:

10 Child
11 Child
31 Parent 54 20
25 Parent 10 11
54 Child
17 Parent
20 Child
88 Child
77 Parent 88
于 2012-12-15T10:13:35.427 に答える