Как использовать диапазон из другой книги в формуле в VBA? - PullRequest
1 голос
/ 25 июня 2019

Я автоматизирую большое количество электронных писем, которые ежедневно доставляют KPI и предоставляют данные менеджерам.

Как получить NETWORKDAYS (начальные даты, конечные даты, праздничные дни ), чтобы использовать диапазон праздничные дни в другой книге Excel?

Весь процесс:

  1. Планировщик задач ежедневно открывает файл XLSM.
  2. Файл XLSM открывает вывод в формате csv, редактирует и анализирует его, в том числе с использованием NETWORKDAYS.
  3. Файл csv отправляется по электронной почте с электронным письмом, в котором сообщается о KPI, который он рассчитывает.

Я хочу убедиться, что праздничные дни хранятся только в одной книге Excel, отдельно от файлов xlsm, потому что будет запланировано много таких файлов xlsm - если даты праздников изменятся, я хочу только нужно обновить один диапазон.

Я пробовал несколько вещей, используя с установленными именованными диапазонами. (Я использовал VBA только несколько дней, поэтому, возможно, упускаю что-то очевидное.)

Range("F2").Select
    ActiveCell.FormulaR1C1 = _
        "=MAX(NETWORKDAYS([@[Effective Requested Date]], [@[Scheduled Date]], holidays), NETWORKDAYS([@[Effective Requested Date]], [@ExamDate], holidays))"

Мой столбец NETWORKDAYS выводится как # ЗНАЧЕНИЕ. Я ожидаю, что результат будет целым числом.

1 Ответ

0 голосов
/ 25 июня 2019

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

Использование рабочих книг с внешними ссылками на таблицы Excel в других рабочих книгах Если рабочая книга содержит внешнюю ссылку на таблицу Excel в другой рабочей книге, эта связанная исходная рабочая книга должна быть открыта в Excel, чтобы избежать #REF! ошибки в целевой книге, содержащей ссылки. Если вы сначала откроете книгу назначения и #REF! ошибки появляются, они будут устранены, если вы откроете исходную книгу. Если вы сначала откроете исходную книгу, вы не увидите кодов ошибок.

Одним из способов решения этой проблемы было бы , а не использование структурированных ссылок, и вместо этого вместо этого ссылаться на абсолютный адрес диапазона, предполагая, что имя листа - "HolidaysTable", или изменить при необходимости:

C:\Users\TChivs\Desktop\Macro\[holidays.xlsx]HolidaysTable!$A$2:$A:$20

В качестве альтернативы, поскольку кажется, что вы создаете CSV с этими вычислениями, было бы лучше просто произвести вычисления на стороне VBA (т. Е. не в формуле рабочего листа, которая впоследствии уничтожается в его значение только при сохранении в формате CSV), я думаю, я бы использовал немного другой подход к дизайну вашего приложения:

Вместо того, чтобы открывать один из многих файлов XLSM, которые что-то делают (то же самое?), Используйте только ОДИН файл .xlsm, который содержит информацию о праздниках и любой другой код макроса / VBA, который вам нужен. Теперь, что касается «многих» файлов XLSM, каждый из них должен быть задан в качестве параметра для каждой соответствующей запланированной задачи, поэтому у вас будет что-то вроде

  1. Task1 = Открывает main.xlsm с параметром "C: \ pathto \ bar.xlsm"
  2. Task2 = Открывает main.xlsm с параметром "C: \ pathto \ foo.xlsm"
  3. Task3 = Открывает main.xlsm с параметром "C: \ pathto \ another.xlsm"

Таким образом, у вас есть весь код, праздники и т. Д. В одном источнике ("main.xlsm"), который делает что-то с другими файлами, как запланировано через диспетчер задач.

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