Обновление глобального массива - PullRequest
0 голосов
/ 23 апреля 2020

Я не могу обновить глобальный массив строк с помощью Excel VBA, хотя я знаю, что это не идеальный способ написания кода. Я упростил мое требование, и вот код, в котором я хочу записать значения, такие как A0, A1, A2, ... в массив. Я вызываю функцию Getone дважды, чтобы имитировать случай, когда она будет вызываться из другой функции несколько раз

Но в отличие от глобального целочисленного аргумента, я не могу обновить строку Global, lsatest

Я также объявил lsatest на уровне модуля. Я попытался использовать lsatest в качестве варианта, я всегда получаю пустое поле для второго сообщения. какую ошибку я совершаю?

Option Explicit
Dim arrind As Integer
Public lsatest As String


Private Sub CommandButton1_Click()

arrind = 0
MsgBox (Getone)
' got A1 and thats right

MsgBox (Getone)
' expecetd A1 got blank


End Sub



Public Function Getone() As String

Dim k As Integer
Dim lsatest()
For k = 0 To 2
ReDim Preserve lsatest(arrind)
lsatest(arrind) = "A" & arrind
arrind = arrind + 1
Next k
Getone = lsatest(1)

End Function

Спасибо

1 Ответ

0 голосов
/ 23 апреля 2020

VBA разрешает ссылки на идентификаторы в следующем порядке:

  1. Локальные объявления (включая параметры)
  2. Объявления модулей
  3. Объявления в рамках проекта ("глобальные")
  4. Глобальные объявления из библиотек, на которые имеются ссылки (в порядке приоритета)

Таким образом, внутри области действия Getone идентификатор lsatest ссылается на локальную переменную, объявленную здесь:

Dim lsatest()

То, что здесь происходит, называется затенение идентификатора : локальный lsatest это скрытие / затенение идентификатор области действия модуля lsatest в следующем, более высоком scope.

Если вы хотите, чтобы Getone использовал lsatest, определенный в области видимости модуля, то у вас не может быть локального lsatest идентификатора.

Rubberduck может предупредить об этом - и многое другое:

'Shadowed Declaration' Rubberduck inspection

"переменная" ... спасибо, французский Windows. Это должно означать "Переменная" VBAProject.Module1.Getone.lsatest 'скрывает переменную' VBAProject.Module1.lsatest '. "

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

Функции должны быть автономными и надежными: тот факт, что вы вызываете одну и ту же функцию два раза подряд и получаете разные результаты, является симптомом c побочного эффекта функция - избегайте смешивания глобального состояния и функций. Значение arrind больше не 0 после первого запуска. Если вы хотите идентичные результаты, вам нужно идентичное начальное состояние.

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