Глобальная переменная с элементами управления ActiveX - PullRequest
0 голосов
/ 28 мая 2019

Я немного растерялся, изучая VBA, и не знаю, какую тему гуглить.

В моем Excel-листе у меня есть кнопка и поле со списком. Нажав кнопку, я загружаю некоторые данные в VBA. Заголовок определенных записей данных добавляется как элемент в ComboBox. Другие данные добавляются в неровный массив s.

Теперь, изменив ComboBox-Selection, я хочу получить доступ к массиву s. Как я могу это сделать?

Код находится в элементе управления sheet1 / workbook в VBA Editor

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 голосов
/ 28 мая 2019

Вам нужно сделать две вещи: объявить зазубренный массив как 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 в каждой из ваших подпрограмм может гарантировать, что открытый массив всегда инициализируется до некоторой степени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...