Я ищу альтернативные, общие методы кодирования для работы с глобальными именованными диапазонами в VBA. Я надеюсь на ответы здесь, с некоторыми новыми обобщенными предложениями и подходами.
Я предлагаю несколько методов, которые я использовал, но эти методы не позволяют избежать всех проблем - мне бы хотелось: простота кодирования и составления электронных таблиц; терпимый к изменениям электронной таблицы, и; простота поиска / ссылки месяцев спустя.
Когда я создаю электронную таблицу, которая позже будет использовать VBA, я создаю именованные диапазоны (обычно глобальные имена) в формулах электронной таблицы. Диапазоны полезны там на листах, и полезны в качестве справки от VBA. Как правило, я не добавляю / не изменяю коллекцию имен в VBA; Я просто ссылаюсь на коллекцию.
При кодировании VBA я получаю доступ к именованным диапазонам, созданным в книге. Если я вырезал / вставил именованные ячейки / диапазоны, отредактировал рабочую книгу и листы, VBA все еще работает.
Тем не менее, глобальные имена, созданные в среде рабочих таблиц, не соответствуют всем трем требованиям в среде VBA, особенно при изменении кода или рабочих таблиц.
В Моем Идеальном Мире:
wb.range("myGlobalRangeName")
Мой идеальный мир надеется, что глобальные ссылки на рабочую книгу, созданные в электронной таблице , являются глобальными , но без пояснений VBA ожидает, что эта ссылка будет в ActiveWorkBook и ActiveWorkSheet.
Мысль первая: Я знаю, что Range("myGlobalRangeName")
обращается к этому диапазону, а
Таким образом, я часто использую этот фрагмент
wb.Worksheets("SheetOne").Range("myGlobalRangeName")
может быть построен внутри With
блоков, определяя рабочий лист, даже если диапазон является глобальной ссылкой.
Перемещение именованных ячеек на другие листы нарушает эту ссылку (хотя Имя является Глобальным!). Я должен вернуться по всему коду в поисках неуместных ссылок; или я могу выполнить код и надеюсь поймать ошибки ...
Мысль вторая: Вместо этого я могу написать что-то вроде этого, чтобы получить доступ к коллекции имен для рабочей книги:
wb.Names("myGlobalRangeName").RefersToRange
но добавление RefersToRange
это ... ну ... раздражает. Он скучает по простоте совершенного мира.
Три мысли: Я создаю отдельный worksheet
со всеми значениями, которые я хочу перехватить на других листах, и я создаю диапазоны только на этом отдельном листе. Работают ссылки на ячейки в книге и доступ к ним с помощью VBA. Таким образом, VBA начинается с
Dim wsNames as spreadsheet
set wsNames = wb.worksheets("SheetWithNames")
и ссылки на имена всегда использовали wb.wsNames
и выглядели так:
with wb
.... .wsNames.range("myGlobalRangeName") ....
end with
или другие полезные варианты.
Тем не менее, это тоже может запутаться - мне нужно вернуться назад, чтобы увидеть, где реальные данные, когда я позже исправлю электронную таблицу или VBA. Иногда этот метод работает, особенно если я цепко имя диапазона на этом листе только для потребления VBA, используйте действительно запоминающиеся имена, и помните места, и помню, что я делал все эти месяцы спустя ...
Вывод: Я что-то упустил? Существуют ли другие, возможно более простые, общие методы кодирования, кроме использования
RefersToRange
с name collection
или
wb.worksheets("SheetName").Range("myGlobalRange")
ссылки, которые явно идентифицируют [текущий] лист, или
- размещение RangeNames и реферальных формул на отдельном листе с ссылками на диапазоны VBA как
wsNames.Range("myGlobalRange")
.
Я не хочу так много печатать; или создайте переменные процедуры для захвата значений перед их использованием в присваиваниях. Беспорядок становится ... ну ... труднее читать и хуже отследить, присваиваю ли я значение одной ячейки другой в другой книге, и один или оба используют глобальные диапазоны.