Подтвердить что ты не робот

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

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 раз легче ориентироваться (без всех дубликатов имен).

4b9b3361

Ответ 1

Что касается документации, см. Оценка имен и других выражений формулы рабочего листа

  • =A1 относится к ячейке A1 на текущем листе
  • =!A1 относится к ячейке A1 на активном листе.

в сочетании с Список рабочих листов

  • Current относится к тому, что Excel пересчитывает...
  • Активный относится к просмотру пользователя...

Это то, что продемонстрировал Чарльз Уильямс. Что касается вашего варианта использования, я бы рекомендовал определенные пользователем функции, например, в VBA.

Ответ 2

Вам нужно быть осторожным! Ссылки в именах:
Имена с ссылаются на, начиная с =! могут давать неверные результаты при вызове вычисления из VBA. Они рассчитываются так, как если бы они всегда ссылались на активный лист, а не на лист, на котором они используются:

положить 1 в ячейку A1 листа1
a) положите =CellA1 в A2 листа 1, где CellA1 определяется как =!$A$1
б) перейти на ручной расчет
c) активировать Sheet2
d) запустить этот код VBA

Sub Testing()
Worksheets("Sheet1").Range("a1") = 8
Application.Calculate
End Sub

e) Теперь вернитесь к Sheet1, и вы увидите, что Sheet1! A2 содержит все, что было в Sheet2! A1

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