Также возможно (но не желательно) добавлять код в модуль программно.Поскольку 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