Переменная коллекции Excel - PullRequest
       24

Переменная коллекции Excel

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

Допустим, у нас есть две рабочие книги, идентичные по функциональности VBA;однако наборы данных будут другими.Код VBA хранит некоторые данные в переменной коллекции, чтобы облегчить вычисления.Эта переменная вызывается через разные модули внутри одной и той же книги.Поскольку эта переменная также существует в другой книге, и эти две книги не должны использовать одни и те же значения коллекции, как мы можем быть уверены, что вызов коллекции будет извлекать переменную только из своей собственной книги?

Будет ли объявление "Вариант "Частный модуль" будет адекватным при объявлении переменной коллекции?Такие как:

Option Private Module
Public DataCol As New Collection

Спасибо.

Ответы [ 2 ]

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

Вряд ли возникнет проблема ...

Допустим, у вас есть две идентичные книги:

  • Book1.xlsm и
  • Book2.xlsm

... и оба имеют одинаковую настройку Public Variable с именем X.

Если у вас нет явного значения Reference от Book1 до Book2, тогда Book1 не может "видеть" X или другие переменные / константы/ etc, которые существуют в Book2.

img

Например, один из способов задания ссылки будет, если в Book1 вы пошли Инструменты > Ссылки > Просмотр и выбранная рабочая книга Book2.xlsm.

img

Даже если вы сделали , установите ссылку между книгами, и у обоих естьпеременная с именем X, Book1 всегда будет искать X внутри себя, прежде чем искать в другом месте.Вы должны квалифицировать переменную следующим образом:

Applications.Workbooks("Books2.xlsm").X

Это относится ко всем ссылкам;Если у вас есть что-то в вашей книге, названное так же, как «подключенная» ссылка, код, выполняемый в вашей книге, «просматривает» сначала в процедуре, затем в модуле, затем в книге, прежде чем искать внешние ссылки на ссылки.

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

Если у вас часто открыты две идентичные рабочие книги, гораздо более вероятно, что you случайно напишет или выполниткод в неправильной книге, (я сделал это, это раздражает - особенно когда вы закрываете и удаляете «книгу мусора», в которую вы случайно просто написали кучу кода!)

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


Диапазоны

Обратите внимание, что то же самое не применяется при обращении к диапазонам листов и т. Д. С неквалифицированными ссылками.

Например, Range("A1") относится к любому листу, находящемуся «сверху» (т. Е. К последней книге, которая была нажата, выбрана или иным образом активирована.

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

ThisWorkbook.Sheets("Sheet1").Range("A1")

Scope

Это обсуждение относится к категории Scope .

scope

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


Действительно Глобальные переменные

Кстати, есть также способ создания действительно глобальных переменных, на которые может ссылаться oдругие ( не Office ) приложения и даже после закрытия приложения и / или повторного открытия.

Требуется некоторое довольно продвинутое кодирование, поскольку оно включает в себя API Windows, но у Чипа Пирсона есть шаги и пример кода здесь .

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

Да.

Объявление модуля как Option Private Module ограничит область действия «открытых» переменных, объявленных в этом модуле, этим конкретным проектом.Это похоже на область действия Friend в классах и аналогично internal static в .NET.

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