要件:
次のテンプレートをお読みください。
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
101 Closed 66
102 closed 220
現在、PID!= LPID の場合、その PID は CPID (子プロセス ID) として定義され、それ以外の場合は PPID (親プロセス ID) です。
更新child である 101 および 102 と言うエントリがいくつかある可能性がありますが、それらの親には独自の etires がないため、66,220 は出力結果に含まれるべきではなく、そのような出力は存在66 Parent
し220 Parent
ないはずです。
現在、どちらが親でどちらが子であるかを示すコードを探しています。これは、別のシートでそれらをマークすることを意味します。同時に、同じ行に PPID を含むすべての CPID をリストしたいと思います。PPID に子プロセスがある場合彼ら自身。出力は以下のようになります
PID Type Of Process? Child1 Child1 Child3 .... ChildN
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 時間近くかかっています。そのため、私のプロセスよりも高速なプロセスが必要です。
いくつかの要件を満たすために以下のコードを書きました: しかし、理解できないエラーが発生しました。
ここで私を助けてもらえますか?私は両方の方法で構文を試しましたが、Add
何=
も役に立ちませんでした。
オプション明示
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 objSheet1,objSheet2,TotalRows,TotalcolCopy,strPathExcel1
Dim oXls : Set oXls = CreateObject("Excel.Application")
Dim dicP : Set dicP = CreateObject("Scripting.Dictionary")
Dim nRow,nP
strPathExcel1 = "D:\Finalscripts\test.xlsx"
oXls.Workbooks.open strPathExcel1
'oXls.Workbooks.Open(oFs.GetAbsolutePathName("Test.xlsx"))
Set objSheet1 = oXls.ActiveWorkbook.Worksheets("A")
Set objSheet2 = oXls.ActiveWorkbook.Worksheets("B")
TotalRows=oXls.Application.WorksheetFunction.CountA(objSheet1.Columns(1)) - 3
TotalcolCopy=oXls.Application.WorksheetFunction.Match("ABC", objSheet1.Rows(3), 0)
objSheet1.Range(objSheet1.Cells(4,1),objSheet1.Cells(TotalRows,TotalcolCopy)).Copy(objSheet2.Range("A1"))
objSheet2.Range(objSheet2.Cells(1,2),objSheet2.Cells(TotalRows,TotalcolCopy-1)).Delete(-4159)
'Dim aData : aData=objSheet2.Cells.SpecialCells(12)'xlCellTypeVisible
TotalRows = oXls.Application.WorksheetFunction.CountA(objSheet2.Columns(1))
Dim aData : aData = objSheet2.Range("A1:B"&TotalRows)
'MsgBox(LBound(aData, 1)&"And"&UBound(aData, 1))
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, 2) Then
dicP(aData(nRow, 1)).m_sRel = "Parent"
Else
dicP(aData(nRow, 2)).m_dicC.Add aData(nRow, 1), 0 '(aData(nRow, 1)) = 0
End If
Next
objSheet2.Cells.ClearContents'To clear all the previous contenets of the sheet#2
nRow=1
For Each nP In dicP.Keys()
objSheet2.Cells(nRow,1).Value=nP
objSheet2.Cells(nRow,2).Value=dicP(nP).m_sRel
'WScript.Echo nP, dicP(nP).show()
nRow=nRow+1
Next
エラー:必要なオブジェクト: '[未定義]' 行dicP(aData(nRow, 2)).m_dicC.Add aData(nRow, 1), 0 '(aData(nRow, 1)) = 0
編集:子リストを取得するために、上記で以下のコードを書きました:
For Each nP In dicP.Keys()
objSheet2.Cells(nRow,1).Value=nP
objSheet2.Cells(nRow,2).Value=dicP(nP).m_sRel
objSheet2.Range("C"&nRow).Value=dicP(nP).m_dicC.Keys
'WScript.Echo nP, dicP(nP).show()
nRow=nRow+1
Next
しかし、望ましい出力が来ていません。ここで提案できますか?