VBA - динамически создавать переменные общего типа? - PullRequest
0 голосов
/ 30 марта 2011

Быстрый вопрос, у меня есть все эти статически установленные Public Type переменные в моем макросе. Предполагается, что они представляют значения файла INI. Я бы хотел, чтобы весь код был динамическим, основываясь на том, что находится в INI-файле. Поэтому мне не нужно вручную обновлять как INI-файл, так и код.

Это вывод кода таким, какой он есть сейчас. Это внутри собственного модуля:

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

Я думал о том, чтобы прочитать весь раздел файла INI, используя ReadIniSection, но кажется, что это невозможно сделать в Public Type. Я прав? Можно ли как-то обойти это?

Ответы [ 2 ]

1 голос
/ 30 марта 2011

Используйте объект Scripting.Dictionary (установите ссылку на библиотеку Scripting.Runtime).

Для хранения:

oDict.Add keyName, keyValue

Для чтения:

oDict(keyName)

Предполагается, что у вас есть уникальные имена ключей с одиночными значениями.

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

Тим

0 голосов
/ 20 марта 2012

Также возможно (но не желательно) добавлять код в модуль программно.Поскольку 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...