2012-12-20 52 views
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,它们是孩子,但他们的父母没有他们自己的实际情况,因此66,220不应该输出结果为66 Parent220 Parent没有这样的输出应该在那里。

现在我正在寻找一个代码,它会告诉哪个是父代,哪个是child-means在另一个工作表中标记它们。同时我想列出所有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 

但是期望的输出不会到来,您能否建议这里?

回答

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)

我建议至少添加注释你的代码,因为即使你是将来保持它的人,它看起来过于复杂,很难理解它正在做什么。你可能会忘记它是如何工作的,需要花一段时间(就像我一样)弄清楚发生了什么。

+0

请参阅我的代码开发的更新说明。请帮助我,或者让我知道你是否也有同样的困惑。 –

+0

子列表在列中,我没有在描述中显示它们! –

+0

我无法分辨您的回复与我发布的任何内容有何关联。你读过我的回答了吗? –