错误:对象必需:字典对象的'[undefined]'

时间:2012-12-20 15:10:10

标签: excel-vba vbscript vba excel

要求:

请阅读以下模板:

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

但所需的输出没有来,你能在这里建议吗?

1 个答案:

答案 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)

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