EDIT: название изменено для ясности.
Краткая сводка:. Я хочу знать, является ли поведение Excel в рабочей среде, зависящей от рабочей книги, иными формулами (которые я опишу ниже) является документированной функцией в Excel. Если да, пожалуйста, укажите мне куда-нибудь куда-нибудь по документации. Кажется, я ничего не могу найти об этом в Интернете (возможно, я использую плохие условия поиска...?) И не хочу использовать что-то, что на самом деле ошибка и может исчезнуть в более поздней версии!
Строго говоря, это не вопрос о VBA; однако названные формулы - это то, что я и другие используют в коде VBA все время, поэтому он по-прежнему применим к объекту, который я думаю.
EDIT: Обратите внимание, что код VBA ниже может быть не совсем прав - я его не тестировал.
Обычный метод
Для инженерных/научных вычислений мне часто приходилось использовать один и тот же Named Formula/Range несколько раз в одной книге, но на разных листах. В качестве упрощенного примера я мог бы реализовать что-то вроде этого для области круга:
Dim sht as Worksheet
For Each sht In ThisWorkbook
Call sht.Names.Add(Name:="AreaCircle",RefersTo:="=PI()*'" & _
sht.Name & "'!Radius^2")
Next sht
Это приводит к следующему набору Named Ranges/Formulas (с учетом каждого листа):
=PI()*Sheet1!Radius^2 <--- scoped to Sheet1
=PI()*Sheet2!Radius^2 <--- scoped to Sheet2
etc. etc.
Это прекрасно работает, но у него есть главный недостаток в том, что трудно вносить будущие изменения. Например, если формула изменится (область круга не будет изменяться, конечно, но формулы формулы AASHTO LRFD, например, меняют почти каждое издание!), Я должен редактировать каждый экземпляр каждой формулы имени. Это утомительно, даже если я пишу процедуру VBA, чтобы сделать это для меня.
Альтернативный метод
Я обнаружил ниже на случай аварии в Excel 2013 на днях и не смог найти что-либо об этом в любом месте в Интернете. Это заставляет меня колебаться, чтобы начать использовать его.
Скажем, вместо этого я запускаю следующую строчку кода:
Call ThisWorkbook.Names.Add(Name:="AreaCircle",RefersTo:="=PI()*!Radius^2")
Это приводит к следующему SINGLE Named Range/Formula (в скобках к книге):
=PI()*!Radius^2
< --- формула ограничена рабочей книгой; примечание !Radius
, а не Radius
.
Обратите внимание, что это НЕ то же самое, что и следующее (нет восклицательного знака):
=PI()*Radius^2
< --- Обратите внимание, что здесь Radius
помещается в рабочую книгу.
Теперь AreaCircle
будет производить то же самое поведение, что и первый метод выше: он даст результат, основанный на локальном значении Radius, заданном листом. Поэтому, если есть два Именованных Диапазона, называемых Radius
(один для Sheet1
и один для Sheet2
), AreaCircle
будет рассчитываться в зависимости от значения Radius
в листе, в котором он используется. И с добавленной выгодой, что мне больше не нужно добавлять новую версию этой формулы (и любой другой!) Каждый раз, когда я добавляю новый рабочий лист (это ОГРОМНОЕ!).
Это сложное поведение для описания; если вы смущены моим описанием, вы можете сделать следующие шаги, чтобы воссоздать это поведение:
- В рабочей книге создайте два или более рабочих листа и введите "1" в ячейке
A1
изSheet1
, "2" в ячейкеA1
Sheet2, "3" в ячейкеA1
Sheet3 и т.д. и др. - Создайте именованный диапазон
CellA1
(с областью рабочей книги) и введите следующую формулу:=!$A$1
- Ввод
=CellA1
в любой ячейке приведет к "1" наSheet1
, приведет к "2" наSheet2
и т.д. и т.д.
Документация?
Эй, ты сделал это - спасибо за то, что ты здесь со мной!
Итак, как я сказал выше, может кто-нибудь указать мне на документацию для этой "функции"? Я хотел бы начать реализацию этого в некоторых из моих более сложных проектов; если ничего другого, он просто заставит Диспетчер имен примерно в 20 раз легче ориентироваться (без всех дубликатов имен).