Печать переменных данных excel

Текстовый редактор Word обладает определенной функциональностью, которой нет в Excel. Например, функция слияния документов для серийной печати адресов писем на конвертах при массовой рассылке. Задумайтесь, на сколько был-бы практически применим этот инструмент в Excel, чтобы можно было печатать: счета фактур, отчеты, анкеты, бланки заказов, коммерческие предложения и др. В принципе с помощью программы Word мы можем применять инструмент слияния документов так, чтобы импортировать данные из Excel. Но это весьма сложное и не всегда удобно реализуемое решение. В данном примере мы с помощью VBA-макроса создадим свой альтернативный инструмент слияния в Excel. И продемонстрируем как использовать его для серийной печати документов при подготовке их к массовой рассылке по адресам клиентов получателей.

Подготовка слияния данных для серийной печати рассылок в Excel

Чтобы использовать в Excel преимущества серийной печати и слияния данных, в первую очередь необходимо создать таблицу с определенной структурой и контролем ввода в нее значений при заполнении. А после подготовки материалов, мы с помощью средств VBA напишем свой макрос, который будет выполнять серийную печать документов. Данные на основе которых будет реализована печать тиража, должны быть разделены на 2 части:

  1. Таблица с постоянными (не изменяющимися) значениями для информации, которая будет выполнять роль шаблона при многоразовой печати. Например: суть предложения, бланк заказа, отчет, реквизиты фактур Вашей фирмы и т.п. В данном примере эта таблица будет называться «Серийная Таблица».
  2. Таблица в которой все значения уникальны и подаются для заполнения реквизитов при многоразовой печати. Эти значения будут вставлены в соответственные места Серийной Таблицы. Например: адреса клиентов, имена и фамилии получателей и т.д. В данном примере вторая таблица будет навиваться «Таблица Данных».

Естественно правильно выполнять слияние данных из этих двух таблиц будет реализовано с помощью определенного макроса VBA.

Создание Серийной Таблицы с шаблоном для рассылки

Подготовка данных к серийной печати можно начать из создания любой таблицы. Но мы рекомендуем сначала создать Серийную Таблицу. Ведь она будет содержать больше информации, так как представляет собой форму шаблона с видом, наиболее приближенным к финальному результату. Просто потом его нужно заполнить переменными значениями из Таблицы Данных с помощью макроса.

Сначала создадим лист для серийной печати. Самая упрощенная версия документа, подготовленного к заполнению переменными данными перед серийной печатью, изображена на рисунке:

создать Серийную Таблицу.

Несложно догадаться, что ячейки B3, B4, B6 и B7 предназначены для заполнения переменными данными из Таблицы Данных. А в ячейку B9 введем формулу, которая автоматически вычислит сроки реализации заказа с учетом даты его составления. Допустим на строки реализации дается 2 недели, тогда вводим простую формулу: =B3+14.

Подготовка Таблицы Данных с реквизитами для рассылок

На отдельном листе создадим Таблицу Данных, которая будет содержать все переменные значения, подставляемые в соответственные места Серийной Таблицы. На следующем рисунке изображен простой пример Таблицы Данных из серийными переменными значениям:

создадим Таблицу Данных.

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

Так же следует помнить о том, то Таблица Данных должна быть полностью заполнена. Если будет пустая ячейка, тогда будет опущено значение. А если будет пустая целая строка, тогда будет прервана серия печати. Положение Таблицы Данных не обязательно должно начинаться с ячейки A1. Ее адрес расположения укажем в VBA-коде макроса.

Также важно учитывать тот факт, что листы обеих таблиц должны находиться в одной рабочей книге Excel. Для функционирования кода макроса не важно будут ли в этой книге находиться другие листы. Так же на данном этапе для макроса не играют особой роли названия листов. После переименования названий листов, просто следует указать их имена в коде макроса.



Слияние данных обеих таблиц в Excel с помощью макроса

Заполнение серийной таблицы значениями, собранными в Таблице Данных выполнить за нас программа VBA-макроса. Для этого откройте редактор Visual Basic (ALT+F11) и создайте модуль: «Insert»-«Module», чтобы в него записать этот код макроса:

Sub PechatSerii()
  On Error Resume Next
  Dim ListSerii As Worksheet
  Dim ListDannye As Worksheet
Dim DiapazS As Range
Dim DiapazD As Range
Dim Stroki As Long
Dim Stolbec As Long
Dim Yacheyki As Range
Dim Rekvizit As Range
Dim NameListSerii As String
Dim NameListDanye As String
Dim AdresDannye As String
Dim AdresRekvizitov As String
'настройки структуры книги
NameListSerii = "Серии"
NameListDanye = "Данные"
AdresDannye = "A2:D20"
AdresRekvizitov = "B3, B4, B6, B7"
'код программы
Set ListSerii = ActiveWorkbook.Worksheets(NameListSerii)
Set ListDannye = ActiveWorkbook.Worksheets(NameListDanye)
Set DiapazS = ListSerii.Range(AdresRekvizitov)
Set DiapazD = ListDannye.Range(AdresDannye)
For Stroki = 1 To DiapazD.Rows.Count
 Stolbec = 1
 For Each Rekvizit In DiapazS
  Set Yacheyki = DiapazD.Cells(Stroki, Stolbec)
  Stolbec = Stolbec + 1
Rekvizit.Formula = Yacheyki.Value
Next Rekvizit
ListSerii.PrintOut
Next Stroki
MsgBox ("Отравлено на печать" & _
CStr(Stroki - 1) & " бланков")
On Error GoTo 0
End Sub

Код VBA-макроса.

В коде применяются 2 цикла:

  1. For Stroki = 1 To DiapazD.Rows.Count – Первый проходить по всем строкам Таблицы Данных. Количество проходов зависит от значения в переменной Stroki. А ее значение получено путем определения количества заполненных строк в Таблице Данных. Адрес этой таблицы находится в переменной DiapazDannye.
  2. For Each Rekvizit In DiapazS – Второй цикл находиться внутри первого. Он отвечает за поочередное заполнение соответственных ячеек на листе где находится Серийная Таблица. А данные берет со строк Таблицы Данных. Количество циклов определяется значением переменной Yacheyki. А ее значение получено путем определения количества ячеек в исходной строке.

Когда макрос Excel пройдет по всем циклам, тогда можно вызвать окно сообщения (MsgBox) о количестве напечатанных документов. То есть сколько было выполнено непрерывных циклов в процессе выполнения кода.

В макросе используются еще 2 переменные с адресами диапазонов ячеек:

  1. DiapazS – содержит адрес на несмежный диапазон ячеек для Серийной Таблицы, в которую будут вводиться переменные значения.
  2. DiapazD – содержит адрес на смежный диапазон ячеек для Таблицы Данных из которой будут браться переменные значения для заполнения.

Чтобы более-менее было удобно приспособить функционирование макроса к изменениям таблиц на листах, адреса на диапазоны ячеек подаются в текстовых переменных AdresRekvizitov и AdresDannye. Благодаря функции Range значения этих переменных из типа строки (As String) преобразуются в тип адреса (As Range):


Set DiapazS = ListSerii.Range(AdresRekvizitov)
Set DiapazD = ListDannye.Range(AdresDannye)

Такой подход к построению макроса имеет определенные преимущества. Можно свободно редактировать и изменять адреса диапазонов для обеих таблиц при их изменении размера или структуры:


AdresDannye = «A2:D20»
AdresRekvizitov = «B3, B4, B6, B7»

Макрос будет работать без проблем.

Код макроса содержит некоторую информацию о структуре данной рабочей книги Excel: размещение исходных данных и целевых, а также названия листов. Сами названия листов указаны в строковых переменных NameListSerii и NameListDannye.

Естественно можно использовать другие названия листов, только не забывайте соответственно отредактировать значения в строках для этих переменных:


NameListSerii = «Серии»
NameListDanye = «Данные»

А также:


AdresDannye = «A2:D20»
AdresRekvizitov = «B3, B4, B6, B7»

В том случаи если изменились размеры или адреса диапазонов таблиц на этих листах просто отредактируйте значение в соответственных переменных.

Обратите внимание, что при указании несмежного диапазона адреса между ячейками мы разделяем запятыми. Также количество ячеек в каждой строке Таблицы Данных соответствует количеству поданных адресов ячеек для несмежного диапазона в Серийной Таблице. Все данные собираются и вводятся по очереди. Например, в ячейку Серии!B3 по очереди будут заполняться все значения из столбца Данные!A:A, а в ячейку Серии!B3 – попадут значения из столбца Данные!B:B и т.д.

На этапе тестирования макроса нет необходимости рисковать ошибочной печатью документов и тратит офисные листы бумаги. Достаточно лишь поменять строку кода:

ListSerii.PrintOut

на временную строку которая включит режим предварительного просмотра:

ListSerii.PrintPreview

В таком режиме макрос Excel не будет направлять данные на принтер, а просто выведет документ на предварительный просмотр печати.

Процесс слияния данных и серийной печати рассылок из Excel

Когда уже создадите и заполните все таблицы необходимыми значениями, можно запустить свой макрос для серийной печати. Нажимаете комбинацию клавиш (ALT+F8) из списка в появившемся окне выбираем имя макроса «PechatSerii» и нажимаем на кнопку «Выполнить».

Циклы инструкций кода сразу проходят по всем строкам Таблицы Данных и поочередно вводят собранные значения из ячеек строк в соответственные ячейки Серийной Таблицы. После заполнения каждого комплекта данных выполняется печать готового текущего документа.

Данный процесс повторяется ровно столько раз сколько строк содержит Таблица Данных. После завершения действия макроса выводиться сообщение с информацией о завершении генерации документов и о их количестве отправленных на печать:

Информация о количестве.

После завершения действия макроса Серийная Таблица будет содержать данные полученные из последней строки Таблицы Данных. Как показано ниже на рисунке:

Готов бланк.

Таким образом у нас получилось автоматизировать большой объем роботы с помощью макроса и без использования программы Word.

Три способа печати переменных данных

Возможность персонализировать продукцию — одно из ключевых преимуществ цифровой печати, но многие типографии им не пользуются. Чтобы восполнить этот пробел, поговорим о трёх бесплатных способах добавлять переменные данные в макет.

Но сперва рассмотрим готовность сервера печати к работе с переменными данными. На всех серверах EFI Fiery для этого присутствует механизм EFI FreeForm. Вы отдельно готовите файл с переменной частью и отдельно — с постоянной формой. Форма загружается на контроллер и предварительно растрируется. Для этого на вкладке VDP в параметрах работы при отправке работы говорим контроллеру: «Создать МАСТЕР». Переменная часть растрируется отдельно и «совмещается» на лету с формой, для чего при отправке переменой части на вкладке VDP указываем «Использовать МАСТЕР».

Способ 1

Microsoft Word. Mail merge

  1. Сохраните таблицу с переменными данными в Excel. В первой строке должны быть названия полей.
  2. Откройте шаблон документа в Word.
  3. Привяжите данные из Excel (Mailings -> Select recipients -> Use an existing list… / Рассылки -> Выбрать получателей -> Использовать существующий список).
  4. Укажите, что данные находятся на заданном листе (Sheet), а первая строка — строка с наименованием полей (First row of data contains column headers).
  5. Вставьте поля в документ (Mailings -> Insert merge field / Рассылка -> Вставить поле слияния).
  6. Выведите на печать документ с переменными данными (Mailings -> Finish & merge… / Рассылка -> Найти и объединить). Во вкладке VDP укажите «Использовать мастер».

Способ 2

Adobe InDesign. Data merge

  1. Создайте таблицу с переменными данными в Excel или другом редакторе. В первой строке должны быть названия полей.
  2. В начале имени поля введите символ «@» для вставки текста или путей, указывающих на файлы изображений (в Excel — «’@»).
  3. Сохраните файл в формате CSV с кодировкой Unicode или в формате текстового документа (.txt). Разделители — запятые или знаки табуляции.
  4. Откройте окно Data Merge в InDesign (Window -> Utilities -> Data Merge).
  5. Выберите источник данных (дополнительные настройки -> Select Data Source -> укажите файл с данными) и настройте формат импорта.
  6. При редактировании вставьте данные двойным щелчком по соответствующему полю в окне Data Merge.

Способ 3

EFI FreeForm Create

Пожалуй, самый удобный и продвинутый способ. В частности позволяет создавать штрихкоды, в том числе QR-коды. Но работает только на относительно новых серверах печати EFI Fiery.

  1. Задайте форму — файл PDF или PS.
  2. Задайте источник данных — файл CSV или Excel. В первой строке должны быть названия полей.
  3. Укажите соответствие полей и типов данных.
  4. Доработайте вёрстку макета.
  5. Напечатайте документ, отправив его на контроллер Fiery по сети. Или сохраните в промежуточном формате (FFP file).
 

jfd

Пользователь

Сообщений: 302
Регистрация: 01.01.1970

#1

29.01.2013 18:10:48

Здравствуйте!
Надо задать область печати по последней заполненной ячейке. Приведенный ниже макрос корректно определяет последнюю строку и столбец. Ячейка в строке, по которой определяется последний столбец имеет длинный текст, который выходит за границу ячейки/столбца и не смотря на правильно определенный и заданный номер последнего столбца область печати задается не по указанному столбцу, а по краю длинного текста.
Что с этим делать, подскажите?

Код
Sub пример()
    Windows("пример.xlsx").Activate
    LastRow = ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count - 1
    LastClm = Cells(1, Columns.Count).End(xlToLeft).Column
    MsgBox LastRow
    MsgBox LastClm
    ActiveSheet.PageSetup.PrintArea = Range(Cells(1, 1), Cells(LastRow, LastClm))
        End Sub

Прикрепленные файлы

  • пример установки области печати.xlsm (18.23 КБ)

Изменено: jfd29.01.2013 18:11:55

 

Sergei_A

Пользователь

Сообщений: 443
Регистрация: 05.01.2013

#2

29.01.2013 19:06:29

Не хватило самой малости

Код
ActiveSheet.PageSetup.PrintArea = Range(Cells(1, 1), Cells(LastRow, LastClm)).Address
 

jfd

Пользователь

Сообщений: 302
Регистрация: 01.01.1970

Спасибо, все заработало как надо.
Но почему не работало если подставлялись правильные значения строк и столбцов диапазона?

 

The_Prist

Пользователь

Сообщений: 14182
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

Потому что свойство PrintArea принимает в качестве аргумента текст(т.е. адрес диапазона), а не сам диапазон как объект.

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

Добрый всем вечер.
Подскажите, пожалуйста, как изменить данный макрос, чтобы область печати задавать по последней не пустой строке (или ячейке) только определенного диапазона столбцов, например А:Н.
Использую режим разметки страницы, необходимо выводить на печать только первую страницу и те, которые расположены под ней (при их заполнении), без страниц, расположенных справа от первой.
Заранее всем большое спасибо!

 

Sergei_A

Пользователь

Сообщений: 443
Регистрация: 05.01.2013

#6

12.03.2013 20:19:57

Код
Sub PrintArea()
    LastRow = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
    ActiveSheet.PageSetup.PrintArea = Range(Cells(1, 1), Cells(LastRow, 8)).Address
End Sub

8 — это номер столбца H

 

Выдает ошибку — переменная не определена(

 

Kuzmich

Пользователь

Сообщений: 7998
Регистрация: 21.12.2012

 

Sergei_A

Пользователь

Сообщений: 443
Регистрация: 05.01.2013

#9

12.03.2013 21:20:49

SerjVorotilov,  сорри, к Option Explicit я себя пока не приучил  :)
Можно обойтись без переменной

Код
Sub PrintArea()
    With ActiveSheet
        .PageSetup.PrintArea = Range(Cells(1, 1), Cells(.Cells(Rows.Count, 1).End(xlUp).Row, 8)).Address
    End With
End Sub
 

Большое спасибо Вам, Sergei_A и Kuzmich
Чуть позже отпишусь.

 

Что-то не могу понять — область печати в обоих случаях — диапазон А1:Н1, несморя на наличие данных в ячейках, расположенных ниже (но в диапазоне А:Н)
Может что-то не так делаю?
Или не так объяснил?
Необходимо, чтобы область печати была от А1 до Нх, где х — номер строки, содержащей последнюю непустую ячейку в столбах А-Н.
Файл прилагаю

Прикрепленные файлы

  • 1.xlsm (15.85 КБ)

 

Sergei_A

Пользователь

Сообщений: 443
Регистрация: 05.01.2013

#12

13.03.2013 00:06:23

Не думал, что у Вас первый столбец пустой, по-этому всегда лучше сразу кидать пример

Код
Sub PrintArea()
Dim LastRow As Long
    LastRow = ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count - 1
    ActiveSheet.PageSetup.PrintArea = Range(Cells(1, 1), Cells(LastRow, 8)).Address
End Sub
 

Спасибо, Сергей, то что нужно.

 

jfd

Пользователь

Сообщений: 302
Регистрация: 01.01.1970

#14

13.03.2013 00:16:13

Кажется самый простой вариант

Код
Sub PrintArea11()
PageSetup.PrintArea = Range(Cells(1, 1), Cells(Cells.SpecialCells(xlLastCell).Row, 8)).Address
End Sub
 

SerjVorotilov

Пользователь

Сообщений: 231
Регистрация: 01.01.1970

#15

13.03.2013 00:30:10

Сделал через Worksheet_SelectionChange:

Код
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim LastRow As Long
    LastRow = ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count - 1
    ActiveSheet.PageSetup.PrintArea = Range(Cells(1, 1), Cells(LastRow, 8)).Address
End Sub

Еще раз огромное спасибо Вам, Сергей.

 

SerjVorotilov

Пользователь

Сообщений: 231
Регистрация: 01.01.1970

#16

13.03.2013 00:33:51

Сделал через Worksheet_SelectionChange:

Код
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim LastRow As Long
    LastRow = ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count - 1
    ActiveSheet.PageSetup.PrintArea = Range(Cells(1, 1), Cells(LastRow, 8)).Address
End Sub

Еще раз огромное спасибо Вам, Сергей.

Блин, только при использовании Worksheet_SelectionChange макрос начинает реагировать на ввод данных в столбцы, выходящие за определенный мной диапазон А:Н, что не есть гуд.

 

Sergei_A

Пользователь

Сообщений: 443
Регистрация: 05.01.2013

#17

13.03.2013 00:42:26

Воспользуйтесь событием Workbook_BeforePrint
в модуль книги

Код
Private Sub Workbook_BeforePrint(Cancel As Boolean)
Dim LastRow As Long
LastRow = ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count - 1
ActiveSheet.PageSetup.PrintArea = ActiveSheet.Range(Cells(1, 1), Cells(LastRow, 8)).Address
End Sub

Изменено: Sergei_A13.03.2013 00:44:00

 

marchela

Пользователь

Сообщений: 8
Регистрация: 30.11.2018

Здравствуйте!
Пожалуйста, помогите решить проблему:
Вышеуказанные примеры работают, НО
надо определить последнюю строку/столбец на листе БЕЗ учета форматов и формул — только по отображаемому значению в ячейке,
то есть:
есть на листе большая таблица и последние строки заполнены формулами, возвращающими пустую ячейку(=»»), Ваши предыдущие варианты вернут строку/столбец ячейки с последней формулой, в то время как нужно вернуть адрес ячейки только в случае, если в ячейке реально отображается какое-то значение.
Ну а по этим значениям уже задать область печати.
Спасибо за ответ!

 

Sanja

Пользователь

Сообщений: 14838
Регистрация: 10.01.2013

Согласие есть продукт при полном непротивлении сторон.

 

marchela

Пользователь

Сообщений: 8
Регистрация: 30.11.2018

#20

18.01.2019 12:13:25

Доброго дня!

Почему не в тему? У меня похожая задача. Смотрите вложение
По вышеприведенному коду

Сделал через Worksheet_SelectionChange:

Код
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim LastRow As Long
   LastRow = ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count - 1
   ActiveSheet.PageSetup.PrintArea = Range(Cells(1, 1), Cells(LastRow, 4)).Address
End Sub

у меня работает, но только нужно реализовать выделение области БЕЗ учета форматов и формул — только по отображаемому значению в ячейке.

КАК ОПРЕДЕЛИТЬ ПОСЛЕДНЮЮ ЯЧЕЙКУ НА ЛИСТЕ ЧЕРЕЗ VBA? СПОСОБ 4

Да видел я этот пример — с реализацией туго    , помогите, пожалуйста, соединить этот код с кодом из способа 4
лист Главная — при выборе из выпадающего списка в колонке В динамически меняется информация (то 10 строк, то 40 строк и т.д.), которую и надо распечатать

Прикрепленные файлы

  • Требование-накладная-тест.rar (33.43 КБ)

Изменено: marchela18.01.2019 12:20:36

 

Юрий М

Модератор

Сообщений: 60586
Регистрация: 14.09.2012

Контакты см. в профиле

marchela, код следует оформлять соответствующим тегом: ищите такую кнопку (см. скрин) и исправьте своё сообщение.

 

Юрий М

Модератор

Сообщений: 60586
Регистрация: 14.09.2012

Контакты см. в профиле

#22

18.01.2019 12:24:26

И ещё:

Цитата
marchela написал:
а по этим значениям уже задать область печати

Т.е. Ваш вопрос лишь косвенно связан с этой темой — задание области печати.
Так что Sanja  прав: поиск последней заполненной ячейки — вопрос не для этой темы.

 

Antag

Пользователь

Сообщений: 52
Регистрация: 06.08.2022

Получится задать разные области печати на нескольких листах книги, чтобы область печати менялась в зависимости от значения одной ячейки в другом листе?

Если Главный!R6=»a» → область печати одна,
при всех других значениях Главный!R6 → область печати другая.

 

MikeVol

Пользователь

Сообщений: 230
Регистрация: 20.10.2020

Ученик

#24

24.01.2023 09:17:05

Antag  Доброго времени суток. Возможно я не понял вас правильно. Как понял. Вариант:

Код
Option Explicit

Sub Antag_Print()
    Dim i As Long, lRow As Long, lCol As Long, iRow As Long, iCol As Long

    For i = 1 To Sheets.Count

        If ThisWorkbook.Sheets(i).Name <> "Главный" Then

            If ThisWorkbook.Worksheets("Главный").Cells(6, 18) = "a" Then
                lRow = ThisWorkbook.Sheets(i).UsedRange.Row
                lCol = ThisWorkbook.Sheets(i).UsedRange.Column
                iRow = ThisWorkbook.Sheets(i).Cells(Rows.Count, lCol).End(xlUp).Row
                iCol = ThisWorkbook.Sheets(i).Cells(lRow, Columns.Count).End(xlToLeft).Column
                ThisWorkbook.Sheets(i).PageSetup.PrintArea = ThisWorkbook.Sheets(i).Range(ThisWorkbook.Sheets(i).Cells(lRow, lCol), _
                        ThisWorkbook.Sheets(i).Cells(iRow, iCol)).Address
            Else
                lRow = ThisWorkbook.Sheets(i).UsedRange.Row + ThisWorkbook.Sheets(i).UsedRange.Rows.Count - 1
                lCol = ThisWorkbook.Sheets(i).UsedRange.Column + ThisWorkbook.Sheets(i).UsedRange.Columns.Count - 1
                ThisWorkbook.Sheets(i).PageSetup.PrintArea = ThisWorkbook.Sheets(i).Range(ThisWorkbook.Sheets(i).Cells(1, 1), _
                        ThisWorkbook.Sheets(i).Cells(lRow, lCol)).Address
            End If

        End If

    Next i

End Sub

Изменено: MikeVol24.01.2023 09:23:29

 

Antag

Пользователь

Сообщений: 52
Регистрация: 06.08.2022

#25

24.01.2023 16:05:48

Цитата
написал:
Возможно я не понял вас правильно

Если Главный!R6=»a» → область печати на других (но не на всех) листах A1:G256,
при всех других значениях Главный!R6 → область печати на других (но не на всех) листах A1:M256.

Изменено: Antag24.01.2023 16:06:08

 

MikeVol

Пользователь

Сообщений: 230
Регистрация: 20.10.2020

Ученик

#26

24.01.2023 18:15:11

Antag,

Цитата
Antag написал:
Если Главный!R6=»a» → область печати на других (но не на всех) листах A1:G256

вы этого не указали в своём стартовом посте

#23

Думаю что при таких раскладах вам не составит большого труда подстроить под ваши нужды выше мной выложеный код. Необходимо изначально чётко ставить задачи, тут экстрасенсорными способностями никто не обладает. Удачи вам.

Изменено: MikeVol24.01.2023 18:16:32

 

_Boroda_

Пользователь

Сообщений: 1496
Регистрация: 27.07.2013

Контакты см. в профиле

#27

25.01.2023 09:26:46

Для листов 1 и 3. Без макросов. См. Диспетчер имен

Прикрепленные файлы

  • Print_Area_1.xlsb (13.85 КБ)

Скажи мне, кудесник, любимец ба’гов…

Как напечатать док-ты заданной формы с данными из таблицы

marysabel

Дата: Вторник, 14.04.2015, 18:11 |
Сообщение № 1

Группа: Пользователи

Ранг: Прохожий

Сообщений: 8


Репутация:

0

±

Замечаний:
0% ±


Excel 2003

Уважаемые форумчане!
Есть задача:
1. Существует таблица с данными (в примере – лист «таблица»)
2. Есть форма документа для печати (в примере – лист «форма для печати»)
Требуется распечатать несколько форм с данными из таблицы, указывая номер п/п. Например, в диалоге ввожу «2-4», должны распечататься три формы с данными из таблицы из строк №2,3,4.

Прошу вас , если кто встречал на этом форуме похожую задачу, поделитесь ссылкой на пост…. Или намекните, как лучше реализовать – шаблоны, макросы?… Даже не знаю, с чего начать… Я разберусь, литературу почитаю… Передо мной, наверно, не первой такая проблемка появилась, так что наверно уже есть решения… Заранее спасибо.
[moder]Начните с Правил этого форума.
Поправьте название темы.
Потом мы перенесем ее в нужный раздел (уже перенесли — кто-то более добр, чем я), а потооооом уже появятся ответы.

К сообщению приложен файл:

4243283.xls
(17.0 Kb)


Вы думаете, что в сказку попали? Нет, это вы в жизнь вляпались….

Сообщение отредактировал marysabelВторник, 14.04.2015, 19:16

 

Ответить

МВТ

Дата: Вторник, 14.04.2015, 20:38 |
Сообщение № 2

Группа: Проверенные

Ранг: Обитатель

Сообщений: 476


Репутация:

137

±

Замечаний:
0% ±


Excel 2007

При помощи ВПР()

Код

=ЕСЛИОШИБКА(ВПР(‘форма для печати’!B3;таблица!B3:C17;2;0);»»)

и т.п.

Сообщение отредактировал МВТВторник, 14.04.2015, 22:24

 

Ответить

marysabel

Дата: Вторник, 14.04.2015, 21:43 |
Сообщение № 3

Группа: Пользователи

Ранг: Прохожий

Сообщений: 8


Репутация:

0

±

Замечаний:
0% ±


Excel 2003

Чем мне поможет эта функция? Не поняла… Пример прицеплен для наглядности, а в реале в таблице до 500 строк. Надо печатать 200-250 документов по форме на втором листе. То есть, надо вывести на печать форму со второго листа, где все данные будут по Иванову Ивану Ивановичу, потом распечатать такой же документ с данными по Петрову, и так далее, пока не распечатаются все документы по людям из заданного диапазона…


Вы думаете, что в сказку попали? Нет, это вы в жизнь вляпались….

Сообщение отредактировал marysabelВторник, 14.04.2015, 21:47

 

Ответить

Pelena

Дата: Вторник, 14.04.2015, 22:22 |
Сообщение № 4

Группа: Админы

Ранг: Местный житель

Сообщений: 18797


Репутация:

4284

±

Замечаний:
±


Excel 2016 & Mac Excel

Слиянием не хотите воспользоваться?


«Черт возьми, Холмс! Но как??!!»
Ю-money 41001765434816

 

Ответить

marysabel

Дата: Вторник, 14.04.2015, 22:36 |
Сообщение № 5

Группа: Пользователи

Ранг: Прохожий

Сообщений: 8


Репутация:

0

±

Замечаний:
0% ±


Excel 2003

Pelena, ОГРОМНОЕ человеческое СПАСИБО!!! Это то, что мне нужно для реализации задачи.


Вы думаете, что в сказку попали? Нет, это вы в жизнь вляпались….

 

Ответить

Kuzmich

Дата: Среда, 15.04.2015, 00:47 |
Сообщение № 6

Группа: Проверенные

Ранг: Ветеран

Сообщений: 707


Репутация:

154

±

Замечаний:
0% ±


Excel 2003

Можно печатать и в рамках Excel.
На листе Таблица в ячейках J1 и L1 вводите номера документов
для печати, например 1 и 3 (печатать с 1 по 3)
Можно вставить кнопку на лист и запустить макрос (в модуле листа Таблица),
[vba]

Код

Private Sub CommandButton1_Click()
Dim i As Long
Dim Nomer As Integer
Dim FoundNomer
    Nomer = Range(«J1»)
     Do
     Set FoundNomer = Columns(1).Find(Nomer, , xlValues, xlWhole)
     With Worksheets(«форма для печати»)
         .Range(«B3») = Cells(FoundNomer.Row, 2)  ‘номер документа
         .Range(«B5») = Cells(FoundNomer.Row, 3)  ‘ФИО
         .Range(«B7») = Cells(FoundNomer.Row, 4)  ‘гражданство
         .Range(«B9») = Cells(FoundNomer.Row, 5)  ‘дата
         .Range(«B11») = Cells(FoundNomer.Row, 6) ‘паспорт
         .PrintPreview
         Nomer = Nomer + 1
     End With
     Loop While Nomer <> Range(«L1») + 1
End Sub

[/vba]
Для печати замените строку .PrintPreview на .PrintOut

 

Ответить

200?’200px’:»+(this.scrollHeight+5)+’px’);»> Private Sub Workbook_BeforePrint(Cancel As Boolean)
Dim R$, RN$, N&
If ActiveSheet.Name = «Лист1» Then
‘ Блок для переопределения диапазона печати — его можно вставить в свой макрос
R = ActiveSheet.PageSetup.PrintArea ‘ эта переменная нужна только если нужно будет возвращать текущий диапазон для печати ==============
N = Cells(Rows.Count, 2).End(xlUp).Row ‘ ==============
RN = Range(«A1:F» & N).Address ‘ ==============
ActiveSheet.PageSetup.PrintArea = RN ‘ ==============
‘==============================================================================

‘Блок печати и возвращения начального диапазона для печати
Application.EnableEvents = False
Range(RN).PrintOut
ActiveSheet.PageSetup.PrintArea = R
Application.EnableEvents = True
Cancel = True
‘==============================================================================
End If
End Sub

Макрос будет запускаться перед печатью и переопределять диапазон по заполненному 2-му столбцу.
Выделенный блок можете просто вставить в свой исходный код, чтобы после его завершения происходило переопределение диапазона печати.

200?’200px’:»+(this.scrollHeight+5)+’px’);»> Private Sub Workbook_BeforePrint(Cancel As Boolean)
Dim R$, RN$, N&
If ActiveSheet.Name = «Лист1» Then
‘ Блок для переопределения диапазона печати — его можно вставить в свой макрос
R = ActiveSheet.PageSetup.PrintArea ‘ эта переменная нужна только если нужно будет возвращать текущий диапазон для печати ==============
N = Cells(Rows.Count, 2).End(xlUp).Row ‘ ==============
RN = Range(«A1:F» & N).Address ‘ ==============
ActiveSheet.PageSetup.PrintArea = RN ‘ ==============
‘==============================================================================

‘Блок печати и возвращения начального диапазона для печати
Application.EnableEvents = False
Range(RN).PrintOut
ActiveSheet.PageSetup.PrintArea = R
Application.EnableEvents = True
Cancel = True
‘==============================================================================
End If
End Sub

Макрос будет запускаться перед печатью и переопределять диапазон по заполненному 2-му столбцу.
Выделенный блок можете просто вставить в свой исходный код, чтобы после его завершения происходило переопределение диапазона печати. SLAVICK

Иногда все проще чем кажется с первого взгляда.

200?’200px’:»+(this.scrollHeight+5)+’px’);»> Private Sub Workbook_BeforePrint(Cancel As Boolean)
Dim R$, RN$, N&
If ActiveSheet.Name = «Лист1» Then
‘ Блок для переопределения диапазона печати — его можно вставить в свой макрос
R = ActiveSheet.PageSetup.PrintArea ‘ эта переменная нужна только если нужно будет возвращать текущий диапазон для печати ==============
N = Cells(Rows.Count, 2).End(xlUp).Row ‘ ==============
RN = Range(«A1:F» & N).Address ‘ ==============
ActiveSheet.PageSetup.PrintArea = RN ‘ ==============
‘==============================================================================

‘Блок печати и возвращения начального диапазона для печати
Application.EnableEvents = False
Range(RN).PrintOut
ActiveSheet.PageSetup.PrintArea = R
Application.EnableEvents = True
Cancel = True
‘==============================================================================
End If
End Sub

Макрос будет запускаться перед печатью и переопределять диапазон по заполненному 2-му столбцу.
Выделенный блок можете просто вставить в свой исходный код, чтобы после его завершения происходило переопределение диапазона печати. Автор — SLAVICK
Дата добавления — 15.07.2015 в 09:35

Источник

Метод Sheets.PrintOut (Excel)

Синтаксис

expression. PrintOut (From, To, Copies, Preview, ActivePrinter, PrintToFile, Collate, PrToFileName, IgnorePrintAreas)

выражение: переменная, представляющая объект Sheets.

Параметры

Имя Обязательный или необязательный Тип данных Описание
From Необязательный Variant Номер страницы, с которой начинается печать. Если этот аргумент опущен, печать начинается в начале.
Для Необязательный Variant Номер последней страницы для печати. Если этот аргумент опущен, печать заканчивается последней страницей.
Copies Необязательный Variant Число копий для печати. Если этот аргумент опущен, выводится одна копия.
Предварительный просмотр Необязательный Variant Значение true , чтобы Microsoft Excel вызвал предварительный просмотр перед печатью объекта. Значение false (или опущено) для немедленной печати объекта.
ActivePrinter Необязательный Variant Задает имя активного принтера.
PrintToFile Необязательный Variant Значение true для печати в файл. Если Параметр PrToFileName не указан, Excel предложит пользователю ввести имя выходного файла.
Collate Необязательный Variant Значение true для сортировки нескольких копий.
PrToFileName Необязательный Variant Если параметр PrintToFile имеет значение True, этот аргумент указывает имя файла, в который нужно напечатать.
IgnorePrintAreas Необязательный Variant Значение true для пропуска областей печати и печати всего объекта.

Возвращаемое значение

Примечания

«Страницы» в описаниях from и To относится к печатным страницам, а не к общим страницам на листе или книге.

Пример

В этом примере выводится активный лист.

В этом примере выполняется печать со страницы 2 на страницу 3.

В этом примере выводится три копии со страницы 2 на страницу 3.

Поддержка и обратная связь

Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.

Источник

VBA Excel. Объект PageSetup (параметры страницы)

Параметры печатной страницы в VBA Excel. Свойство PageSetup объекта Worksheet. Объект PageSetup и описание некоторых его свойств с примерами.

Описание объекта PageSetup

Объект PageSetup возвращается свойством PageSetup объекта Worksheet:

где Expression — это выражение (переменная), возвращающее объект Worksheet.

Свойства объекта PageSetup

Диапазон печати

Установить диапазон для печати из кода VBA Excel можно с помощью свойства PageSetup.PrintArea:

Размеры полей

Свойства, отвечающие за размер полей печатной страницы:

Свойство Описание
LeftMargin Возвращает или задает размер левого поля
TopMargin Возвращает или задает размер верхнего поля
RightMargin Возвращает или задает размер правого поля
BottomMargin Возвращает или задает размер нижнего поля

Свойства, отвечающие за размер полей, предназначены для чтения и записи, выражаются в точках (1 точка равна 1/72 дюйма или ≈1/28 см). Тип данных — Double.

Для того, чтобы вручную не высчитывать количество точек в дюймах или сантиметрах, существуют методы Application.InchesToPoints и Application.CentimetersToPoints, которые автоматически переводят дюймы и сантиметры в точки.

Пример задания размеров полей для печатной страницы:

Источник

Vba excel печать диапазона ячеек

В общем надо сделать что-то в виде макроса.
Вывести сообщение: «Введите номер партии» — Вводят например цифру 1.
Еще 1 сообщение: «введите количество кип в партии» — Вводят например цифру 10.

И надо, чтоб выходило на печать 10 бумажек, в которых будет порставлено на каждой номер партии (в моем случае цифра 1 ) и по порядку кол-во кип (в моем случае 1-10)
Т.е. 1) Номер партии 1
кипа 1
2) Номер партии 1
кипа 2
3) Номер партии 1
кипа 3

В общем надо сделать что-то в виде макроса.
Вывести сообщение: «Введите номер партии» — Вводят например цифру 1.
Еще 1 сообщение: «введите количество кип в партии» — Вводят например цифру 10.

И надо, чтоб выходило на печать 10 бумажек, в которых будет порставлено на каждой номер партии (в моем случае цифра 1 ) и по порядку кол-во кип (в моем случае 1-10)
Т.е. 1) Номер партии 1
кипа 1
2) Номер партии 1
кипа 2
3) Номер партии 1
кипа 3

Сообщение В общем надо сделать что-то в виде макроса.
Вывести сообщение: «Введите номер партии» — Вводят например цифру 1.
Еще 1 сообщение: «введите количество кип в партии» — Вводят например цифру 10.

И надо, чтоб выходило на печать 10 бумажек, в которых будет порставлено на каждой номер партии (в моем случае цифра 1 ) и по порядку кол-во кип (в моем случае 1-10)
Т.е. 1) Номер партии 1
кипа 1
2) Номер партии 1
кипа 2
3) Номер партии 1
кипа 3

Заранее спасибо Автор — Silver
Дата добавления — 11.11.2013 в 06:28

KuklP Дата: Понедельник, 11.11.2013, 09:15 | Сообщение № 2
Ну с НДС и мы чего-то стoим! kuklp60@gmail.com
WM Z206653985942, R334086032478, U238399322728

Ответить

Silver Дата: Понедельник, 11.11.2013, 09:46 | Сообщение № 3
Скрипт Дата: Понедельник, 11.11.2013, 09:53 | Сообщение № 4

200?’200px’:»+(this.scrollHeight+5)+’px’);»> Sub Procedure_1()

Dim myPartyNumber As String
‘Делаем у переменной «myKipCount» тип данных «Variant», т.к. в ней
‘в коде могут быть числа и текст.
Dim myKipCount As Variant
Dim i As Long

‘Пользователь выбирает номер партии.
‘Данные помещаются в переменную «myPartyNumber».
myPartyNumber = InputBox(«Введите номер партии:»)

‘Проверка, что пользователь что-то ввёл и не нажал «Отмена».
If myPartyNumber = «» Then
‘Выход из процедуры.
Exit Sub
End If

‘Пользователь выбирает количество кип.
myKipCount = InputBox(«Введите количество кип:»)

‘Проверка, что пользователь ввёл число, иначе в коде
‘будет ошибка при выполнении математических действий.
If IsNumeric(myKipCount) = False Then
MsgBox «Введено не число.», vbExclamation
Exit Sub
End If

‘Делаем в переменной «myKipCount» числовой тип данных,
‘хотя в этом нет необходимости, но чтобы было.
myKipCount = CLng(myKipCount)

‘Помещаем в активный лист, в ячейку «B1» номер партии.
‘Макрос будет распечатывать активный лист.
ActiveSheet.Range(«B1»).Value = myPartyNumber

‘Печать активного листа.

‘For . To . Step . Next — это цикл. Цикл используется,
‘чтобы делать одну и ту же команду несколько раз.
For i = 1 To myKipCount Step 1
‘В активный лист, в ячейку «B2» подставляем данные.
ActiveSheet.Range(«B2»).Value = i
ActiveSheet.PrintOut
Next i

Чтобы не расходовать бумагу и расходные материалы принтера, можно тестировать макрос на виртуальном принтере.
Виртуальный принтер — это программа, которая переводит Excel-лист в pdf-формат или другой формат.
Есть бесплатные виртуальные принтеры, например, doPDF v7.
После установки виртуального принтера, виртуальный принтер появится здесь (Excel 2010):
«Файл» — «Печать» — список «Принтер».

Чтобы мой макрос печатал на виртуальный принтер, есть 2 варианта:
1) сделайте (Excel 2010): «Файл» — «Печать» — в списке «Принтер» выберите виртуальный принтер — вкладка «Главная» — запустите макрос;
2) или сделайте следующее (Windows 7): «Пуск» — «Панель управления» — «Оборудование и звук» — «Устройства и принтеры» — щёлкните по виртуальному принтеру правой кнопкой мыши — «Использовать по умолчанию» — закройте и запустите программу «Excel» — запустите макрос.

Или можно в макросе указать принтер, на который надо печатать (в моём макросе нет такой команды).

200?’200px’:»+(this.scrollHeight+5)+’px’);»> Sub Procedure_1()

Dim myPartyNumber As String
‘Делаем у переменной «myKipCount» тип данных «Variant», т.к. в ней
‘в коде могут быть числа и текст.
Dim myKipCount As Variant
Dim i As Long

‘Пользователь выбирает номер партии.
‘Данные помещаются в переменную «myPartyNumber».
myPartyNumber = InputBox(«Введите номер партии:»)

‘Проверка, что пользователь что-то ввёл и не нажал «Отмена».
If myPartyNumber = «» Then
‘Выход из процедуры.
Exit Sub
End If

‘Пользователь выбирает количество кип.
myKipCount = InputBox(«Введите количество кип:»)

‘Проверка, что пользователь ввёл число, иначе в коде
‘будет ошибка при выполнении математических действий.
If IsNumeric(myKipCount) = False Then
MsgBox «Введено не число.», vbExclamation
Exit Sub
End If

‘Делаем в переменной «myKipCount» числовой тип данных,
‘хотя в этом нет необходимости, но чтобы было.
myKipCount = CLng(myKipCount)

‘Помещаем в активный лист, в ячейку «B1» номер партии.
‘Макрос будет распечатывать активный лист.
ActiveSheet.Range(«B1»).Value = myPartyNumber

‘Печать активного листа.

‘For . To . Step . Next — это цикл. Цикл используется,
‘чтобы делать одну и ту же команду несколько раз.
For i = 1 To myKipCount Step 1
‘В активный лист, в ячейку «B2» подставляем данные.
ActiveSheet.Range(«B2»).Value = i
ActiveSheet.PrintOut
Next i

Чтобы не расходовать бумагу и расходные материалы принтера, можно тестировать макрос на виртуальном принтере.
Виртуальный принтер — это программа, которая переводит Excel-лист в pdf-формат или другой формат.
Есть бесплатные виртуальные принтеры, например, doPDF v7.
После установки виртуального принтера, виртуальный принтер появится здесь (Excel 2010):
«Файл» — «Печать» — список «Принтер».

Чтобы мой макрос печатал на виртуальный принтер, есть 2 варианта:
1) сделайте (Excel 2010): «Файл» — «Печать» — в списке «Принтер» выберите виртуальный принтер — вкладка «Главная» — запустите макрос;
2) или сделайте следующее (Windows 7): «Пуск» — «Панель управления» — «Оборудование и звук» — «Устройства и принтеры» — щёлкните по виртуальному принтеру правой кнопкой мыши — «Использовать по умолчанию» — закройте и запустите программу «Excel» — запустите макрос.

Или можно в макросе указать принтер, на который надо печатать (в моём макросе нет такой команды).

200?’200px’:»+(this.scrollHeight+5)+’px’);»> Sub Procedure_1()

Dim myPartyNumber As String
‘Делаем у переменной «myKipCount» тип данных «Variant», т.к. в ней
‘в коде могут быть числа и текст.
Dim myKipCount As Variant
Dim i As Long

‘Пользователь выбирает номер партии.
‘Данные помещаются в переменную «myPartyNumber».
myPartyNumber = InputBox(«Введите номер партии:»)

‘Проверка, что пользователь что-то ввёл и не нажал «Отмена».
If myPartyNumber = «» Then
‘Выход из процедуры.
Exit Sub
End If

‘Пользователь выбирает количество кип.
myKipCount = InputBox(«Введите количество кип:»)

‘Проверка, что пользователь ввёл число, иначе в коде
‘будет ошибка при выполнении математических действий.
If IsNumeric(myKipCount) = False Then
MsgBox «Введено не число.», vbExclamation
Exit Sub
End If

‘Делаем в переменной «myKipCount» числовой тип данных,
‘хотя в этом нет необходимости, но чтобы было.
myKipCount = CLng(myKipCount)

‘Помещаем в активный лист, в ячейку «B1» номер партии.
‘Макрос будет распечатывать активный лист.
ActiveSheet.Range(«B1»).Value = myPartyNumber

‘Печать активного листа.

‘For . To . Step . Next — это цикл. Цикл используется,
‘чтобы делать одну и ту же команду несколько раз.
For i = 1 To myKipCount Step 1
‘В активный лист, в ячейку «B2» подставляем данные.
ActiveSheet.Range(«B2»).Value = i
ActiveSheet.PrintOut
Next i

Чтобы не расходовать бумагу и расходные материалы принтера, можно тестировать макрос на виртуальном принтере.
Виртуальный принтер — это программа, которая переводит Excel-лист в pdf-формат или другой формат.
Есть бесплатные виртуальные принтеры, например, doPDF v7.
После установки виртуального принтера, виртуальный принтер появится здесь (Excel 2010):
«Файл» — «Печать» — список «Принтер».

Чтобы мой макрос печатал на виртуальный принтер, есть 2 варианта:
1) сделайте (Excel 2010): «Файл» — «Печать» — в списке «Принтер» выберите виртуальный принтер — вкладка «Главная» — запустите макрос;
2) или сделайте следующее (Windows 7): «Пуск» — «Панель управления» — «Оборудование и звук» — «Устройства и принтеры» — щёлкните по виртуальному принтеру правой кнопкой мыши — «Использовать по умолчанию» — закройте и запустите программу «Excel» — запустите макрос.

Или можно в макросе указать принтер, на который надо печатать (в моём макросе нет такой команды).

Источник

Читайте также:  Excel присвоить ячейке имя пользователя

Adblock
detector

Like this post? Please share to your friends:
  • Печать первой строки на всех листах excel
  • Печать папки с файлами word
  • Печать определенных листов excel
  • Печать на одной странице word 2016
  • Печать на одной странице word 2010