快速提问,我已经在宏代码中设置了所有这些静态Public Type
变量。这些应该代表INI文件的值。我希望它的方式是代码是动态的,基于INI文件中的内容。所以我不需要手动更新INI文件和后面的代码。
这是现在的代码方式。这是在它自己的模块中:
Public Type Fields
Firstname as String
Lastname as String
Username as String
End Type
我正在考虑使用ReadIniSection
阅读INI文件的整个部分,但似乎无法在Public Type
内执行此操作。我对么?有可能以某种方式解决这个问题吗?
答案 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