2012-12-20 83 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

我無法分辨您的回覆與我發佈的任何內容有何關聯。你讀過我的回答了嗎? –