Глобальные переменные VBA, несколько рабочих книг - PullRequest
1 голос
/ 23 сентября 2010

У меня есть приложение VB, которое использует некоторые глобальные переменные для хранения данных, которые требуются для нескольких форм и модулей, это прекрасно работает. Однако если пользователь открывает другую книгу с тем же приложением VBA, он получает доступ (и изменяет) к одним и тем же общедоступным переменным.

Как получить глобальные переменные уровня книги или, если это невозможно, каков наилучший способ хранения данных, доступных для всех форм и модулей, но только внутри конкретной книги?

Это надстройка VBA, а глобальные переменные объявляются в стандартном модуле.

Ответы [ 4 ]

1 голос
/ 27 сентября 2010

Я думаю, вы могли бы получить имя книги во время выполнения.

Итак, коллекция, вероятно, выполнит эту работу.

'//-- module --
Public var As Collection

Public Function SetVar(Value)
   If var Is Nothing Then
      Set var = New Collection
   End If
   var.Add Value, ThisWorkbook.Name
End Function

Public Function GetVar() As Variant
   If var Is Nothing Then
      GetVar = Null
   Else
      GetVar = var.Item(ThisWorkbook.Name)
   End If
End Function

Не уверен, что она будет работать для вашего Addin, хотя.

1 голос
/ 23 сентября 2010

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

1 голос
/ 25 сентября 2010

Мне удалось воспроизвести проблему с помощью простой xla по имени George:

Public harry As Variant

Public Sub setHarry(x)
    harry = x
End Sub

Public Function getHarry()
    getHarry = harry
End Function

Я установил xla.Затем я создал Alice.xls с текстовым полем, которое вызывало setHarry, когда оно изменилось, и ячейку с = getHarry () в нем.Я сохранил это очень просто:

Private Sub TextBox1_Change()
    Run "george.xla!setHarry", TextBox1
End Sub

Затем я сделал копию Alice.xls в виде Bob.xls и запустил их оба.Как и ожидалось, если одна из книг изменит Гарри, обе книги увидят результат.

Я говорю ожидаемо, потому что xla похожи на dll в том, что в памяти есть только одна копия, которой все делятся;это, очевидно, включает в себя глобальные переменные, что имеет смысл.Я просто хотел проверить теорию.

На мой взгляд, лучший способ исправить это - использовать модуль класса вместо обычного модуля.Таким образом, вы можете назначить каждой книге свой экземпляр класса и его переменные в событии Workbook_Open.Если переменные объявлены как публичные, вам не нужны свойства get и set, хотя вы можете использовать их, если в этом есть смысл.

1 голос
/ 23 сентября 2010
Public myvar as Variant

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

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