2017-10-22 19 views
0

3番目のアプリケーションからパラメータ名と値を取得するためにCOMインターフェイスを使用しています。Forループを1つのプロセスに使用し、ループをExcel for VBAの同じプロセスで呼び出す

私はこのVBAスクリプトを使用して、モデルのスタンドアロンパラメータファイル名を取得しています。このグループ内の値、パラメータグループ名、パラメータ情報、およびパラメータグループ情報は、同じプロセスを終了します。

また、メインモデルにサブモデルが付属しています。私はそれらのために同じプロセスを行っています。

私はループの各レベルに異なる変数を使用していますが、プロセスはすべてのレベルで同じですので、簡単な方法はありません。第2レベルと第3レベルのパラメータグループとサブモデルに変数を使用しないでください。私の機能 Model Scheme

トポロジあなたが構造のトポロジーを見ればあなたは私が何を意味するかを理解することができます。私は同じプロセスのために同じ機能を使用していますが、サブレベルのパラメータグループには問題があります。私はそれらのために余分な変数を使用しています。

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 

ために同じアプローチを使用している私は私がサブレベルのパラメータグループとパラメータを定義するために、変数の上に使用しなくても機能やループのために呼び出すことができると思います。

私のトポロジーにどのように同じプロセスをさせることができますか教えてください。

コードは次のとおりです。クラスの知識がなくても

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の

+1

コードをインデントして、処理前と処理後の小さなサンプルデータを提供してください。また、あなたは完全なコンテキストを提供していません - メインコードの最後に 'End Sub'がありません。そしてSetup_Module.SetupSimpack(Mdl)は不明です - コードを実行する必要があります(https:// stackoverflow .com/help/mcve)改善を提供できるようにする –

+0

@paulbicaあなたはBicaさんです。私のせいです。私は最後の行を忘れてしまいました。完全なコードを実行するには、Simpack-MBSプログラムが必要です。だから私はメインセクションを挿入しませんでした。私の主な問題は、あなたがトポロジーイメージを見て、私は3つの機能を持っている場合です。 1つはパラメータ・リストを表示し、もう1つはパラメータ・グループをリストし、もう1つはこのパラメータ・グループの下にリストされているパラメータをリストするためのcall parameter functionです。また、パラメータグループにはいくつかのパラメータグループ(カスケード接続)があり、また最後のグループにはグループとパラメータがあり、終了するまで継続します。私はExcelシートにこのパラメータ名をエクスポートしています。 – Hakan

+0

@paulbicaと3番目の関数(サブモデル関数)はそれほど重要ではありません。もし私たちがパラメータグループとパラメータに対して行うことができれば、私は同じアプローチを3番目のものに適用できます。 – Hakan

答えて

0

は/あなたが持っているオブジェクトの、唯一の例が与えられます。あなたのケースでは、2つの再帰的なSubが必要になると思います。モデルのトップ1を選択し、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 
関連する問題