Могу ли я установить имя переменной с помощью текстового поля?VBA Excel - PullRequest
4 голосов
/ 22 марта 2019

Могу ли я установить имя переменной с помощью TextBox (Vba Excel)? Я должен ввести новую группу продуктов так, как я пишу название группы в TextBox и нажимать командную кнопку. Код должен взять String from Textbox, установить эту строку как имя нового созданного массива.

Ответы [ 2 ]

3 голосов
/ 22 марта 2019

Я просто хочу создать новую переменную (или массив) во время выполнения.

Считается, что это невозможно .Но это.Это нигде не задокументировано (по крайней мере, я нигде не читал).

Логика :

Мы просто запрограммируем VBA Editor во время выполнения для создания нового массива.Вы можете прочитать больше о программировании редактора VBA на сайте Чипа Программирование Редактор VBA

Примечание

  1. Убедитесь, что вы установили ссылкуна Microsoft Visual Basic For Applications Extensibility 5.3
  2. Я не занимаюсь обработкой ошибок.Не стесняйтесь включать это в ваш код.

В приведенном ниже коде мы создадим массив MyArray и измерим его, скажем, размером 5

Код

Option Explicit

Const vbext_ct_StdModule As Integer = 1

Sub Sample()
    Dim VBProj As VBIDE.VBProject
    Dim VBComp As VBIDE.VBComponent
    Dim CodeMod As VBIDE.CodeModule
    Dim LineNum As Long

    Set VBProj = ThisWorkbook.VBProject
    Set VBComp = VBProj.VBComponents.Add(vbext_ct_StdModule)

    '~~> Create new module called MySpecialModule
    '~~> It it exists then you will get an error
    '~~> Either delete it and create new one or use error handling
    VBComp.Name = "MySpecialModule"

    Set CodeMod = VBComp.CodeModule

    With CodeMod
        LineNum = .CountOfLines + 1
        .InsertLines LineNum, "Public MyArray() As String"
        LineNum = LineNum + 1
        .InsertLines LineNum, "Public Sub InitArray()"
        LineNum = LineNum + 1
        .InsertLines LineNum, "    Redim MyArray (1 to 5)"
        LineNum = LineNum + 1
        .InsertLines LineNum, "End Sub"
    End With

    '~~> Initialize newly created Array
    initializeArray
End Sub

'~~> Run the procedure to initialize the newly created array
Sub initializeArray()
    InitArray

    Debug.Print UBound(MyArray)
End Sub

Когда вы запускаете код, создается новый модуль, и в этот модуль вводится некоторый код.Затем этот код снова вызывается во время выполнения.Код ниже не существует, когда вы запускаете код.

Public MyArray() As String

Public Sub InitArray()
    ReDim MyArray(1 To 5)
End Sub
0 голосов
/ 22 марта 2019

В общем, это не рекомендуется делать. Тем не менее, вы можете запрограммировать свой собственный класс с помощью затем удерживать ваши GroupName и Data Я обычно использую collections в качестве контейнеров данных, а не массивов. Класс MyClass будет выглядеть следующим образом:

Option Explicit

Private Type TModel
    Data As Collection
    GroupName as string
End Type

Private this As TModel

Public Property Get GroupName() As Collection
    Set GroupName= this.GroupName
End Property
Public Property Let GroupName(ByVal Value As Collection)
    Set this.GroupName= Value
End Property
Public Property Get Data() As Collection
    Set Data = this.Data
End Property
Public Property Let Data(ByVal Value As Collection)
    Set this.Data = Value
End Property

Private Sub Class_Initialize()
Set this.Data = New Collection
End Sub

Это выглядит довольно сложно, но на самом деле очень просто. У вас есть инкапсуляция с использованием частного типа TModel. Там вы храните данные. Используя Property Get и Property Let, вы можете получить и передать свое свойство класса. Это может быть использовано так в Module.

Sub TestMyClass()
Dim MClass as New MyClass
Dim GName as String
Dim Data as New Collection

Set Data=GetData()
GName=GetName()

Set MClass.Data=Data
Set MClass.GroupName=GName

Debug.Print MClass.GroupName ' Prints Groupname
End Sub

Таким образом, каждая переменная типа MyClass содержит имя и данные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...