Экспорт в PDF макросом. С изменением данных на листах

Автор luu, 1 августа 2023, 13:19

0 Пользователи и 1 гость просматривают эту тему.

sokol92

#15
Исправил вложение - забыл про свойство Selection из FilterData.
@bigor, еще раз спасибо!

На всякий случай, описание параметров (с примерами) экспорта в pdf здесь.
Владимир.

sokol92

Еще одна версия без скрытия / открытия листов (это были ложные "знания" поведения Excel при экспорте в PDF).
Владимир.

luu

Мужчины, вы просто гуру. Спасибо большое. Жму руку.
Пошел подкручивать под реальный файл

luu

Отлично, все получилось. Спасибо большое! Немного запутался с именами ячеек, но потом разобрался. Решение с именами диапазонов вместо указания адреса ячейки очень элегантное. Практически ничего править не пришлось в коде. Великолепно!

И все-таки, возвращаясь к вопросу об экспорте в один pdf, насколько сложно при выгрузке "склеивать" все в один итоговый файл?

bigor

Цитата: luu от  2 августа 2023, 08:27при выгрузке "склеивать" все в один итоговый файл
можно, как предлагал @sokol92 собрать все в один ods и затем его экспортировать в pdf. Но для меня сложности были бы с сохранением форматов.
можно сторонними прогами собрать все пдф в один, ручками или в макрос добавить строчку.
ну и еще как  вариант через draw собрать все pdf в один
Поддержать наш форум можно здесь

economist

Кроссплатформенная свободная утилита pdftk, которая может просто лежать в папке с PDF-ми:

pdftk *.pdf cat output skleen.pdf dont_ask
Из плюсов: скорость, безразличие к разным размерам бумаги, повороту страницы, вся meta-инфа сохраняется.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

sokol92

Следующая версия.  :)

Макрос ExportPdf выводит каждый лист отдельным файлом, макрос ExportPdf2 выводит все листы одним файлом.

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

Проверяйте!
Владимир.

luu

Цитата: sokol92 от  2 августа 2023, 13:53При отсутствии имени ячейки в листе - шаблоне (имени параметра) теперь аварийное сообщение формируется только в случае, когда значение параметра не пусто (ведь шаблон может и не содержать полный список параметров).
Отличное решение! действительно, не во всех Листах (формах) есть необходимые параметры. Я решил это тем, что сделал именованные диапазоны на пустых, неиспользуемых ячейках. Но так, конечно, куда культурнее.

С выгрузкой по одной форме все ок, работает как и было.
Но при при выгрузке в единый файл pdf есть загвоздка. Формы используют множество ссылок на ячейки, т.е. в зависимости от параметров, выставленных в наших именованных ячейках, заполняются и другие части формы, используя лист с данными (справочник). При выгрузке в единый pdf, т.е. при создании новых листов, которые потом удаляются, эти ссылки не работают. Показал на примере (значения действия и должность)

sokol92

#23
Следующая версия.  :)

В подобных случаях в сформированных листах можно менять в ячейках, содержащих формулы, формулы на их значения. В Calc для этого есть удобная и быстрая команда Диспетчера ConvertFormulaToValue.

Проверяйте!

Владимир.

luu

#24
В таком виде не работает. При пакетной выгрузке в один PDF, в формах намертво фиксируются значения, которые в них были, а они должны изменяться при изменении параметров в реестре. На примере первого же листа сформированного pdf:

Иванов И.И.
купить


Должно быть:
Действие: покупает
Должность: рабочий


А у нас получается то что на скрине

Т.е. нужно на листах-формах сначала изменять параметры (из реестра), фиксировать значение ячейки, дублировать в новый лист, затем возвращать формулу в ячейке на листе-форме, изменять параметр (брать следующую строку реестра), снова фиксировать значение, дублировать в новый лист и т.д. И после этого уже экспортировать в единый pdf-файл все надублированные листы. А на листах-формах снова возвращать формулы в ячейки для дальнейшей работы.
Логика действий мне видится такая, но я не знаю как эту логику в макрос реализовать )

sokol92

Типичная ошибка с моей стороны - приношу извинения. Дело в том, что новый файл обрабатывается в скрытом режиме и не все конструкции работают как хочется.

Исправил. Теперь будет показан небольшой мультфильм.

Проверяйте!
Владимир.

luu

Круто! Благодарю за труды.
Но, есть один нюанс... Листы-формы защищены от редактирования, чтобы пользователи не могли их сломать, защита убрана только на искомые ячейки с параметрами, которые берутся из реестра. Соответственно, при выгрузке в один pdf с листов-дубликатов, формулы из защищенных ячеек не работают.

В таком случае что можно сделать?

Прилагаю на нашем файле-примере. Пароль на защиту листа 1111

sokol92

Поскольку всё происходит на файле-копии, то можно и снять защиту. Добавьте перед вызовом макроса Range_ToValue строку

oDoc.Sheets.getByName(fileName).unprotect "1111"
А чтобы пользователи не подсмотрели пароль, можно зашифровать макрос.  :)
Владимир.

luu

Отлично! Все работает!
Всем спасибо большое!

luu

#29
Добрый день. При попытке модернизации функционала снова возник вопрос.
Пришла идея внести дополнительный лист реестра (условный "Реестр 2"), с набором немного других параметров.

Соответственно, хотим задавать имя листа реестра по его имени, эту строку в макросе меняем на следующую:
  ' Обрабатываем ячейки первого листа (реестра). Столбец A задает имя листа - шаблона,
  ' остальные столбцы - имена и значения вставляемых в шаблоны параметров.
  oSheet=oDoc.Sheets(0)                                     ' лист реестра

  ' Обрабатываем ячейки первого листа (реестра). Столбец A задает имя листа - шаблона,
  ' остальные столбцы - имена и значения вставляемых в шаблоны параметров.
  oSheet=oDoc.Sheets.getByName(SheetReestr)                 ' лист реестра

но как правильно передавать это имя для обработки, насколько я понимаю, мы вызываем процедуры ExportPdf(), ExportPDF2(), а нужно перевести их в функции с параметром?

Добавлено:

Все решил, просто добавлением переменной и передачей через запятую при вызове процедуры
  ExportPdfP 2, SheetReestr  Sub ExportPdfP(ByVal reg As Long, ByVal SheetReestr As String)