Общедоступный массив для перетасовки значений между подпрограммами?

#vba

#vba

Вопрос:

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

Я пытался получить:

 Public GlobalArray() as Variant

Sub One()
    ReDim GlobalArray(0 to 2)
    GlobalArray=Array("0","1","2")
End Sub

Sub Two()
    Check = GlobalArray(2)
End Sub
  

такой, что Check = 2, но я получаю сообщение об ошибке во втором разделе, в котором жалуются на отсутствие значений в GlobalArray (на самом деле, даже в первом разделе жалуется, что нет GlobalArray для размещения вещей).

По сути, у меня есть процедура (одна), извлекающая данные из разных источников, выполняющая с ними некоторые действия, позволяющая пользователю выполнять некоторые действия в Excel, а затем запускающая новую подпрограмму (две), которая использует как ввод пользователя, так и некоторые массивы из подраздела Один.

Ответ №1:

Общедоступная переменная GlobalArray() должна быть объявлена в модуле. Он не будет работать, если он объявлен в верхней части листа или модуля ThisWorkbook. Попробуйте:

 '// Must be declared in a module    
Public GlobalArray() As Integer

'// These routines can be in worksheet/thisworkbook modules along side events etc Or in a module
Sub One()
    ReDim GlobalArray(0 To 2)
    GlobalArray(0) = 0
    GlobalArray(1) = 1
    GlobalArray(2) = 2
End Sub

Sub Two()
    check = GlobalArray(2)
    MsgBox (check)
End Sub
  

Вместо общедоступной переменной вы могли бы передать ее второй функции:

 Sub One()

    Dim GlobalArray(0 To 2) As Integer
    GlobalArray(0) = 0
    GlobalArray(1) = 1
    GlobalArray(2) = 2

    Two GlobalArrayToMe:=GlobalArray
End Sub

Sub Two(ByRef GlobalArrayToMe() As Integer)

    check = GlobalArrayToMe(2)
    MsgBox (check)

End Sub
  

Комментарии:

1. Я почти уверен, что VBA передает все массивы по ссылке, но на всякий случай… Во второй половине вы можете захотеть включить Sub Two(ByRef GlobalArrayToMe() как целое число) или variant, или любой другой тип массива. Таким образом, вы не потребляете огромные куски памяти. Что любит делать VBA / Excel.

2. На самом деле, VBA передает массивы по значению, поэтому вам нужен ByRef, если вы хотите избежать копирования массива при передаче в качестве параметра.

Ответ №2:

Это не VBA и не будет компилироваться: GlobalArray=("0","1","2")

Вы могли бы вместо этого использовать: GlobalArray = Array("0", "1", "2")

но для этого требуется объявление Public GlobalArray() As Variant

В противном случае назначайте элементы массива один за другим, как в ответе @Readfidy.

Комментарии:

1. Спасибо — прояснил вопрос.