我可以用文本框设置变量的名称吗? VBA Excel

问题描述 投票:4回答:2

我可以使用TextBox(Vba Excel)设置变量的名称吗?我必须在TextBox中编写组名称并单击命令按钮的方式输入新的产品组。代码必须从Textbox获取String,将此字符串设置为新创建的数组的名称。

excel vba
2个回答
0
投票

一般来说,不建议这样做。然而,您可以编程自己的classe然后将持有您的GroupNameData。我通常使用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 GetProperty 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类型的每个变量都有一个名称和数据。


3
投票

我只想在运行时创建一个新的变量(或数组)。

据信这是不可能的。但它是。这在任何地方都没有记录(至少我没有在任何地方阅读过)。

逻辑:

我们将在运行时编写VBA编辑器以创建新数组。您可以在Chip的网站Programming The VBA Editor上阅读有关编程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
© www.soinside.com 2019 - 2024. All rights reserved.