带有ActiveX控件元素的全局变量

时间:2019-05-28 12:57:55

标签: excel vba

我现在对学习VBA有点迷茫,我不知道要针对Google的主题。

在我的Excel表格中,我有一个按钮和一个组合框。通过按下按钮,我将一些数据加载到VBA中。某些数据条目的标题作为项添加到ComboBox中。其他数据将添加到锯齿状数组s中。

现在,通过更改ComboBox-Selection,我想访问数组s。我该怎么办?

代码在VBA编辑器的sheet1 / workbook控件中

Public Sub CommandButton1_Click()
    Dim s() As Variant

    Code Execution

    For i = 1 To m
        s(i) = SomeArray
    Next i

    For j = 1 To i - 1
        Sheets("Sheet1").ComboBox1.AddItem b(j)
    Next j
End Sub

Public Sub ComboBox1_Change()
    Sheets("Steuerung").Cells(1, 1).Value = ComboBox1.ListIndex
    Sheets("Steuerung").Cells(2, 1).Value = UBound(s, ComboBox1.ListIndex + 1)
End Sub

由于变量未知,最后一行UBound(s, ...)导致错误。

我不知道如何解决这个问题。

PS:对不起,如果我使用了错误的名称,但我的Excel不是英语的。

1 个答案:

答案 0 :(得分:0)

您需要做两件事:在模块级别将锯齿状数组声明为Public,并确保对其进行初始化。例如,您的模块如下所示:

Option Explicit

Public Const MAX_ARRAYS As Long = 25
Public s As Variant      'my jagged array

Public Sub InitializeTheArray()
    '--- initializes the jagged array, only if necessary
    If Not IsArray(s) Then
        '--- perform initialization here...
        '    at least establish some dimensions
        ReDim s(1 To MAX_ARRAYS)
    End If
End Sub

Public Sub CommandButton1_Click()
    InitializeTheArray
    Code Execution
    For i = 1 To m
        s(i) = SomeArray
    Next i

    For j = 1 To i - 1
        Sheets("Sheet1").ComboBox1.AddItem b(j)
    Next j
End Sub

Public Sub ComboBox1_Change()
    InitializeTheArray
    Sheets("Steuerung").Cells(1, 1).Value = ComboBox1.ListIndex
    Sheets("Steuerung").Cells(2, 1).Value = UBound(s, ComboBox1.ListIndex + 1)
End Sub

在每个例程中调用InitializeTheArray可以确保始终在某种程度上初始化公共数组。