首页 > 解决方案 > 如何存储全局数组

问题描述

在我的工作簿中,我有一个存储机器的数组。通过一个按钮,我可以将一些机器添加到阵列中。

最后一个数组用于其他三个按钮,每个按钮位于不同的工作表上。我现在的问题是,我如何存储具有变化值的全局数组?

这是我为数组添加一些值的代码:

Private Sub Add_Machine_Click()
    Dim ws As Worksheet
    Dim lastrow As Long
    Dim Machine() As Variant
    Dim DataRange As Range

    Set ws = Worksheets("MachineTemplate")
    lastrow = ws.Cells(Rows.Count, "A").End(xlUp).Row

    Set DataRange = ws.Range("A1:A" & lastrow)
    Set Cell = DataRange.Find(What:=ComboBox1.Value, LookIn:=xlFormulas, lookat:=xlWhole)

    If Cell Is Nothing Then
        ws.Range("A" & lastrow + 1) = ComboBox1.Value
    End If

    ReDim Machine(DataRange.Cells.Count)
    For Each Cell In DataRange.Cells
        Machine(x) = Cell.Value
        x = x + 1
    Next Cell
End Sub

现在我对其他三个按钮使用相同的代码。有没有办法可以将此代码存储为全局?

我已经在 WorkbookSheet 中尝试过,如下所示:

Option Explicit

Public Machine() As Variant
Public ws As Worksheet
Public lastrow As Long
Public DataRange As Range

ws = Worksheets("MachineTemplate")
lastrow = ws.Cells(Rows.Count, "A").End(xlUp).Row
Set DataRange = ws.Range("A1:A" & lastrow)
ReDim Machine(DataRange.Cells.Count)
x = 0
For Each Cell In DataRange.Cells
    Machine(x) = Cell.Value
    x = x + 1
Next Cell

但我知道这是完全错误的。

标签: arraysexcelvbaglobal

解决方案


为此,您不需要全局数组。由于您使用Redimwithout Preserve,因此这意味着它每次都从范围内初始化DataRange

同样要创建数组,您不需要每次都循环遍历它。您可以直接在一行中创建一个二维数组

Dim Machine as Variant
Machine = DataRange.Value

您可能还想查看VBA 数组和工作表范围

我通常避免使用全局变量。如果发生错误,它们在运行时很容易重置。


推荐阅读