对一个进程使用For循环,并在For循环Excel VBA中对同一进程调用该循环

对一个进程使用For循环,并在For循环Excel VBA中对同一进程调用该循环,vba,excel,com,Vba,Excel,Com,我使用COM接口从第三方应用程序获取参数名和值 我使用这个VBA脚本来获取模型的独立参数文件名、值、参数组名和参数组信息以及该组中的参数组信息,无论其结束在哪里,都执行相同的过程 还有一些附加到主模型的子模型,我正在对它们进行同样的处理 我对循环的每个级别使用不同的变量,但是每个级别的过程都是相同的,所以我想了解一下,有没有简单的方法来获得它?不为第二级和第三级参数组和子模型使用变量 我的函数的拓扑 如果你看一下结构的拓扑结构,你就能理解我的意思。我在同一个过程中使用相同的函数,但是对于子级别

我使用COM接口从第三方应用程序获取参数名和值

我使用这个VBA脚本来获取模型的独立参数文件名、值、参数组名和参数组信息以及该组中的参数组信息,无论其结束在哪里,都执行相同的过程

还有一些附加到主模型的子模型,我正在对它们进行同样的处理

我对循环的每个级别使用不同的变量,但是每个级别的过程都是相同的,所以我想了解一下,有没有简单的方法来获得它?不为第二级和第三级参数组和子模型使用变量

我的函数的拓扑

如果你看一下结构的拓扑结构,你就能理解我的意思。我在同一个过程中使用相同的函数,但是对于子级别的参数组,我有困难,我在为它们使用额外的变量,比如

    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

End Sub

在不知道您拥有的类/对象的情况下,只能给出示例。我认为在您的情况下,您将需要2个递归sub。模型的顶部1,然后递归参数组

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

请缩进您的代码,并提供处理前后的小样本数据。此外,您没有提供完整的上下文-主代码末尾缺少一个End Sub,并且Setup_Module.SetupSimpack Mdl未知-为了能够提供improvements@paulbica你说得对,比卡先生,是我的错,我忘了抄最后一行。您需要一个Simpack-MBS程序来运行完整的代码。所以我没有插入主要部分。我的主要问题是如果你看拓扑图,我有3个函数。一个是列出参数,另一个是列出参数组,并调用parameter函数列出此参数组下列出的参数。参数组中有一些参数组是级联的,最后一个参数组中有组和参数,它们的连续性在任何地方结束。我正在将此参数名称导出到Excel工作表。@paulbica和第三个函数子模型函数并不重要,如果我们可以对参数组和参数执行此操作,我可以对第三个参数应用相同的方法。我不确定所有内容如何配合,但看起来您可以创建自己的类,并根据需要生成/重用对象,可能使用数组或字典而不详细阅读所有代码,听起来您需要编写递归子/函数。递归允许您对任意级别执行相同的过程,只要可以分配内存即可。基本上,您需要一个递归的泛型子类,以及另一个子类来启动它。将其视为列出给定根文件夹位置的所有文件和子文件夹。