在VBA Excel中的不同Subs中引用相同的数组

时间:2014-07-15 18:49:19

标签: arrays excel vba excel-vba

我有一个函数使用单元格值填充某个数组,具体取决于选择的OptionButton。如何在单独的函数中引用这些相同的数组,这些函数会将这些值反馈到单元格中?到目前为止,这是我的(工作)代码。

Private Sub CommandButton1_Click()
Dim wave1Array(0 To 30) As String
Dim wave2Array(0 To 30) As String
Dim wave3Array(0 To 30) As String
Dim wave4Array(0 To 30) As String
Dim wave5Array(0 To 30) As String
Dim rng As Range
Dim cell As Range
Dim counter As Long

Set rng = Range("B2", "AF2")
counter = 0

If OptionButton6.Value = True Then
    For Each cell In rng
    wave1Array(counter) = cell.Value
    counter = counter + 1
Next cell
ElseIf OptionButton7.Value = True Then
    For Each cell In rng
    wave2Array(counter) = cell.Value
    counter = counter + 1
Next cell
ElseIf OptionButton8.Value = True Then
    For Each cell In rng
    wave3Array(counter) = cell.Value
    counter = counter + 1
Next cell
ElseIf OptionButton9.Value = True Then
    For Each cell In rng
    wave4Array(counter) = cell.Value
    counter = counter + 1
Next cell
ElseIf OptionButton10.Value = True Then
    For Each cell In rng
    wave5Array(counter) = cell.Value
    counter = counter + 1
Next cell
End If

End Sub

1 个答案:

答案 0 :(得分:1)

我可以想到几种不同的选择。

正如其他人所提到的,根据需要制作模块级变量。这些声明应与表单控件位于相同的代码模块中。如果表单控件在userform上,那么它们应该在表单的代码模块中声明,而不是标准"模块。

'-------------------------------- all in the same code module -------------
Option Explicit
Dim myVariable as String

Private Sub CommandButton1_Click()

    myVariable = "Hello, world!"

End Sub

Private Sub CommandButton2_Click()

    msgBox myVariable

End Sub
'------------------------------- end of this example ----------------------

Public / GLobal变量可能是一个选项,但我记得使用UserForms时有一些限制,因为我不确定你是否使用UserForm,我不推荐

第三个选项是将参数从一个过程传递到另一个过程,但这通常仅适用于"链接"过程/函数,比如一个函数调用另一个函数,而这似乎不是你正在做的事情。

针对您的具体情况:

您还可以简化代码,以避免使用countercell变量,使用直接的范围到数组分配。

'Module-level array variables, accessible by other procedures in this module:
Dim wave1Array()
Dim wave2Array()
Dim wave3Array()
Dim wave4Array()
Dim wave5Array()
Dim wave6Array()

Private Sub CommandButton1_Click()

Dim rng As Range
Dim arr() 

Set rng = Range("B2", "AF2")
'## Converts the row to an array (0 to 30)
arr = Application.Transpose(Application.Transpose(rng.Value))

'## Assigns the array from above to one of the module-level array variables:

If OptionButton6.Value = True Then wave1Array = arr
If OptionButton7.Value = True Then wave2Array = arr
If OptionButton8.Value = True Then wave3Array = arr
If OptionButton9.Value = True Then wave4Array = arr
If OptionButton10.Value = True Then wave5Array = arr
If OptionButton11.Value = True Then wave6Array = arr

End Sub

注意要执行此操作,您必须将它们声明为变体数组,因为一系列单元格.Value是变体类型(单元格可以包含错误值,我相信如果您尝试分配给字符串数组,则会失败)。

IF 您必须使用严格的String数组,然后您需要使用countercell次迭代。