VBA - 动态创建公共类型变量?

时间:2011-03-30 05:09:01

标签: vba types constructor word-vba

快速提问,我已经在宏代码中设置了所有这些静态Public Type变量。这些应该代表INI文件的值。我希望它的方式是代码是动态的,基于INI文件中的内容。所以我不需要手动更新INI文件和后面的代码。

这是现在的代码方式。这是在它自己的模块中:

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

我正在考虑使用ReadIniSection阅读INI文件的整个部分,但似乎无法在Public Type内执行此操作。我对么?有可能以某种方式解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

使用Scripting.Dictionary对象(设置对Scripting.Runtime库的引用)。

存储:

oDict.Add keyName, keyValue

回读:

oDict(keyName)

假设您拥有单个值的唯一键名。

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

答案 1 :(得分:0)

以编程方式将代码添加到模块也是可能的(但可能不可取)。由于VBA不支持反射,因此这是该语言中唯一的“动态”编码类型。这在紧要关头很有用。

请参阅下面的代码段。 addCode子获取标准模块的名称,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