0

要求:

请阅读以下模板:

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 Parent220 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

但是期望的输出没有来,你能在这里建议吗?

4

1 回答 1

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)

我建议至少在您的代码中添加注释,因为即使您是将来维护它的人,它似乎也过于复杂并且很难掌握它在做什么。您可能会忘记它是如何工作的,并且需要花一些时间(就像我所做的那样)弄清楚发生了什么。

于 2012-12-20T17:09:18.903 回答