2011-03-30 79 views
0

快速的問題,我已經在我的宏代碼中將所有這些靜態設置Public Type變量。這些應該表示INI文件的值。我希望它的方式是代碼是全部動態的,基於INI文件中的內容。所以我不需要手動更新INI文件和後面的代碼。VBA - 動態創建公共類型變量?

這是代碼的出現,它是現在的方式。這是它自己的模塊內部:

Public Type Fields 
    Firstname as String 
    Lastname as String 
    Username as String 
End Type 

我想閱讀使用ReadIniSection INI文件的整個部分,但它好像這是不可能的Public Type內做到這一點。我對麼?莫名其妙地解決這個問題有可能嗎?

回答

1

使用Scripting.Dictionary對象(設置對Scripting.Runtime庫的引用)。

要存儲:

oDict.Add keyName, keyValue 

回讀:

oDict(keyName) 

這是假設你有一個值唯一鍵的名稱。

http://msdn.microsoft.com/en-us/library/x4k5wbx4%28v=vs.85%29.aspx

+0

這聽起來有希望! :)你有沒有一個我將如何做到這一點的例子。像一個小的代碼片段或什麼的?編輯:你的意思是使用腳本字典,而不是公共類型? – 2011-03-30 06:25:36

+0

我認爲這是你應該在代碼塊前後使用的:)特別是在註釋中。但在答案中,您可以選擇一個代碼片段,並使用編輯器中的工具欄來格式化整個事物。 – 2011-03-30 08:03:29

+0

未安裝Cripting.RunTime庫的計算機有什麼可能?我可能不得不使用VBA集合。如果這甚至是可能的。 – 2011-03-30 09:02:50

0

也可以(但也許不是最好)將代碼添加到一個模塊編程。由於VBA不支持反射,因此這是語言中唯一的「動態」編碼。這在捏中很有用。

請參見下面的代碼片段。 addCode sub採用標準模塊的名稱,Type的名稱以及包含字段定義的數組。

它首先刪除現有的Type具有相同的名稱,然後添加新的類型定義英寸

Sub TestAdd() 
    Dim FieldArray() 

    FieldArray = Array(_ 
    "Firstname As String", _ 
    "Lastname As String", _ 
    "Username As String" _ 
    ) 


    AddCode "Module2", "Fields", FieldArray 
End Sub 

Sub AddCode(ModuleName As String, TypeName As String, FieldArray()) 
    Dim StartLine As Long, EndLine As Long, StartColumn As Long, EndColumn As Long, _ 
     CodeToInsert As String 

    StartLine = 1: StartColumn = -1 
    EndLine = -1: EndColumn = -1 

    'Find the old type definition and remove it. 
    With Application.VBE.ActiveVBProject.VBComponents(ModuleName).CodeModule 

     'Search for the start of the type definition 
     If .Find("Public Type " & TypeName, StartLine, StartColumn, EndLine, EndColumn, True) Then 
      EndLine = EndLine + 1: StartColumn = -1: EndLine = -1: EndColumn = -1 

      'Found the start, now find the end of the type definition 
      If .Find("End Type", EndLine, StartColumn, EndLine, EndColumn, True) Then 
       .DeleteLines StartLine, (EndLine - StartLine) + 1 
      End If 
     End If 

     CodeToInsert = _ 
      "Public Type " & TypeName & vbCrLf & _ 
      Join(FieldArray, vbCrLf) & vbCrLf & _ 
      "End Type" 

     .InsertLines StartLine, CodeToInsert 
    End With 

End Sub