VBA: массивы и объявления глобальных переменных - PullRequest
3 голосов
/ 17 августа 2011

Мне нужно объявить массив в VBA, который будет использоваться каждой функцией.Тем не менее, я не могу объявить его глобальным, как я сделал бы в C ++.

Мой код выглядит следующим образом:

Option Explicit
 Dim test(0 to 10) as String

 test(0) = "avds"
 test(1) = "fdsafs"
 ....

Следующая концепция осмысливает то, что я пытаюсь сделать.

 public function store() as boolean
  Worksheets("test").cells(1,1) = test(0)
 End Function

Как мне добиться этой функциональности?

Ответы [ 5 ]

6 голосов
/ 18 августа 2011

Для глобального объявления измените Dim на Public следующим образом:

Public test(0 to 10) as String

Вы можете назвать это как (предполагая, что это в Module1, иначе измените Module1 на то, что вы назвали):

Module1.test(0) = "something"

Или просто:

test(0) = "something"
5 голосов
/ 18 августа 2011

Почему бы вам не создать все в классе?Вот почему классы были изобретены в конце концов.

Рассмотрим определение Class1

Option Explicit

Private m_data() As String

Private Sub Class_Initialize()
    ReDim m_data(0 To 10)
End Sub
Private Sub Class_Terminate()
    Erase m_data
End Sub

Public Property Get Count() As Integer
    Count = UBound(m_data) - LBound(m_data) + 1
End Property

Public Property Get Data(index As Integer) As String
    Data = m_data(index)
End Property

Public Property Let Data(index As Integer, value As String)
    m_data(index) = value
End Property

Public Function Store(rng As Range) As Boolean
    Store = (rng.value = m_data(0))
End Function

Вы можете добавить все нужные функции, которые могут обращаться к вашему массиву, как Store().с тестовым кодом на листе

Public Sub Test()
    Dim c As New Class1

    c.Data(0) = "January"

    Debug.Print c.Store(Cells(1, 1))
End Sub

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

3 голосов
/ 18 августа 2011

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

Помните, что в vba вы не можете объявлять переменные или код вне процедур.

См. здесь для получения дополнительной информации

1 голос
/ 19 января 2015

У меня есть рекомендация, которая немного легче, чем класс (хотя класс - отличная рекомендация)

Вариант 1

Определите желаемый постоянный массив как строковую константу с разделителями:

Public Const cstrTest = "String 1;String 2; String 3; String 4; String 5; String 6"

Далее, когда вам это нужно, просто используйте Split для создания массива с минимальным кодом:

Dim arrStrings
arrStrings = Split (cstrTest, ";")

Вариант 2

Вы можете заменить (или объединить с вариантом 1) простую публичную функцию

Public Function constStringArray() As String()

    constStringArray = Split (cstrTest, ";")

End Function

Итак, в использовании ...

Dim arrStrings

'Option 1 example
arrStrings = Split (cstrTest, ";")

'Option 2 example
arrStrings = constStringArray()
0 голосов
/ 18 июня 2019

можно сделать это (с глобальной инициализацией) через Static Property довольно просто, без создания класса или разбора строки - как описано подробно и с примерами здесь

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