对一个进程使用 For 循环并在 For 循环中为同一进程调用该循环 Excel VBA
Using For Loop for One Process and Calling that Loop for Same Process in For Loop Excel VBA
我正在使用 COM 接口从第 3 部分应用程序获取参数名称和值。
我正在使用这个 VBA 脚本来获取模型的独立参数文件名和值、参数组名称和参数组信息以及该组中的参数组信息,无论其结束如何执行相同的过程。
还有子模型附加到主模型,我正在为它们做同样的过程。
我为循环的每个级别使用了不同的变量,但是每个级别的过程都是相同的,所以我想学习有没有简单的方法来获得它?不对第 2 级和第 3 级参数组和子模型使用变量。
我的函数拓扑
如果您查看结构的拓扑结构,您就会明白我的意思。我对相同的过程使用相同的函数,但我对子级参数组有困难,我正在为它们使用额外的变量,例如;
Dim j1 As Integer ' Parameter Group of Parameter Group Item / Count
Dim j2 As Integer ' Parameter Group of Parameter Group of Parameter Group Item / Count
Dim ParameterGroupsX1 As Object '2nd Level Parameter Groups Objects
Dim ParameterGroupX1 As Object '2nd Level Parameter Group
Dim nParameterGroupX1 As Integer 'Number of 2nd Level Parameter Group Objects
Dim ParameterGroupsX2 As Object '3rd Level Parameter Groups Objects
Dim ParameterGroupX2 As Object '3rd Level Parameter Group
Dim nParameterGroupX2 As Integer 'Number of 3rd Level Parameter Group Objects
而且我对子模型使用相同的方法
Dim s1 As Integer ' Sub Model 1st Level
Dim s2 As Integer ' Sub Model 2nd Level
Dim SubstrsX1 As Object ' 2nd Level Substructures Object
Dim SubstrX1 As Object ' 2nd Level Substructure
Dim nSubstrX1 As Integer ' Number of 2nd Level Substructure Objects
Dim SubstrsX2 As Object ' 3rd Level Substructures Object
Dim SubstrX2 As Object ' 3rd Level Substructure
Dim nSubstrX2 As Integer ' Number of 3rd Level Substructure Objects
我想我可以在不使用上述变量定义子级参数组和参数的情况下调用函数或 For 循环。
你能告诉我如何为我的拓扑做同样的过程吗?
代码如下;
Dim Target_Sheet As Worksheet
Dim Main_Sheet As Worksheet
Dim ParameterGroups As Object ' 1st Level Parameter Groups Object
Dim ParameterGroup As Object ' Single Parameter Group
Dim nParameterGroup As Integer ' Number of Parameter Group Objects
Dim Parameters As Object ' 1st Level Parameters Object
Dim Parameter As Object ' 1st Level Parameter
Dim nParameter As Integer ' Number of Parameters Objects
Dim ParameterGroupsX1 As Object '2nd Level Parameter Groups Objects
Dim ParameterGroupX1 As Object '2nd Level Parameter Group
Dim nParameterGroupX1 As Integer 'Number of 2nd Level Parameter Group Objects
Dim ParameterGroupsX2 As Object '3rd Level Parameter Groups Objects
Dim ParameterGroupX2 As Object '3rd Level Parameter Group
Dim nParameterGroupX2 As Integer 'Number of 3rd Level Parameter Group Objects
Dim Substrs As Object ' 1st Level Substructures Object
Dim Substr As Object ' 1st Level Substructure
Dim nSubstr As Integer ' Number of 1st Level Substructure Objects
Dim SubstrsX1 As Object ' 2nd Level Substructures Object
Dim SubstrX1 As Object ' 2nd Level Substructure
Dim nSubstrX1 As Integer ' Number of 2nd Level Substructure Objects
Dim SubstrsX2 As Object ' 3rd Level Substructures Object
Dim SubstrX2 As Object ' 3rd Level Substructure
Dim nSubstrX2 As Integer ' Number of 3rd Level Substructure Objects
Dim i As Integer ' Parameter Item/Count
Dim j As Integer ' Parameter Group Item / Count
Dim j1 As Integer ' Parameter Group of Parameter Group Item / Count
Dim j2 As Integer ' Parameter Group of Parameter Group of Parameter Group Item / Count
Dim s As Integer ' Sub Model Main Level
Dim s1 As Integer ' Sub Model 1st Level
Dim s2 As Integer ' Sub Model 2nd Level
Dim cLine As Long
Option Explicit
Sub ReadParameterSimpack() ' Main function get parameter information
Set Target_Sheet = ThisWorkbook.Worksheets("Parameters") ' Parameter's page which i list the names and their values
Call Setup_Module.SetupSimpack ' This is the module where i get the model information from third part Application
cLine = 0
Set Parameters = Mdl.getParameterList(False) ' Gettting Parameters List
Call ParameterRead(Parameters, cLine) ' Calls the Parameter Read Function
Set ParameterGroups = Mdl.getParameterGroupList(False) ' Getting the Parameter Group List
Call ParameterGroupRead(ParameterGroups, cLine) ' Calls the Parameter Group Read Function
Set Substrs = Mdl.getSubstrList(False) ' Getting the Sub-Model List
Call SubstructureRead(Substrs, cLine) ' Calls the Model's submodel list
End Sub
Sub ParameterRead(Parameters, cLine) ' This is the function of reading Parameters
nParameter = Parameters.Count ' Number of Parameters
For i = 0 To nParameter - 1
Set Parameter = Parameters.Item(i) ' Getting parameter from the List of Parameter
Target_Sheet.Cells(cLine + 1, 1).Value = Parameter.FullName ' Writes parameter name to Excel Sheet
cLine = cLine + 1
Next i
End Sub
Sub ParameterGroupRead(ParameterGroups, cLine) ' This is the function of reading Parameter Groups
nParameterGroup = ParameterGroups.Count ' This is the number of Parameter Groups
For j = 0 To nParameterGroup - 1
Set ParameterGroup = ParameterGroups.Item(j) 'Getting Parameter Group from Parameter Groups List
Target_Sheet.Cells(cLine + 1, 1).Value = ParameterGroup.FullName ' Writes parameter group name to Excel Sheet
cLine = cLine + 1
Set Parameters = ParameterGroup.getParameterList(False) 'This is getting Parameters listed below the Parameter Group
Call ParameterRead(Parameters, cLine) ' Calls the parameter read function to get parameters which listed under Parameter groups
cLine = cLine + 1
Set ParameterGroupsX1 = ParameterGroup.getParameterGroupList(False) ' Sub-Level Parameter Group
nParameterGroupX1 = ParameterGroupsX1.Count ' Number of Sub-Level Parameter Group
For j1 = 0 To nParameterGroupX1 - 1
Set ParameterGroupX1 = ParameterGroupsX1.Item(j1)
Target_Sheet.Cells(cLine + 1, 1).Value = ParameterGroupX1.FullName
Set Parameters = ParameterGroupX1.getParameterList(False) ' Getting the Parameters of Parameter Groups
Call ParameterRead(Parameters, cLine) ' Call Parameter Read Function
cLine = cLine + 1
Set ParameterGroupsX2 = ParameterGroupX1.getParameterGroupList(False) 'Sub SubLevel of Parameter Group
nParameterGroupX2 = ParameterGroupsX2.Count
For j2 = 0 To nParameterGroupX2 - 1
Set ParameterGroupX2 = ParameterGroupsX2.Item(j2)
Target_Sheet.Cells(cLine + 1, 1).Value = ParameterGroupX2.FullName
cLine = cLine + 1
Set Parameters = ParameterGroupX2.getParameterList(False)
Call ParameterRead(Parameters, cLine)
cLine = cLine + 1
Next j2
Next j1
Next j
End Sub
Sub SubstructureRead(Substrs, cLine)
nSubstr = Substrs.Count
For s = 0 To nSubstr - 1
Set Substr = Substrs.Item(s)
Target_Sheet.Cells(cLine + 1, 1).Value = Substr.FullName
cLine = cLine + 1
Set Parameters = Substr.getParameterList(False)
Call ParameterRead(Parameters, cLine)
Set ParameterGroups = Substr.getParameterGroupList(False)
Call ParameterGroupRead(ParameterGroups, cLine)
Set SubstrsX1 = Substr.getSubstrList(False)
nSubstrX1 = SubstrsX1.Count
For s1 = 0 To nSubstrX1 - 1
Set SubstrX1 = SubstrsX1.Item(s1)
Target_Sheet.Cells(cLine + 1, 1).Value = SubstrX1.FullName
cLine = cLine + 1
Set Parameters = SubstrX1.getParameterList(False)
Call ParameterRead(Parameters, cLine)
Set ParameterGroups = SubstrX1.getParameterGroupList(False)
Call ParameterGroupRead(ParameterGroups, cLine)
Set SubstrsX2 = Substr.getSubstrList(False)
nSubstrX2 = SubstrsX2.Count
For s2 = 0 To nSubstrX2 - 1
Set SubstrX2 = SubstrsX2.Item(s2)
Target_Sheet.Cells(cLine + 1, 1).Value = SubstrX2.FullName
cLine = cLine + 1
Set Parameters = SubstrX2.getParameterList(False)
Call ParameterRead(Parameters, cLine)
Set ParameterGroups = SubstrX2.getParameterGroupList(False)
Call ParameterGroupRead(ParameterGroups, cLine)
Next s2
Next s1
Next s
结束子
由于不了解您所拥有的Class/Object,只能给出示例。我认为在您的情况下,您将需要 2 个递归 Sub。 Top 1 for Model,然后递归ParameterGroup。
Option Explicit
Private oFSO As Object
Sub ListFilesFromRootFolder()
' FileSystemObject: https://msdn.microsoft.com/en-us/library/6tkce7xa(v=vs.84).aspx
Set oFSO = CreateObject("Scripting.FileSystemObject")
' e.g. List all files and subfolders from User's Temp folder
ListFilesAndFolders oFSO.GetFolder(Environ("TMP"))
Set oFSO = Nothing
End Sub
Private Sub ListFilesAndFolders(oFDR As Object)
Dim oFile As Object, oSubFDR As Object
' Prints current Folder path
Debug.Print oFDR.Path
' List the files in this folder
For Each oFile In oFDR.Files
Debug.Print oFile.Name
Next
' Recurse SubFolders
For Each oSubFDR In oFDR.SubFolders
ListFilesAndFolders oSubFDR
Next
End Sub
我正在使用 COM 接口从第 3 部分应用程序获取参数名称和值。
我正在使用这个 VBA 脚本来获取模型的独立参数文件名和值、参数组名称和参数组信息以及该组中的参数组信息,无论其结束如何执行相同的过程。
还有子模型附加到主模型,我正在为它们做同样的过程。
我为循环的每个级别使用了不同的变量,但是每个级别的过程都是相同的,所以我想学习有没有简单的方法来获得它?不对第 2 级和第 3 级参数组和子模型使用变量。
我的函数拓扑
如果您查看结构的拓扑结构,您就会明白我的意思。我对相同的过程使用相同的函数,但我对子级参数组有困难,我正在为它们使用额外的变量,例如;
Dim j1 As Integer ' Parameter Group of Parameter Group Item / Count
Dim j2 As Integer ' Parameter Group of Parameter Group of Parameter Group Item / Count
Dim ParameterGroupsX1 As Object '2nd Level Parameter Groups Objects
Dim ParameterGroupX1 As Object '2nd Level Parameter Group
Dim nParameterGroupX1 As Integer 'Number of 2nd Level Parameter Group Objects
Dim ParameterGroupsX2 As Object '3rd Level Parameter Groups Objects
Dim ParameterGroupX2 As Object '3rd Level Parameter Group
Dim nParameterGroupX2 As Integer 'Number of 3rd Level Parameter Group Objects
而且我对子模型使用相同的方法
Dim s1 As Integer ' Sub Model 1st Level
Dim s2 As Integer ' Sub Model 2nd Level
Dim SubstrsX1 As Object ' 2nd Level Substructures Object
Dim SubstrX1 As Object ' 2nd Level Substructure
Dim nSubstrX1 As Integer ' Number of 2nd Level Substructure Objects
Dim SubstrsX2 As Object ' 3rd Level Substructures Object
Dim SubstrX2 As Object ' 3rd Level Substructure
Dim nSubstrX2 As Integer ' Number of 3rd Level Substructure Objects
我想我可以在不使用上述变量定义子级参数组和参数的情况下调用函数或 For 循环。
你能告诉我如何为我的拓扑做同样的过程吗?
代码如下;
Dim Target_Sheet As Worksheet
Dim Main_Sheet As Worksheet
Dim ParameterGroups As Object ' 1st Level Parameter Groups Object
Dim ParameterGroup As Object ' Single Parameter Group
Dim nParameterGroup As Integer ' Number of Parameter Group Objects
Dim Parameters As Object ' 1st Level Parameters Object
Dim Parameter As Object ' 1st Level Parameter
Dim nParameter As Integer ' Number of Parameters Objects
Dim ParameterGroupsX1 As Object '2nd Level Parameter Groups Objects
Dim ParameterGroupX1 As Object '2nd Level Parameter Group
Dim nParameterGroupX1 As Integer 'Number of 2nd Level Parameter Group Objects
Dim ParameterGroupsX2 As Object '3rd Level Parameter Groups Objects
Dim ParameterGroupX2 As Object '3rd Level Parameter Group
Dim nParameterGroupX2 As Integer 'Number of 3rd Level Parameter Group Objects
Dim Substrs As Object ' 1st Level Substructures Object
Dim Substr As Object ' 1st Level Substructure
Dim nSubstr As Integer ' Number of 1st Level Substructure Objects
Dim SubstrsX1 As Object ' 2nd Level Substructures Object
Dim SubstrX1 As Object ' 2nd Level Substructure
Dim nSubstrX1 As Integer ' Number of 2nd Level Substructure Objects
Dim SubstrsX2 As Object ' 3rd Level Substructures Object
Dim SubstrX2 As Object ' 3rd Level Substructure
Dim nSubstrX2 As Integer ' Number of 3rd Level Substructure Objects
Dim i As Integer ' Parameter Item/Count
Dim j As Integer ' Parameter Group Item / Count
Dim j1 As Integer ' Parameter Group of Parameter Group Item / Count
Dim j2 As Integer ' Parameter Group of Parameter Group of Parameter Group Item / Count
Dim s As Integer ' Sub Model Main Level
Dim s1 As Integer ' Sub Model 1st Level
Dim s2 As Integer ' Sub Model 2nd Level
Dim cLine As Long
Option Explicit
Sub ReadParameterSimpack() ' Main function get parameter information
Set Target_Sheet = ThisWorkbook.Worksheets("Parameters") ' Parameter's page which i list the names and their values
Call Setup_Module.SetupSimpack ' This is the module where i get the model information from third part Application
cLine = 0
Set Parameters = Mdl.getParameterList(False) ' Gettting Parameters List
Call ParameterRead(Parameters, cLine) ' Calls the Parameter Read Function
Set ParameterGroups = Mdl.getParameterGroupList(False) ' Getting the Parameter Group List
Call ParameterGroupRead(ParameterGroups, cLine) ' Calls the Parameter Group Read Function
Set Substrs = Mdl.getSubstrList(False) ' Getting the Sub-Model List
Call SubstructureRead(Substrs, cLine) ' Calls the Model's submodel list
End Sub
Sub ParameterRead(Parameters, cLine) ' This is the function of reading Parameters
nParameter = Parameters.Count ' Number of Parameters
For i = 0 To nParameter - 1
Set Parameter = Parameters.Item(i) ' Getting parameter from the List of Parameter
Target_Sheet.Cells(cLine + 1, 1).Value = Parameter.FullName ' Writes parameter name to Excel Sheet
cLine = cLine + 1
Next i
End Sub
Sub ParameterGroupRead(ParameterGroups, cLine) ' This is the function of reading Parameter Groups
nParameterGroup = ParameterGroups.Count ' This is the number of Parameter Groups
For j = 0 To nParameterGroup - 1
Set ParameterGroup = ParameterGroups.Item(j) 'Getting Parameter Group from Parameter Groups List
Target_Sheet.Cells(cLine + 1, 1).Value = ParameterGroup.FullName ' Writes parameter group name to Excel Sheet
cLine = cLine + 1
Set Parameters = ParameterGroup.getParameterList(False) 'This is getting Parameters listed below the Parameter Group
Call ParameterRead(Parameters, cLine) ' Calls the parameter read function to get parameters which listed under Parameter groups
cLine = cLine + 1
Set ParameterGroupsX1 = ParameterGroup.getParameterGroupList(False) ' Sub-Level Parameter Group
nParameterGroupX1 = ParameterGroupsX1.Count ' Number of Sub-Level Parameter Group
For j1 = 0 To nParameterGroupX1 - 1
Set ParameterGroupX1 = ParameterGroupsX1.Item(j1)
Target_Sheet.Cells(cLine + 1, 1).Value = ParameterGroupX1.FullName
Set Parameters = ParameterGroupX1.getParameterList(False) ' Getting the Parameters of Parameter Groups
Call ParameterRead(Parameters, cLine) ' Call Parameter Read Function
cLine = cLine + 1
Set ParameterGroupsX2 = ParameterGroupX1.getParameterGroupList(False) 'Sub SubLevel of Parameter Group
nParameterGroupX2 = ParameterGroupsX2.Count
For j2 = 0 To nParameterGroupX2 - 1
Set ParameterGroupX2 = ParameterGroupsX2.Item(j2)
Target_Sheet.Cells(cLine + 1, 1).Value = ParameterGroupX2.FullName
cLine = cLine + 1
Set Parameters = ParameterGroupX2.getParameterList(False)
Call ParameterRead(Parameters, cLine)
cLine = cLine + 1
Next j2
Next j1
Next j
End Sub
Sub SubstructureRead(Substrs, cLine)
nSubstr = Substrs.Count
For s = 0 To nSubstr - 1
Set Substr = Substrs.Item(s)
Target_Sheet.Cells(cLine + 1, 1).Value = Substr.FullName
cLine = cLine + 1
Set Parameters = Substr.getParameterList(False)
Call ParameterRead(Parameters, cLine)
Set ParameterGroups = Substr.getParameterGroupList(False)
Call ParameterGroupRead(ParameterGroups, cLine)
Set SubstrsX1 = Substr.getSubstrList(False)
nSubstrX1 = SubstrsX1.Count
For s1 = 0 To nSubstrX1 - 1
Set SubstrX1 = SubstrsX1.Item(s1)
Target_Sheet.Cells(cLine + 1, 1).Value = SubstrX1.FullName
cLine = cLine + 1
Set Parameters = SubstrX1.getParameterList(False)
Call ParameterRead(Parameters, cLine)
Set ParameterGroups = SubstrX1.getParameterGroupList(False)
Call ParameterGroupRead(ParameterGroups, cLine)
Set SubstrsX2 = Substr.getSubstrList(False)
nSubstrX2 = SubstrsX2.Count
For s2 = 0 To nSubstrX2 - 1
Set SubstrX2 = SubstrsX2.Item(s2)
Target_Sheet.Cells(cLine + 1, 1).Value = SubstrX2.FullName
cLine = cLine + 1
Set Parameters = SubstrX2.getParameterList(False)
Call ParameterRead(Parameters, cLine)
Set ParameterGroups = SubstrX2.getParameterGroupList(False)
Call ParameterGroupRead(ParameterGroups, cLine)
Next s2
Next s1
Next s
结束子
由于不了解您所拥有的Class/Object,只能给出示例。我认为在您的情况下,您将需要 2 个递归 Sub。 Top 1 for Model,然后递归ParameterGroup。
Option Explicit
Private oFSO As Object
Sub ListFilesFromRootFolder()
' FileSystemObject: https://msdn.microsoft.com/en-us/library/6tkce7xa(v=vs.84).aspx
Set oFSO = CreateObject("Scripting.FileSystemObject")
' e.g. List all files and subfolders from User's Temp folder
ListFilesAndFolders oFSO.GetFolder(Environ("TMP"))
Set oFSO = Nothing
End Sub
Private Sub ListFilesAndFolders(oFDR As Object)
Dim oFile As Object, oSubFDR As Object
' Prints current Folder path
Debug.Print oFDR.Path
' List the files in this folder
For Each oFile In oFDR.Files
Debug.Print oFile.Name
Next
' Recurse SubFolders
For Each oSubFDR In oFDR.SubFolders
ListFilesAndFolders oSubFDR
Next
End Sub