我可以使用TextBox(Vba Excel)设置变量的名称吗?我必须在TextBox中编写组名称并单击命令按钮的方式输入新的产品组。代码必须从Textbox获取String,将此字符串设置为新创建的数组的名称。
一般来说,不建议这样做。然而,您可以编程自己的classe然后将持有您的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
类型的每个变量都有一个名称和数据。
我只想在运行时创建一个新的变量(或数组)。
据信这是不可能的。但它是。这在任何地方都没有记录(至少我没有在任何地方阅读过)。
逻辑:
我们将在运行时编写VBA编辑器以创建新数组。您可以在Chip的网站Programming The VBA Editor上阅读有关编程VBA编辑器的更多信息
注意
Microsoft Visual Basic For Applications Extensibility 5.3
的引用在下面的代码中,我们将创建一个数组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