Печать excel по расписанию

Печатаем график работы для списка сотрудников на выбранную дату

Введение

Мы решили сделать обзорное видео и показать Вам один из вариантов настройки автоматической печати рабочего графика в 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).

Книга Excel с поддержкой макросов (.xlsm)

Сочетанием клавиш Alt+F11 попадаем в окно Visual Basic.

окно 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 писал(а):принтер с мониторингом папок
роутер+принтер -> настроить мониторинг папки

ужос :shock:

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 Sub

Sub 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. Следуйте шагам ниже:

Download the latest version of 2Printer

1. Скачайте и установите 2Printer

Скачайте 2Printer бесплатная версию подходит для ознакомления и личного пользования. Это профессиональная утилита пакетной печати из командной строки с широким выбором настроек. После установки можно выполнить команду 2Printer.exe, чтобы увидеть все доступные аргументы командной строки.

Download the latest version of 2Printer

2. Создайте задачу в Планировщике заданий

В параметрах задачи введите команду 2Printer.exe с аргументами. Достаточно указать лишь источник, где расположены файлы (-src) и принтер (-prn). Например:
2Printer.exe -src «C:Documents*.*» -prn «Canon iR C3000 Series UFR II» -options alerts:no

Если вы используете бесплатную версию 2Printer, добавьте в конец строки -options alerts:no, чтобы отключить диалоговые сообщения, например, с предложением подтвердить дальнейшие шаги.

Set a time trigger to start a print job

3. Выберите время, когда запускать задание на печать

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

Скачать бесплатную версию 2Printer

Вы можете сделать простой тест, чтобы убедиться, что печать работает, как задумано. Для этого, вместо «обычного» принтера, используйте виртуальный принтер, например, Microsoft Print to PDF (предустановлен в Windows 10) или Универсальный Конвертер Документов.

Как задать печать по расписанию – пошаговая инструкция

Содержание:

    1. Откройте Планировщик заданий Windows
    2. Создайте новую задачу
    3. Всё готово!
  • Советы по настройке печати по расписанию
    • Как создать отдельную папку для задач в Планировщике заданий
    • Как печатать по расписанию без входа в учетную запись
    • Как запускать печать по расписанию, если компьютер находится в спящем режиме
    • Как настроить, чтобы запланированное задание на печать смешивалось с другими
  • Нужна поддержка?

1. Откройте Планировщик заданий Windows

Кликните по меню «Пуск» Windows, введите cmd и нажмите Enter, чтобы запустить приложение Планировщик заданий (Task Scheduler).

Open Windows Task Scheduler

Альтернативные способы: перейдите в папку C:ProgramDataMicrosoftWindowsStart MenuProgramsAdministrative Tools или выполните команду Taskschd.msc из командного окна «Выполнить» (Win + R).

2. Создайте новую задачу

Нажмите кнопку Создать задачу… (Create Task…) на правой панели. Мы рекомендуем сперва создать новую папку для ваших задач.

Создать новую задачу в Windows Task Scheduler

Когда откроется диалоговое окно «Создание задачи» (Create task), проверьте следующие вкладки:

  1. Общие (General). Введите любое Имя для вашей задачи;

    Ввести имя задачи в Task Scheduler

    При настройке общих параметров убедитесь, что выбрана опция Выполнять только для пользователей, вошедших в систему (Run only when user is logged on). Эта опция позволит 2Printer отправлять задания на печать на сетевые принтеры и использовать публичный API стороннего программного обеспечения (Microsoft Word, Excel, PowerPoint и т.д.).

    Выполнять только для пользователей, вошедших в систему

    Если такой вариант вам не подходит, есть альтернативное решение. Можно настроить, чтобы 2Printer работал и не из под учетной записи пользователя. Как это настроить →

  2. Триггеры (Triggers). Добавьте условие, при котором действие должно быть выполнено;

    Допустим, вы хотите, чтобы 2Printer запускал печать каждый день в 5 часов вечера:

    Добавить триггер времени в Планировщике задач

    Выберите, Начать задачу: По расписанию и далее:
    Однократно (One time)
    Ежедневно (Daily)
    Еженедельно (Weekly)
    Ежемесячно (Monthly)

    Здесь есть различные опции – вы можете установить запуск задания на печать в определенное время или по графику.

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

  3. Действия (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 начнет отправлять файлы из источника на принтер – вы увидите это в консоли командной строки:

    Печать всех документов из командной строки с помощью 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
1
2
3
4
5
6
7
8
9
'   Отобразить ленту
Sub Lenta_ON()
    Application.ExecuteExcel4Macro "SHOW.TOOLBAR(""Ribbon"", True)"
End Sub
 
'   Скрыть ленту
Sub Lenta_OFF()
    Application.ExecuteExcel4Macro "SHOW.TOOLBAR(""Ribbon"", False)"
End Sub

только не забудь к процедуре Lenta_ON привязать горячую клавишу иначе замучаешься править.
так же можно сделать макрос который в зависимости от значения ячейки «Брак»/»Печать» изменять шрифт кнопки «Печать» с автоматического на серый. Тогда пользователь при слове Брак будет видеть неактивную кнопку нажатие на которую ничего не сделает, а когда появится слово «Печать», то кнопка станет активной (чёрным шрифтом) и будет распечатываться эта страница.

Like this post? Please share to your friends:
  • Печать excel обратным порядком
  • Печать excel не видны ячейки
  • Печать excel на всю страницу как настроить
  • Печать excel как изображение
  • Печать excel два листа на одном