在VBA中动态创建动态数组

ste*_*tur 4 excel vba excel-vba

我的目标是使用一个名称数组在VBA中创建动态变量,继承代码:

Sub mymacro()
Dim names()
names = Array("cat_code()", "dog_code()", "eagle_code()")
For Each c In names
Dim c As Integer
Next
end sub
Run Code Online (Sandbox Code Playgroud)

当然,我的真实名字阵列有数百只动物,因此Dim对于每一只动物来说都是相当无聊的.我得到的错误是Compile Error: Duplicate declaration in current scope

什么是我的目标最好的可行解决方案?

小智 6

您获得的编译错误是由当前范围中的重复声明引起的.

换句话说:这意味着您声明了多个具有相同名称的变量.

Option Explicit模块顶部添加语句需要声明您使用的每个变量.当您收到此错误时,它非常有用,因为您可以快速扫描代码以重复声明突出显示的行Dim <variable_name>

这是一个示例,说明您收到错误的原因:

Option Explicit

Sub Main()

    Dim c As Worksheet
    For Each c In Sheets
        Dim c As Long   ' you are going to get an error in here because
                        ' a variable named: c, is already declared within the sub
                        ' you can't have two variables named: c.
        For c = 1 To ws.Range("A" & Rows.Count).End(xlUp).Row
            ' some code
        Next c
    Next

End Sub
Run Code Online (Sandbox Code Playgroud)

你的问题没有简单的解决方法.如果您更好地解释您想要实现的目标,我们本来能够为您的问题提供更好的解决方案.

有一种解决方法可以达到你想要的效果,但如果你不确定你实际上在做什么,我不建议这样做.).以下代码将在您当前的VBA项目中创建一个新模块.在使用动物名称迭代数组时,它将写入新行,Module2因此在执行之后,您的模块二将是

在此输入图像描述

为了使此代码起作用,您必须在VBE窗口中添加对" Microsoft Visual Basic for Applications Extensibility 5.3". You can do that by selecting工具>>引用"的引用.

此外,这需要你Trust Access to VBA Project Object Model.转到Excel设置>>信任中心>>宏>>勾选信任访问VBA项目对象模型.

在此输入图像描述

运行示例代码.

Option Explicit

' this VBA project requires
' 1 - references to Microsoft Visual Basic For Applications Extensibility 5.3
'     add it via Tools > References
'
' 2 - trust access to VBA project object model
'     In spreadsheet view go to Excel(application options) >> Trust Centre >> Macro Settings
'     tick the Trust Access to VBA project object model

Sub mymacro()
    Dim names
    names = Array("cat_code", "dog_code", "eagle_code")
    Dim c As Variant
    AddAModule
    For Each c In names
        ' dynamically create arrays
        WriteToModule CStr(c)
    Next
    CloseModule
End Sub


Private Sub AddAModule()
    Dim VBProj As VBIDE.VBProject
    Dim VBComp As VBIDE.vbComponent
    Dim CodeMod As VBIDE.CodeModule

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

    With CodeMod
        .DeleteLines 1, .CountOfLines
        .InsertLines 1, "Public Sub DynamicallyCreatedArrays()"
        .InsertLines 2, "    ' code for the sub"
    End With
End Sub

Private Sub WriteToModule(arrayName As String)
    With ActiveWorkbook.VBProject.VBComponents("Module2").CodeModule
        .InsertLines .CountOfLines + 2, "    Dim " & arrayName & " as Variant"
    End With
End Sub

Private Sub CloseModule()
    With ActiveWorkbook.VBProject.VBComponents("Module2").CodeModule
        .InsertLines .CountOfLines + 2, "End Sub"
    End With
End Sub
Run Code Online (Sandbox Code Playgroud)


Mik*_*use 6

如果不进入一个可怕的复杂世界,VBA就无法真正做到你想做的事情.

如何使用VBA Collection对象呢?您需要创建一个简单的类来保存数字,因为VBA集合使用引用而不是值.

所以我创建了一个Class并将其名称设置为" AnimalCounter",其内容如下:

Public Counter As Integer
Run Code Online (Sandbox Code Playgroud)

然后你的宏变成这样的东西:

Sub mymacro()

Dim coll As New Collection
Dim c As Variant
Dim ac As AnimalCounter

    For Each c In Array("cat", "dog", "eagle")
        Set ac = New AnimalCounter
        coll.Add ac, c
    Next

    Debug.Print coll("cat").Counter ' what's in "cat"?
    coll("dog").Counter = coll("dog").Counter + 1 ' update "dog" by one
    Debug.Print coll("dog").Counter ' "dog" should now be one more

End Sub
Run Code Online (Sandbox Code Playgroud)

如果您想要数组,请将数组放入类中.或者另一个Collection,也许吧?