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) です。

更新child である 101 および 102 と言うエントリがいくつかある可能性がありますが、それらの親には独自の etires がないため、66,220 は出力結果に含まれるべきではなく、そのような出力は存在66 Parent220 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

しかし、望ましい出力が来ていません。ここで提案できますか?

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 に答える