VBA Public Array: как?

Итак, сегодняшняя проблема сводит меня с ума, потому что это должно быть легко, и я не могу найти ответ :

как объявить открытый массив в VBA ? Я использую массив с буквами A, B, C,... потому что я работаю с ячейками Excel, и я не хочу объявлять его в каждой функции, которую я создаю, верно ? Я попытался сначала посмотреть в интернете, и я прочитал, что вы должны объявить его в другом модуле, так что это то, что я сделал :

Public colHeader As String
colHeader = Array("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L")

но Visual Basic не нравится...

Так что мне делать ?

Спасибо большое :)

Edit: проблема больше в asigning значениях массива, чем в его объявлении

6 ответов


объявить массив как глобальный для всех суб в приложении:

Public GlobalArray(10) as String
GlobalArray = Array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L')

Sub DisplayArray()
    Dim i As Integer

    For i = 0 to UBound(GlobalArray, 1)
        MsgBox GlobalArray(i)

    Next i
End Sub

Метод 2: передайте массив в sub. Использовать И Paramarray.

Sub DisplayArray(Name As String, ParamArray Arr() As Variant)
    Dim i As Integer

    For i = 0 To UBound(Arr())
        MsgBox Name & ": " & Arr(i)
    Next i
End Sub

ParamArray должен быть последним параметром.


вы используете неправильный тип. The возвращает Variant, а не String.

таким образом, в разделе Объявления вашего модуля (он не должен быть другим модулем!), вы определяете

Public colHeader As Variant

и где-то в начале кода программы (например, в Workbook_Open event) вы инициализируете его с помощью

colHeader = Array("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L")

другое (простой) альтернативой было бы создать функцию, которая возвращает массив, например, что-то как

Public Function GetHeaders() As Variant
    GetHeaders = Array("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L")
End Function

это имеет то преимущество, что вам не нужно инициализировать глобальную переменную и недостаток, что массив создается снова при каждом вызове функции.


попробуйте это:

Dim colHeader(12)
colHeader = ("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L")

к сожалению, код, найденный в интернете, был VB.NET не VBA.


это сработало для меня, кажется, работает как глобальный:

Dim savePos(2 To 8) As Integer

и can вызовите его из каждого sub, например, получение первого элемента:

MsgBox (savePos(2))

Option Explicit
     Public myarray (1 To 10)
     Public Count As Integer
     myarray(1) = "A"
     myarray(2) = "B"
     myarray(3) = "C"
     myarray(4) = "D"
     myarray(5) = "E"
     myarray(6) = "F"
     myarray(7) = "G"
     myarray(8) = "H"
     myarray(9) = "I"
     myarray(10) = "J"
Private Function unwrapArray()
     For Count = 1 to UBound(myarray)
       MsgBox "Letters of the Alphabet : " & myarray(Count)
     Next 
End Function

ну, в основном, я нашел, что вы можете объявить массив, но когда вы устанавливаете его, vba показывает вам ошибку.

поэтому я поставил специальный sub для объявления глобальных переменных и массивов, что-то вроде:

Global example(10) As Variant

Sub set_values()

example(1) = 1
example(2) = 1
example(3) = 1
example(4) = 1
example(5) = 1
example(6) = 1
example(7) = 1
example(8) = 1
example(9) = 1
example(10) = 1

End Sub

и всякий раз, когда я хочу использовать массив, я сначала вызываю sub, на всякий случай

call set_values

Msgbox example(5)

возможно, это не самый правильный способ, но я надеюсь, что это работает для вас