要求:
请阅读以下模板:
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)
更新可能有一些条目说 101 和 102,它们是孩子,但他们的父母没有自己的 etires,因此 66,220 不应该出现在输出结果中66 Parent
,220 Parent
也不应该有这样的输出。
现在我正在寻找一个代码,它将告诉哪个是父级,哪个是子级 - 意味着在另一张表中标记它们。同时我想列出所有 CPID,PPID 在同一行,如果任何 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
但是期望的输出没有来,你能在这里建议吗?