Общественный массив VBA: как? - PullRequest
9 голосов
/ 31 октября 2009

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

Как объявить публичный массив в 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 это не нравится ...

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

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

Редактировать: проблема скорее в присвоении значений массиву, чем в объявлении

Ответы [ 6 ]

7 голосов
/ 31 октября 2009

Объявление массива как глобального для подпрограмм в приложении:

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 должен быть последним параметром.

4 голосов
/ 31 октября 2009

Вы используете неправильный тип. Функция Array(...) возвращает Variant, а не String.

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

Public colHeader As Variant

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

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

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

0 голосов
/ 05 октября 2018

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

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

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)

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

0 голосов
/ 27 мая 2013
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
0 голосов
/ 16 марта 2013

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

Dim savePos(2 To 8) As Integer

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

MsgBox (savePos(2))
0 голосов
/ 31 октября 2009

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

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

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

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