要求:
请阅读以下模板:
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不应该作为{{1 }和66 Parent
不应该有这样的输出。
现在我正在寻找一个代码,它将告诉哪个是父级,哪个是子级 - 意味着在另一个工作表中标记它们。同时我想列出所有CPID,PPID在同一行,如果有任何PPID让孩子自己处理。输出将如下所示
220 Parent
我已经使用VBScript编写了一个代码,但实际的工作表太慢了。对于2500个数据,它需要接近1小时。所以我想要比我的更快的过程。
我编写了以下代码以满足某些要求:但是收到的错误是不可理解的。
你能在这帮我吗?我尝试了两种语法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
或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
行<[p}}
编辑:要获取子列表,我使用上面的代码编写了以下代码:
dicP(aData(nRow, 2)).m_dicC.Add aData(nRow, 1), 0 '(aData(nRow, 1)) = 0
但所需的输出没有来,你能在这里建议吗?
答案 0 :(得分:1)
我不会因为找不到问题而责备你。您的代码很难阅读,调试或弄清楚您打算做什么。
话虽如此,问题是dicP(aData(nRow,2))
尚未定义,因此您无法访问m_dicC
属性,因为它返回空变量而不是对象。当您尝试调用该属性时,您会收到您指示的错误消息。
您还可以使用更简单的脚本复制错误:
Dim dicP: Set dicP = CreateObject("Scripting.Dictionary")
dicP("test").JumpUpJumpUpAndGetDown 'Silly I know.
由于没有相应的对象,代码不知道如何处理我传递的方法调用,并指示对象是必需的。
我的猜测是你打算这样做:
For nRow = LBound(aData, 1) To UBound(aData, 1)
Set dicP(aData(nRow, 1)) = New cP
'Also add a cP for the nRow, 2
Set dicP(aData(nRow, 2)) = New cP
Next
或者这个:
dicP(aData(nRow, 1)).m_dicC.Add aData(nRow, 1), 0
注意(nrow, 1)
而不是(nrow, 2)
我建议至少在你的代码中添加注释,因为即使你是将来维护它的人,它似乎过于复杂,很难理解它在做什么。你可能会忘记它是如何工作的,需要花一些时间(就像我一样)搞清楚发生了什么。