2011-03-30 81 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