简体   繁体   English

如何将两个脚本合而为一?

[英]How can I make two scripts into one?

Please read the following template: 请阅读以下模板:

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
201      open       202
205      open        500

Now when PID!= LPID, that PID is defined as CPID(Child Process ID),Otherwise it is a PPID(Parent process ID) 现在,当PID!= LPID时,该PID被定义为CPID(子进程ID),否则为PPID(父进程ID)

Now I am looking for a code which will tell which is parent and Which is child- means marking them in another sheet.At the Same time i want to list down all CPID,with PPID in the same row,If any PPID has child Processes themselves. 现在我正在寻找一个代码,该代码将告诉哪个是父级,哪个是子级,这意味着将它们标记在另一张工作表中。同时,我想列出所有CPID,在同一行中有PPID,如果任何PPID有子进程他们自己。 Output would be look like below 输出如下所示

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

I have written a code using VBScript,but with the actual sheet it is too slow. 我已经使用VBScript编写了代码,但是用实际的表格来说太慢了。 For 2500 data it is taking close to 1 hour.So I Want a more faster process than my one. 对于2500个数据来说,它需要将近1个小时。因此,我想要一个比我更快的过程。

Could you help here using VBscript? 您能在这里使用VBscript帮助吗?

Code1: 代码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

Code2: 代码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

EDIT see the two ID 201 and 205 has the child-parent relationship.But the child id will then needs to present in the output column but parent 202 and 500 should not come to the output list, as there is no enetry in the main table 202 close/open 202 and 500 open/close 500 编辑看到两个ID 201和205具有子-父关系,但是子ID将需要出现在输出列中,但父202和500不应出现在输出列表中,因为主表中没有烯202 close/open 202500 open/close 500

Two ideas/strategies: 两种想法/策略:

  1. Load the Range into an array instead of accessing the cells ((c) @DanielCook) 将Range加载到数组中,而不是访问单元格((c)@DanielCook)
  2. Use a dictionary if you have to process data about (a set of) elements. 如果必须处理有关(一组)元素的数据,请使用字典。

In code: 在代码中:

Option Explicit

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 oFS   : Set oFS  = CreateObject("Scripting.FileSystemObject")
Dim oXls  : Set oXls = CreateObject("Excel.Application")
Dim oWb   : Set oWb  = oXls.Workbooks.Open(oFs.GetAbsolutePathName(".\00.xlsx"))
Dim aData : aData    = oWb.Worksheets(1).Range("$A2:$C10")
Dim dicP  : Set dicP = CreateObject("Scripting.Dictionary")

Dim nRow
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, 3) Then
       dicP(aData(nRow, 1)).m_sRel = "Parent"
    Else
       dicP(aData(nRow, 3)).m_dicC(aData(nRow, 1)) = 0
    End If
Next

Dim nP
For Each nP In dicP.Keys()
    WScript.Echo nP, dicP(nP).show()
Next

oWb.Close
oXls.Quit

output: 输出:

10 Child
11 Child
31 Parent 54 20
25 Parent 10 11
54 Child
17 Parent
20 Child
88 Child
77 Parent 88

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM