2012-12-20 2 views
0

요구 사항 :! PID는 = LPID는, PID이라고하면 이제오류 : 필요한 개체 : '[정의] 사전 개체에 대한

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 

:

다음 템플릿을 읽어 보시기 바랍니다 (부모 프로세스 ID)

업데이트 일부 항목은 101과 102라고 할 수 있습니다.이 항목은 하위 항목 인 CPID (하위 프로세스 ID)로 정의됩니다. , 그러나 그들의 부모는 그들 자신의 etires을 가지고 있지 않다. 따라서, 출력은 66 Parent이고 220 Parent은 출력되지 않아야한다.

이제 부모가 무엇인지 자녀에게 알려주는 코드를 찾고 있는데, 이는 다른 시트에서 그들을 표시하는 것을 의미합니다. 같은 행에 PPID가있는 모든 CPID를 나열하고 싶을 때도 있습니다. 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

귀하의 응답이 내가 게시 한 모든 내용과 어떻게 관련이 있는지 알 수 없습니다. 내 대답을 읽었 니? –

관련 문제