Печатаем график работы для списка сотрудников на выбранную дату
Введение
Мы решили сделать обзорное видео и показать Вам один из вариантов настройки автоматической печати рабочего графика в Excel. Представьте себе ситуацию: с определенной периодичностью Вы формируете рабочий график для своих сотрудников в Excel, после чего, Вам необходимо распечатать эти графики для каждого сотрудника на каждый день. Что Вы будете делать?
Скорее всего, приметесь фильтровать данные по сотруднику и дате, после выделять этот диапазон и отправлять на печать. И так по каждому сотруднику. И так за каждый день. Представили? Да, выходит довольно рутинная задачка. Как избавиться от рутины данной ситуации, мы и поговорим далее.
Скачать файл из этой статьи
Рабочий файл
Обзорное видео смотрите ниже. Приятного просмотра!
В современном мире для работы по-прежнему нужно прогонять через принтер горы бумаги. Если Вы ежедневно сталкиваетесь с печатью большого количества бланков, договоров, графиков, планов и т.п. в Excel, то пришла пора задуматься об автоматизации этого процесса.
Мы покажем пример автоматической печати сменного рабочего графика на примере розничного магазина одежды. Аналогичные сменные рабочие графики используются в различных сферах, вроде строительства, производства или медицины.
Исходные данные
Имеется таблица, где формируется рабочий график.
График работы магазина с 10:00 до 22:00. В столбцах:
А – даты
В – операции
С – сотрудники
D-AB – занятость в минутах (интервал 30 минут)
AC – общая загруженность в % (8 часов — 100%). Рассчитывается как сумма занятости по операции деленная на 480
AD – общая загруженность в часах (8 часов — максимальная загруженность). Рассчитывается как сумма занятости по операции деленная на 60
Приводим лист к нужному виду
Первым делом сделаем из нашего диапазона «умную» таблицу Excel. Делается это сочетанием клавиш Ctrl+T
.
Теперь, при добавлении новой даты, диапазон нашей таблицы будет автоматически растягиваться.
Для того, чтобы было удобнее отслеживать загруженность сотрудника, создадим сводную таблицу и на ее основе построим сводную диаграмму, которую разместим на текущем листе.
Вставка -> Сводная таблица -> На новый лист
Поля сводной таблицы на рисунке ниже.
Результат сводной таблицы:
Далее вкладка «Анализ» -> Сводная диаграмма
Выбираем обычную гистограмму.
Настроим ее форматирование на свой вкус и перенесем на лист рядом с рабочим графиком.
Такая диаграмма позволяет оперативно отслеживать загруженность сотрудников за день.
Справа от гистограммы создаем список сотрудников. В ячейке AQ2 прописываем формулу =ЕСЛИ(AR2=ИСТИНА;1;0)
и копируем ее на ячейки ниже. Форматированием скрываем видимость результата в столбце AQ (устанавливаем белый цвет шрифта).
Рядом в колонку AQ добавляем флажки, а также формируем шаблон для выбора дат. Именно здесь мы и будем указывать для каких сотрудников и на какие даты нам требуется напечатать рабочий график.
Флажки связываем со столбцом AR.
Из списка сотрудников создаем выпадающие списки в «умной» таблице (для удобства заполнения).
Далее, для того чтобы не вводить даты вручную, а брать их из введенных значений, нам потребуется создать список уникальных дат из таблицы.
Из списка имеющихся дат создаем именованный диапазон с именем «Исходный».
Далее добавляем новый столбец перед столбцом с датами, назовем его «Уникальные даты» и добавим в диапазон таблицы.
В ячейку А2 вставляем формулу массива: =ЕСЛИОШИБКА(ИНДЕКС(Исходный;ПОИСКПОЗ(СУММ(СЧЁТЕСЛИ(A$1:A1; Исходный));СЧЁТЕСЛИ(Исходный;"<"& Исходный);0));"")
Копируем формулу на ячейки ниже и задаем формат «Дата».
Далее создаем именованный диапазон:
Имя: «Даты»
Диапазон: =СМЕЩ('График рабочих смен'!$A$2;0;0;СЧЁТЗ(Таблица1[Уникальные даты])-СЧИТАТЬПУСТОТЫ(Таблица1[Уникальные даты]))
Полученный именованный диапазон «Даты» используем в качестве источника для списка в столбцах AT.
Настраиваем подсказку по вводу:
Скрываем столбец А. В целом все готово для автоматизации печати.
Сохраняем книгу как файл с поддержкой макросов (xlsm).
Сочетанием клавиш Alt+F11
попадаем в окно Visual Basic.
Создаем два новых модуля: Insert – Module
В первый модуль вставляем код:
Public Sub Filter()
'Проверяем что сотрудник и дата для печати выбраны'
If Application.Sum(Range("AR2:AR13")) = 0 Or Application.Sum(Range("AT2:AT8")) = 0 Then
MsgBox ("Выберите сотрудника и дату")
Else
'Цикл пробегающий по списку сотрудников'
For s = 2 To 14 Step 1
'Условие для выбора сотрудника'
If Range("AR" + CStr(s)) = 1 Then
Set tbl = [A1].CurrentRegion
tbl.AutoFilter Field:=4, Criteria1:=Range("AQ" + CStr(s))
'Подсчет указанных дат'
ndate = Application.WorksheetFunction.CountA(Columns(46)) - 1
'Цикл пробегающий по всем датам'
For i = 1 To ndate Step 1
Set tbl = [A1].CurrentRegion
tbl.AutoFilter Field:=2, Criteria1:="=" & Format(Range("AT" + CStr(2 + i - 1)), "dd.mm.yy")
'Определяем последнюю видимую строку в фильтре по столбцу с фамилией сотрудника'
LastRow = ActiveSheet.Cells(1, 4).SpecialCells(xlLastCell).Row
'Проверяем наличие графика на протяжении всего кода'
If LastRow = 1 Then
MsgBox ("Рабочий график отсутствует")
Else
'Копируем таблицу'
Range(Cells(1, 2), Cells(LastRow, 31)).Select
Selection.Copy
'Создаем новую книгу'
Workbooks.Add
'Вставляем таблицу в ячейку A5'
Range("A5").Select
ActiveSheet.Paste
'Добавляем основную информацию'
Application.ScreenUpdating = False
Range("A1").FormulaR1C1 = "Дата"
Range("A2").FormulaR1C1 = "Сотрудник"
Range("A3").FormulaR1C1 = "Время"
Range("B1").FormulaR1C1 = "=R[5]C[-1]"
Range("B2").FormulaR1C1 = "=R[4]C[1]"
Range("B1:B2").Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
Application.ScreenUpdating = True
'Считаем количество непустых столбцов'
a = 1
For c = 4 To 28 Step 1
If Application.Sum(Range(Cells(6, c), Cells(25, c))) <> 0 Then
a = a + 1
End If
Next c
a = a - 1 'Убираем лишнюю исходную a'
'Цикл пробегающий по всему времени от 4 столбца до 4+CountCell'
For y = 4 To a + 4 Step 1
'Подсчет корректности графика во времени'
n = Application.WorksheetFunction.CountA(Columns(y))
If n = 1 Then
Columns(y).Delete
y = y - 1
End If
Next y
'Указываем итоговое рабочее время'
Range("B3") = Cells(5, 4)
Range("C3") = Cells(5, 3 + a)
Range("B3:C3").Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
'Проверяем наличие загруженности'
If Range("B3") = "Общая загруженность (%)" Or Range("C3") = "Операция" Then
Range("B3") = "Без загрузки"
Range("C3").ClearContents
End If
'Подбираем автоматически ширину для столбцов'
Columns("A:AJ").EntireColumn.AutoFit
'Запускаем макрос сортировки'
Call Sort
'номер последнего столбца'
lastCol = Cells(6, Columns.Count).End(xlToLeft).Column
'номер последней строки'
LastRow = Cells(Rows.Count, lastCol).End(xlUp).Row
'Подсчитываем, сколько строк должно остаться'
ActiveSheet.Range(Cells(6, lastCol), Cells(LastRow, lastCol)).Select
CountRow = WorksheetFunction.CountIf(Range(Cells(6, lastCol), Cells(LastRow, lastCol)), "<>0")
'Удаляем лишние строки (где Общая загруженность (%) = 0)'
For Q = 6 To 6 + CountRow Step 1
If Cells(Q, lastCol) = 0 Then
Rows(Q).Delete
'Если все лишние нули удалены, то останавливаем цикл'
If CountRowlastCol = CountRow Then
Q = 6 + CountRow
Else
Q = Q - 1
End If
End If
'Подсчитываем, сколько строк сейчас в последнем столбце'
CountRowlastCol = WorksheetFunction.CountA(Range(Cells(6, lastCol), Cells(25, lastCol)))
Next Q
'Отправляем на предварительный просмотр перед печатью'
'Вписываем на 1 лист'
Application.PrintCommunication = False
ActiveSheet.PageSetup.FitToPagesWide = 1
Application.PrintCommunication = True
'Горизонтальная страница'
ActiveSheet.PageSetup.Orientation = xlLandscape
'Предпросмотр'
ActiveSheet.PrintPreview
'Отправляем на печать'
ActiveWorkbook.PrintOut Copies:=1, Collate:=True, IgnorePrintAreas:=False
ActiveWindow.Close False
Windows("automatic-printing.xlsm").Activate
End If 'Закрываем проверку на наличие графика'
Next i 'Переходим к следующей дате'
Else: s = s
End If
Next s
'Очищаем фильтр'
Range("Таблица1[[#Headers]]").Activate
ActiveSheet.ShowAllData
'Удаляем лишнее'
Range("AT2:AT8").ClearContents
Range("AS2:AS13") = False
End If
End Sub
Во второй модуль вставляем код:
Sub Sort()
'Сортировкой по цвету (розовый) упорядочиваем строки от конца до начала'
Rows("5:5").AutoFilter
ActiveSheet.AutoFilter.Sort.SortFields.Clear
ActiveSheet.AutoFilter.Sort.SortFields.Add(Range("D6" _
), xlSortOnCellColor, xlAscending, , xlSortNormal).SortOnValue.Color = RGB(255 _
, 199, 206)
ActiveSheet.AutoFilter.Sort.SortFields.Add(Range("E6" _
), xlSortOnCellColor, xlAscending, , xlSortNormal).SortOnValue.Color = RGB(255 _
, 199, 206)
ActiveSheet.AutoFilter.Sort.SortFields.Add(Range("F6" _
), xlSortOnCellColor, xlAscending, , xlSortNormal).SortOnValue.Color = RGB(255 _
, 199, 206)
ActiveSheet.AutoFilter.Sort.SortFields.Add(Range("G6" _
), xlSortOnCellColor, xlAscending, , xlSortNormal).SortOnValue.Color = RGB(255 _
, 199, 206)
ActiveSheet.AutoFilter.Sort.SortFields.Add(Range("H6" _
), xlSortOnCellColor, xlAscending, , xlSortNormal).SortOnValue.Color = RGB(255 _
, 199, 206)
ActiveSheet.AutoFilter.Sort.SortFields.Add(Range("I6" _
), xlSortOnCellColor, xlAscending, , xlSortNormal).SortOnValue.Color = RGB(255 _
, 199, 206)
ActiveSheet.AutoFilter.Sort.SortFields.Add(Range("J6" _
), xlSortOnCellColor, xlAscending, , xlSortNormal).SortOnValue.Color = RGB(255 _
, 199, 206)
ActiveSheet.AutoFilter.Sort.SortFields.Add(Range("K6" _
), xlSortOnCellColor, xlAscending, , xlSortNormal).SortOnValue.Color = RGB(255 _
, 199, 206)
ActiveSheet.AutoFilter.Sort.SortFields.Add(Range("L6" _
), xlSortOnCellColor, xlAscending, , xlSortNormal).SortOnValue.Color = RGB(255 _
, 199, 206)
ActiveSheet.AutoFilter.Sort.SortFields.Add(Range("M6" _
), xlSortOnCellColor, xlAscending, , xlSortNormal).SortOnValue.Color = RGB(255 _
, 199, 206)
ActiveSheet.AutoFilter.Sort.SortFields.Add(Range("N6" _
), xlSortOnCellColor, xlAscending, , xlSortNormal).SortOnValue.Color = RGB(255 _
, 199, 206)
ActiveSheet.AutoFilter.Sort.SortFields.Add(Range("O6" _
), xlSortOnCellColor, xlAscending, , xlSortNormal).SortOnValue.Color = RGB(255 _
, 199, 206)
ActiveSheet.AutoFilter.Sort.SortFields.Add(Range("P6" _
), xlSortOnCellColor, xlAscending, , xlSortNormal).SortOnValue.Color = RGB(255 _
, 199, 206)
ActiveSheet.AutoFilter.Sort.SortFields.Add(Range("Q6" _
), xlSortOnCellColor, xlAscending, , xlSortNormal).SortOnValue.Color = RGB(255 _
, 199, 206)
ActiveSheet.AutoFilter.Sort.SortFields.Add(Range("R6" _
), xlSortOnCellColor, xlAscending, , xlSortNormal).SortOnValue.Color = RGB(255 _
, 199, 206)
ActiveSheet.AutoFilter.Sort.SortFields.Add(Range("S6" _
), xlSortOnCellColor, xlAscending, , xlSortNormal).SortOnValue.Color = RGB(255 _
, 199, 206)
ActiveSheet.AutoFilter.Sort.SortFields.Add(Range("T6" _
), xlSortOnCellColor, xlAscending, , xlSortNormal).SortOnValue.Color = RGB(255 _
, 199, 206)
ActiveSheet.AutoFilter.Sort.SortFields.Add(Range("U6" _
), xlSortOnCellColor, xlAscending, , xlSortNormal).SortOnValue.Color = RGB(255 _
, 199, 206)
With ActiveSheet.AutoFilter.Sort
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Selection.AutoFilter
End Sub
Сохраняем изменения. Последний штрих – создаем кнопку «Печать» и присваиваем ей макрос Filter.
Готово! Выбираем сотрудников, даты и жмем печать. График по каждому сотруднику генерируется автоматически и идет на печать. При необходимости все сменные графики можно сохранять в отдельной папке на вашем устройстве. Изменение структуры листа с графиком влечет за собой изменение в приложенном коде.
Заключение
Данный пример демонстрирует возможность быстро формировать и отправлять на печать рабочие графики выбранных сотрудников за конкретный день или сразу за неделю. Пользуйтесь готовым файлом, изменив в нем список сотрудников и тип операций, или адаптируйте его под свои задачи.
Нужна помощь в Excel или Google Sheets? Свяжитесь с нами, обсудим все детали.
Оперативно решаем любую проблему в Excel и Google таблицах:
- Написание формул любой сложности
- Создание сводных таблиц
- Визуализация данных (диаграммы, гистограммы)
- Автоматизация расчётов и рутинных задач
- Консультации по работе с таблицами и многое другое
Также, у нас Вы можете пройти бесплатные онлайн курсы по MS Excel с заданиями
Имеется книга рецептов (200-250 листов).
1й лист — общий лист заказа (сколько заказано каждой позиции), далее под каждую позицию отдельный лист с расчетом ингредиентов в зависимости от того, сколько заказано.
Ежедневно есть необходимость печатать эти листы в определенном порядке (допустим, блок1=лист1, лист5, лист 124, лист 130; блок2=лист135, лист 140, лист 200; и тд).
Вручную листать все 200листов очень неудобно, нужно печать как-то автоматизировать. Посоветуйте как удобнее сделать. Вижу 3 варианта решения:
1). Макросы для печати каждого блока. Но макрос должен автоматом проверять 1й лист файла и печатать блок следующим образом:
если позиция1 заказано >0, то печатать соответствующий лист, если в заказе нету (0), то не печатать, проверять позицию2.
2). Возможно существуют как отдельная надстройка — менеджеры листов, в которых можно эти листы как-то группировать, далее выделять например через shift/ctrl в менеджере для печати, либо сразу печатать всю группу. Стандартными средствами excel, как я понял листы нельзя сгруппировать должным образом (вывести например в 2 ряда и тп).
3). Сгруппировать эти листы в трее по блокам (порядок = сначала листы блока1, потом листы блока2 и тд), завести отдельный лист, где будут стоять гиперссылки на начало каждого блока. т.е. переходим по гиперссылке например на начало блока, все листы блока выделены цветом, далее печатаем все «красные» листы и переходим к след. блоку и т.д.
Какое решение посоветуете. p.s. правой клавишей жать на прокрутку листов, чтобы появился список всех доступных листов — не вариант, повторюсь, листов в книге >200.
Заранее спасибо
печать файла по расписанию
печать файла по расписанию
можно стандартным планировщиком виндовс, или как-то ещё, создать задание на ежедневную распечатку файла?
чтоб раз в день, утром, печатался определённый график в экселе который выгружает другая программа.
чтоб человек утром проходя мимо принтера мог взять листок с своей фамилией и пойти работать по плану.
-
Myp - скрытый хозяин вселенной
- Сообщения: 18018
- Зарегистрирован: 18 сен 2006, 12:26
- Откуда: Тверь по прозвищу Дверь
- прог. языки: псевдокод =) сила в алгоритме!
- ФИО: глубокоуважаемый Фёдор Анатольевич
-
- ICQ
Re: печать файла по расписанию
galex1981 » 14 янв 2013, 15:10
Довольно мощный планировщик для Windows nncron но я не знаю, можно ли с помощью него печатать документы
if(!Operate) Read(pDatasheet);
-
galex1981 - Сообщения: 4362
- Зарегистрирован: 04 дек 2008, 22:44
- Откуда: Камышин
- Skype: galk-aleksandr1
- прог. языки: Kotlin, Java, C, C++, Assm, BasCom, VB, php
- ФИО: Галкин Александр Владимирович
-
- ICQ
Re: печать файла по расписанию
Angel71 » 14 янв 2013, 15:50
100500, что такое сделать можно, а как именно нужно будет поискать.
Добавлено спустя 31 минуту 25 секунд:
вариантов пока не много. запускать в планировщике задач excel`овский файл, в котором есть макрос печати нужного документа или написать простенькую программку-хелпер, которая при запуске будет экселю отправлять команнды «открой такой-то файл» и «напечатай».
здесь http://support.microsoft.com/kb/262827/ru можно скачать пример скриптика для печати (OWCHelpr.exe это самораспаковывающийся архив файлов примера)
-
Angel71 - Сообщения: 10659
- Зарегистрирован: 18 апр 2009, 22:18
- Предупреждения: -1
Re: печать файла по расписанию
Myp » 14 янв 2013, 17:00
а через запуск vb скрипта например можно печатать?
хочется стандартными средствами винды.
-
Myp - скрытый хозяин вселенной
- Сообщения: 18018
- Зарегистрирован: 18 сен 2006, 12:26
- Откуда: Тверь по прозвищу Дверь
- прог. языки: псевдокод =) сила в алгоритме!
- ФИО: глубокоуважаемый Фёдор Анатольевич
-
- ICQ
Re: печать файла по расписанию
Angel71 » 14 янв 2013, 17:50
в том примере именно скриптом (а не макросом экселя, которым тоже без проблем можно и который может быть в совершенно другом документе, а не только в том, что печатается) и печатают, только у них скрипт в браузере работает. без браузера тоже можно. нужно порыть как. сейчас доку порою, мож чего по быстрому накопаю.
-
Angel71 - Сообщения: 10659
- Зарегистрирован: 18 апр 2009, 22:18
- Предупреждения: -1
Re: печать файла по расписанию
Myp » 14 янв 2013, 18:00
в винде скрипты .vbs
я ими когда-то делал проверку свободного места по расписанию.
но могут ли они отправлять в печать файл?
Добавлено спустя 2 минуты 19 секунд:
бинго
- Код: Выделить всё • Развернуть
-
Dim w
Set W = CreateObject("Word.Application")
w.Visible = false
w.Documents.Open "C:Temptest.doc"
w.ActiveDocument.PrintOut
WScript.Sleep(1000)
w.Quit
Set w = Nothing
скрипт на пчеать и скрипт в шедулер.
-
Myp - скрытый хозяин вселенной
- Сообщения: 18018
- Зарегистрирован: 18 сен 2006, 12:26
- Откуда: Тверь по прозвищу Дверь
- прог. языки: псевдокод =) сила в алгоритме!
- ФИО: глубокоуважаемый Фёдор Анатольевич
-
- ICQ
Re: печать файла по расписанию
dccharacter » 14 янв 2013, 18:03
принтер с мониторингом папок
роутер+принтер -> настроить мониторинг папки
Добавлено спустя 1 минуту 23 секунды:
а что за принтер-то?
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
-
dccharacter - Сообщения: 4995
- Зарегистрирован: 10 дек 2010, 13:16
- Откуда: Красногорск МО
- прог. языки: C, Python, wiring/processing
- ФИО: Андрей
Re: печать файла по расписанию
Angel71 » 14 янв 2013, 18:11
ну да, это по сути тоже, что и в XLPrint.cls из примера OWCHelpr.exe
http://support.microsoft.com/kb/219151/ru
http://msdn.microsoft.com/en-us/library/wss56bz7(v=vs.80).aspx
http://msdn.microsoft.com/en-us/library/czhz96h7(v=vs.80).aspx
в вашем коде смущает
WScript.Sleep(1000)
если я не ошибаюсь, могут быть проблемы из-за того, что файл может не успеть уйти на печать. винда в этот момент запустит дефрагментатор, индексирование файлов, начнёт предварительную загрузку в память приложений, которые вы обычно в это время запускаете или ещё чего оптимизировать, «холодный старт» даже мелкого приложения или закрытие тяжеловесной софтины и т.д. и хз, захочет эксель допечатать или решит, что после w.Quit нужно забить на всё и вывалиться. можно на всякий или увеличить задержку или помучаться с поиском инфы, как определять закончило ли отправлять на печать. задержка явно проще.
-
Angel71 - Сообщения: 10659
- Зарегистрирован: 18 апр 2009, 22:18
- Предупреждения: -1
Re: печать файла по расписанию
Myp » 14 янв 2013, 19:17
dccharacter писал(а):принтер с мониторингом папок
роутер+принтер -> настроить мониторинг папки
ужос
dccharacter писал(а):а что за принтер-то?
тот который по умолчанию выбран
-
Myp - скрытый хозяин вселенной
- Сообщения: 18018
- Зарегистрирован: 18 сен 2006, 12:26
- Откуда: Тверь по прозвищу Дверь
- прог. языки: псевдокод =) сила в алгоритме!
- ФИО: глубокоуважаемый Фёдор Анатольевич
-
- ICQ
Re: печать файла по расписанию
elmot » 14 янв 2013, 19:24
Экзелю можно по dde сказать, чтобы печатался
см. в реестре
HKEY_CLASSES_ROOTExcel.OpenDocumentSpreadsheet.12shellPrint
-
elmot - Сообщения: 5691
- Зарегистрирован: 10 ноя 2011, 12:02
- Откуда: Turku, Finland
- Skype: elmot73
- прог. языки: Java и все-все=все
- ФИО: Илья
Re: печать файла по расписанию
Angel71 » 14 янв 2013, 22:39
про макросы уже было и кстати, если есть возможность юзать скрипты, то лучше их. если данные нужно обработать или импорт/експорт, то да, макросы рулят. а если нет, то лучше их вообще в офисных софтинах отключить напрочь. на большинстве контор вообще никогда не бэкапят документы и -1 к источникам возможных проблем не помешает.
-
Angel71 - Сообщения: 10659
- Зарегистрирован: 18 апр 2009, 22:18
- Предупреждения: -1
Re: печать файла по расписанию
Dmitry__ » 15 янв 2013, 02:43
Да как угодно можно сделать…
Сам файл распечатать нельзя, там черт ногу сломит. А вот в любой vb6, c++, dotnet можно создать обьект excel, ему скормить файл, отформатировать по странице и распечатать. Наверно можно и на скриптовом vb в html в броузере, но надо смотреть какие ограничения, не все можно делать в броузере…
В ссылке выше есть подробный пример. Пипец как подробный, коммент больше кода
- Код: Выделить всё • Развернуть
-
'==========================================================================
'Печать документа с помощью MS Word
'Параметры:
'{Файл} [{Принтер}|"" [{Кодовая страница}|"" [{Количество копий}]]]
'Пример параметров:
'C:TempTest.txt \HostHostPrinter 1251
'Для использования значений по умолчанию принтера или кодовой страницы
' можно указать двойные кавычки ("")
'Пример параметров:
'C:TempText_default.txt
'C:TempText_dos.txt "" 866
'C:TempText_3_copies.txt "" "" 3
'==========================================================================
Option Explicit
'================= Изменяемые параметры ===================================
Const TimeLimit = 30 'Время ожидания окончания печати в сек.
Const Margin = 1.5 'Поля в см
Const Admin = "admin" 'Имя компьютера сис. админ-а
Const ShowMess = False 'Показывать ли текст ошибки на текущем компе
'==========================================================================
Dim objW, Mess, MarginPt, File, Ext, StartTime, CodeStr, Copies
'Дюймы, выраженные в см., для вычисления полей
Const Inch = 2.538
'Задаем массив сообщений
DefineMess
'Включаем режим ручной обработки ошибок
On Error Resume Next
'Создаем объект Word
Set objW = WScript.CreateObject("Word.Application")
CheckErr(0)
'Первый параметр - открываемый файл
File = WScript.Arguments(0)
CheckErr(1)
'Открываем файл в кодировке, заданной третим параметром
If WScript.Arguments.Count > 2 Then
CodeStr = WScript.Arguments(2)
If Len(CodeStr) <> 0 Then
objW.Documents.Open File,,1,,,,,,,,CodeStr
Else
objW.Documents.Open File,,1
End If
Else
objW.Documents.Open File,,1
End If
CheckErr(1)
'Вычисляем поля (задаются в пунктах - 1/72 дюйма)
MarginPt = Margin/Inch * 72
'Задаем поля для всех файлов, кроме *.doc и *.rtf
Ext = LCase(CreateObject("Scripting.FileSystemObject").GetExtensionName(File))
If Not ((Ext = "doc") Or (Ext = "rtf")) Then
With objW.ActiveDocument.PageSetup
.LeftMargin = MarginPt
.RightMargin = MarginPt
.TopMargin = MarginPt
.BottomMargin = MarginPt
End With
CheckErr(2)
End If
'Если задан второй параметр, то это принтер
If WScript.Arguments.Count > 1 Then
'Устанавливаем принтер, если параметр не пустой
If Len(WScript.Arguments(1)) > 0 Then
'Устанавливаем текущий принтер - второй параметр
objW.ActivePrinter = WScript.Arguments(1)
'Небольшая пауза
WScript.Sleep 100
CheckErr(3)
End If
End If
'Количество копий
If WScript.Arguments.Count > 3 Then
Copies = WScript.Arguments(3)
Else
Copies = 1
End If
'Печатаем в фоне
objW.PrintOut 1,,,,,,,Copies
CheckErr(4)
'Включаем таймер ожидания окончания печати
StartTime = Timer
'Ждем, пока закончится печать
Do Until objW.BackgroundPrintingStatus = 0
'Если ожидаем уже больше заданного лимита
If (Timer - StartTime) > TimeLimit Then
'Генерим ошибку
Err.Raise vbObjectError + 1, Mess("Title"), Mess("Err1")
CheckErr(5)
End If
'Пауза 0.1 сек.
WScript.Sleep 100
Loop
'Закрываем Word
objW.Quit 0
CheckErr(6)
'Отключаем режим ручной обработки ошибок
On Error Goto 0'Выход
Quit'Процедура задания массива сообщений
Sub DefineMess
Set Mess = CreateObject("Scripting.Dictionary")
With Mess
.Add "Title", "Печать документа"
.Add "Err1" , "Время ожидания окончания печати превысило заданный лимит. Печать прервана!"
.Add 0 , "При создании объекта Word возникла ошибка:"
.Add 1 , "Ошибка открытия файла:"
.Add 2 , "Ошибка задания полей:"
.Add 3 , "При установке активного принтера возникла ошибка:"
.Add 4 , "При выполнении печати документа возникла ошибка:"
.Add 5 , "Ошибка выполнения печати."
.Add 6 , "Ошибка закрытия документа. Закройте документ вручную."
End With
End Sub'Процедура проверки ошибок
Sub CheckErr(Step)
'Если произошла ошибка
If Err.Number <> 0 Then
'Посылаем сообщение на компьютер Admin
CreateObject("WScript.Shell").Run "net send " & Admin & " " &_
Mess(Step) & vbNewLine & vbNewLine & Err.Description, 7, False
'Выводим сообщение на текущем компьютере
If ShowMess Then
MsgBox Mess(Step) & vbNewLine & vbNewLine & Err.Description, _
vbOKOnly + vbCritical, Mess("Title")
End If
'Закрываем Word, если открыт
If (Step > 0) And IsObject(objW) Then
objW.Quit 0
End If
Quit
End If
End SubSub Quit
Set Mess = Nothing
Set objW = Nothing
WScript.Quit
End Sub
-
Dmitry__ - Сообщения: 8033
- Зарегистрирован: 13 янв 2011, 15:25
- Откуда: Санкт-Петербург
Re: печать файла по расписанию
Angel71 » 15 янв 2013, 05:55
не не не, мона и весь файл это же мелкософт. кстати вспомнил, что отослать на печать можно выбрав на файле «печать». если порыть в реестре, то можно будет понять какой либе или экзешнику какие параметры скармливать.
Добавлено спустя 1 час 43 минуты 30 секунд:
хех, похоже без сторонних утилит не получится.
эксель запускается как дде сервер
которому потом скармливаются три команды
[open(«%1»)][print()][quit()]
-
Angel71 - Сообщения: 10659
- Зарегистрирован: 18 апр 2009, 22:18
- Предупреждения: -1
Re: печать файла по расписанию
Myp » 15 янв 2013, 09:40
а потом захочется из ворда печатать, а потом вобще пдф или картинку джипеговскую
не, вбскрипт самое хорошее и унивесральное)
-
Myp - скрытый хозяин вселенной
- Сообщения: 18018
- Зарегистрирован: 18 сен 2006, 12:26
- Откуда: Тверь по прозвищу Дверь
- прог. языки: псевдокод =) сила в алгоритме!
- ФИО: глубокоуважаемый Фёдор Анатольевич
-
- ICQ
Вернуться в Свободное общение
Перейти:
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1
С помощью Print Conductor можно распечатать все файлы из папки в 3 этапа: добавляем документы в список, выбираем принтер и нажимаем кнопку Старт печати. Но представьте, что задание на печать начинается автоматически по расписанию, даже без участия пользователя!
Чтобы печатать документы в определенное время, используйте 2Printer вместе с Планировщиком заданий Windows. Автоматическую печать можно задать как единоразово, так и повторно, например, распечатать все отчеты вечером в конце недели или печатать новые файлы ежедневно, еженедельно, ежемесячно. Чтобы вызвать команду 2Printer по расписанию, достаточно добавить ее в действие Планировщика заданий Windows. Следуйте шагам ниже:
1. Скачайте и установите 2Printer
Скачайте 2Printer бесплатная версию подходит для ознакомления и личного пользования. Это профессиональная утилита пакетной печати из командной строки с широким выбором настроек. После установки можно выполнить команду 2Printer.exe, чтобы увидеть все доступные аргументы командной строки.
2. Создайте задачу в Планировщике заданий
В параметрах задачи введите команду 2Printer.exe с аргументами. Достаточно указать лишь источник, где расположены файлы (-src) и принтер (-prn). Например:
2Printer.exe -src «C:Documents*.*» -prn «Canon iR C3000 Series UFR II» -options alerts:no
Если вы используете бесплатную версию 2Printer, добавьте в конец строки -options alerts:no, чтобы отключить диалоговые сообщения, например, с предложением подтвердить дальнейшие шаги.
3. Выберите время, когда запускать задание на печать
Запланируйте выполнение команды 2Printer.exe в указанную дату и время или ежедневно, еженедельно или ежемесячно. Можно выбрать триггеры, основанные на времени или событиях в системе
Скачать бесплатную версию 2Printer
Вы можете сделать простой тест, чтобы убедиться, что печать работает, как задумано. Для этого, вместо «обычного» принтера, используйте виртуальный принтер, например, Microsoft Print to PDF (предустановлен в Windows 10) или Универсальный Конвертер Документов.
Как задать печать по расписанию – пошаговая инструкция
Содержание:
- Откройте Планировщик заданий Windows
- Создайте новую задачу
- Всё готово!
- Советы по настройке печати по расписанию
- Как создать отдельную папку для задач в Планировщике заданий
- Как печатать по расписанию без входа в учетную запись
- Как запускать печать по расписанию, если компьютер находится в спящем режиме
- Как настроить, чтобы запланированное задание на печать смешивалось с другими
- Нужна поддержка?
1. Откройте Планировщик заданий Windows
Кликните по меню «Пуск» Windows, введите cmd и нажмите Enter, чтобы запустить приложение Планировщик заданий (Task Scheduler).
Альтернативные способы: перейдите в папку C:ProgramDataMicrosoftWindowsStart MenuProgramsAdministrative Tools или выполните команду Taskschd.msc из командного окна «Выполнить» (Win + R).
2. Создайте новую задачу
Нажмите кнопку Создать задачу… (Create Task…) на правой панели. Мы рекомендуем сперва создать новую папку для ваших задач.
Когда откроется диалоговое окно «Создание задачи» (Create task), проверьте следующие вкладки:
-
Общие (General). Введите любое Имя для вашей задачи;
При настройке общих параметров убедитесь, что выбрана опция Выполнять только для пользователей, вошедших в систему (Run only when user is logged on). Эта опция позволит 2Printer отправлять задания на печать на сетевые принтеры и использовать публичный API стороннего программного обеспечения (Microsoft Word, Excel, PowerPoint и т.д.).
Если такой вариант вам не подходит, есть альтернативное решение. Можно настроить, чтобы 2Printer работал и не из под учетной записи пользователя. Как это настроить →
-
Триггеры (Triggers). Добавьте условие, при котором действие должно быть выполнено;
Допустим, вы хотите, чтобы 2Printer запускал печать каждый день в 5 часов вечера:
Выберите, Начать задачу: По расписанию и далее:
— Однократно (One time)
— Ежедневно (Daily)
— Еженедельно (Weekly)
— Ежемесячно (Monthly)Здесь есть различные опции – вы можете установить запуск задания на печать в определенное время или по графику.
Также можно использовать триггеры, основанные на событиях, например, При входе в систему, При запуске, При событии и т.д. Каждая задача может содержать одно или несколько условий, так что можно активировать несколько триггеров.
-
Действия (Actions). Введите команду 2Printer.exe с аргументами;
Во вкладке Действия нажмите кнопку Создать… Нам понадобится базовая команда 2Printer с указанием источника файлов и принтера. Например:
2Printer.exe -src «C:Documents*.*» -prn «Canon iR C3000 Series UFR II» -options alerts:no
В разделе настроек введите 2Printer.exe напротив Program/script (Программа/Сценарий) и вставьте остальную часть команды напротив Добавить аргументы (опционально) (Add arguments (optional)):
Для получения дополнительной информации об аргументах, которые можно использовать, посетите страницу Синтаксис 2Printer (2Printer Syntax) (на английском).
3. Всё готово! Дождитесь запуска задания на печать
Как только триггер Планировщика заданий сработает, 2Printer начнет отправлять файлы из источника на принтер – вы увидите это в консоли командной строки:
Если вы хотите, чтобы печать происходила без диалогов и отображения прогресса, включите «тихий» режим, добавив в конце командной строки -options silent:yes. Задание печати будет выполняться в «тихом» режиме.
Скачать 2Printer
Советы по настройке печати по расписанию
Теперь вы знаете, как легко распечатать множество файлов по расписанию. Для более эффективной настройки ознакомьтесь с нашими полезными советами и подсказками ниже.
1. Как создать отдельную папку для задач в Планировщике заданий
Хорошая идея сначала создать новую папку для ваших задач. Тогда ваши задачи, связанные с печатью, не перепутаются с другими задачами, которые автоматически выполняются на вашем компьютере. Для этого щелкните правой кнопкой мыши по Библиотеке Планировщика заданий (Task Scheduler Library) и создайте новую папку:
2. Как печатать по расписанию без входа в учетную запись
Если по какой-то причине вы не хотите, чтобы 2Printer работал под учетной записью пользователя Windows (выбрана опция Выполнять для всех пользователей (Run whether user logged on or not)), создайте папку Desktop из командной строки с правами администратора:
Для Windows 64 bit C:WindowsSysWOW64configsystemprofileDesktop Для Windows 32 bit C:WindowsSystem32configsystemprofileDesktop (вместо dcomcnfg.exe) Это позволит избежать возможные проблемы с автоматизацией печати документов, созданных в программах MS Office и другого ПО.
3. Как запускать печать по расписанию, если компьютер находится в спящем режиме
Не нужно постоянно держать компьютер включенным! В параметрах действия в Планировщике заданий вы можете заставить компьютер выходить из спящего режима, чтобы запустить задание на печать.
Чтобы включить эту функцию, при создании задачи перейдите во вкладку Условия (Conditions) и поставьте галочку напротив строки Пробуждать компьютер для выполнения задачи (Wake the computer to run this task):
4. Как настроить, чтобы запланированное задание на печать смешивалось с другими
Что если кто-то другой в офисе отправит файлы на тот же принтер, который вы планируете использовать в 5 часов вечера? Если это произойдет, распечатки могут перепутаться. Чтобы избежать такой ситуации, используйте Режим печати одним заданием (Single print job mode), доступный в 2Printer. Тогда все ваши файлы отправятся на принтер как одно задание на печать и в вашу очередь не попадут чужие файлы.
Чтобы включить этот режим, используйте команду-пример:
2Printer.exe -src «C:Documents*.*» -prn «Canon iR C3000 Series UFR II» -props spjob:yes
Соответственно, -props spjob:yes нужно добавить к аргументам в Планировщике заданий:
Скачать 2Printer
Благодаря интерфейсу командной строки, 2Printer может стать универсальным инструментом для разных задач печати. Мы надеемся, что эта статья окажется для вас полезной. Если у вас возникли затруднения настройкой печати по расписанию, пожалуйста, напишите нам.
Написать в поддержку
Есть готовый вариант для решения вашей проблемы. Как я понял, если написано «Брак», то печататься не должно, если написано «Печатать», то можно.
Но предлагать Вам простое решение я не буду.
Давайте сначала распечатаем этот лист, но посмотрим как это делается. Для этого нажимаете кнопку «Запись макроса», соглашаетесь со всём что предложит, после чего нажимаете кнопку Быстрой печати и останавливаете запись макроса. В результате если Вы зайдёте на вкладку «Разработчик», то там найдёте код макроса для печати.
После чего создаёте кнопку «Печать» и присваиваете ей этот макрос. Но Вам же нужно чтобы печатали только тогда когда не брак, тогда вписываете в макрос печати условие проверки на эту ячейку.
Ну и как бы смотрелось красивее, то сначала нужно скрыть ленту, чтобы никто не нажал «Быструю печать»
Visual Basic | ||
|
только не забудь к процедуре Lenta_ON привязать горячую клавишу иначе замучаешься править.
так же можно сделать макрос который в зависимости от значения ячейки «Брак»/»Печать» изменять шрифт кнопки «Печать» с автоматического на серый. Тогда пользователь при слове Брак будет видеть неактивную кнопку нажатие на которую ничего не сделает, а когда появится слово «Печать», то кнопка станет активной (чёрным шрифтом) и будет распечатываться эта страница.