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

現在、PID!= LPID の場合、その PID は CPID (子プロセス ID) として定義され、それ以外の場合は PPID (親プロセス ID) です。

現在、どちらが親でどちらが子であるかを示すコードを探しています。これは、別のシートでそれらをマークすることを意味します。同時に、同じ行に PPID を含むすべての CPID をリストアップしたいと思います。PPID に子プロセスがある場合彼ら自身。出力は以下のようになります

PID   Type Of Process?    Child List
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 時間近くかかっています。そのため、私のプロセスよりも高速なプロセスが必要です。

ここで VBscript を使用して助けてもらえますか?

コード 1:

  Set objExcel1 = CreateObject("Excel.Application")'Object for W2W Report Dump


  strPathExcel1 = "D:\VA\CopyofGEWingtoWing_latest_dump_21112012.xls"
  objExcel1.Workbooks.open strPathExcel1

  Set objSheet1 = objExcel1.ActiveWorkbook.Worksheets(2)
  Set objSheet2 = objExcel1.ActiveWorkbook.Worksheets(1)

    IntRow1=1
 Do While objSheet1.Cells(IntRow1, 1).Value <> ""

    IntRow2=4
    IntChildListColumn=3

    If objSheet1.Cells(IntRow1,2).Value="Parent" Then

        Do While objSheet2.Cells(IntRow2, 1).Value <> ""

             If objSheet2.Cells(IntRow2,11).Value=objSheet1.Cells(IntRow1,1).Value And objSheet2.Cells(IntRow2,11).Value <> objSheet2.Cells(IntRow2,1).Value Then

                 objSheet1.Cells(IntRow1,IntChildListColumn).Value=objSheet2.Cells(IntRow2,1).Value
                 IntChildListColumn=IntChildListColumn+1

             End If

      IntRow2=IntRow2+1

      Loop

   End If

 IntRow1=IntRow1+1

Loop

コード 2:

 Flag=0
 IntColTemp=1
 IntRowTemp=3

 Set objExcel1 = CreateObject("Excel.Application")'Object for Condition Dump


 strPathExcel1 = "D:\VA\CopyofGEWingtoWing_latest_dump_21112012.xls"
 objExcel1.Workbooks.open strPathExcel1

 Set objSheet1 = objExcel1.ActiveWorkbook.Worksheets(1)
 Set objSheet2 = objExcel1.ActiveWorkbook.Worksheets(2)

 IntRow1=4
 IntRow2=1

Do While objSheet1.Cells(IntRow1, 1).Value <> ""

  objSheet2.Cells(IntRow2, 1).Value = objSheet1.Cells(IntRow1, 1).Value


   IntColTemp=1
   Flag=0
  'This will travarse to the Parent Business Process ID column horizantally in the excel.
  Do While Flag=0

  If objSheet1.Cells(IntRowTemp,IntColTemp).Value="Parent Business Process ID" Then

      Flag=1       

  End If

      IntColTemp=IntColTemp+1


Loop
      IntColTemp=IntColTemp-1
      'MsgBox(IntColTemp)

  Strcmp1=trim(objSheet1.Cells(IntRow1, 1).Value)
  Strcmp2=trim(objSheet1.Cells(IntRow1,IntColTemp).Value)

  If Strcmp1=Strcmp2 Then

      objSheet2.Cells(IntRow2, 2).Value="Parent" 

  Else

      objSheet2.Cells(IntRow2, 2).Value="child"

  End If


   IntRow1=IntRow1+1
   IntRow2=IntRow2+1

  Loop
4

1 に答える 1

1

いくつかの提案された改善:

本当に画面を開いている場合は、Excelを開いてApplication.ScreenUpdating = Falseください:コードの最初(およびTrue最後)に設定します

Application.Calculationを手動に設定します。コードの開始時: Application.Calculation = xlCalculationManualそして最後に自動に戻る:Application.Calculation = xlCalculationAutomatic。これ自体が自動ではない場合は、最初に元の設定をローカル変数に保存し、最後にその値を復元することもできます。

VBAを使用して、パフォーマンスが向上しているかどうかを確認します(VBAが有効なオプションである場合)

Value2の代わりに使用するとValue、このプロパティの参照が速くなります。

特に範囲内の特定の値を探している場合は、ループの数を減らしてください。または、Excelのルックアップおよび参照関数(VLookupなど)を使用することもできます。これらの関数は、より効率的かつ高速に実行される可能性があります。

于 2012-12-12T16:09:24.957 に答える