Vba excel печать
Vba excel печать
На этом шаге мы рассмотрим особенности вывода на печать бланков командировочных удостоверений и использование для этой цели макросов.
Для того чтобы при выводе на печать заполненного бланка командировочного удостоверения созданный документ был расположен на одном листе бумаги с двух сторон, задайте область печати, причем лицевой и обратной стороны отдельно. Для этого последовательно выполните следующие действия:
- выделите мышью область А1:J20 (лицевая сторона командировочного удостоверения);
- нажмите на клавишу Ctrl и, удерживая ее, выделите область А22:J69 (обратная сторона);
- выполните команду Файл | Область печати | Задать.
После этого с помощью команды Файл | Предварительный просмотр просмотрите, как разместится документ на бумаге и, если необходимо, то произведите устранение недостатков, вызвав диалоговое окно Параметры страницы, нажав на кнопку Страница в меню окна предварительного просмотра.
Вывод командировочного удостоверения на печать с использованием стандартных методов
Возможно два метода последовательного вывода пользователем на печать нескольких командировочных удостоверений, введенных предварительно в журнал регистрации.
1-й метод. Вывод на печать одного командировочного удостоверения, печатая последовательно лицевую сторону, затем обратную. Для этого желательно, чтобы в принтере находился один лист бумаги. Тогда нажав на кнопку Печать на стандартной панели инструментов нужно лист, после вывода его из принтера с распечатанной лицевой стороной, перевернуть и «пропустить» через принтер с другой стороны. Далее повторить эту операцию с оставшимися командировочными удостоверениями.
2-й метод заключается в том, чтобы отпечатать партию командировочных удостоверений с одной стороны, и затем пропустить эти листы бумаги через принтер с другой стороны. Недостаток этого метода заключается в том, что тогда каждый раз, отправляя документ на печать, нужно применять команду Файл | Печать, а после этого в диалоговом окне Печать отмечать номера печатаемых страниц, например, с 1-й по 1-ю, что тоже не совсем удобно.
Недостаток обоих методов заключается в относительной трудоемкости выполнения операций, которая заключается в повторении ряда обязательных однотипных действий и, как следствие, возможности внесения ошибок. Пользователь должен повторять несколько одних и тех же действий, независимо от применяемого метода. В Справочной системе Microsoft Excel в разделе Автоматизация задач написано следующее:
Запись макроса вывода документа на печать
Чтобы писать макросы, не обязательно быть опытным (продвинутым) пользователем. Можно с помощью активизации средства записи макроса записать последовательность выполняемых действий. При этом программа записи автоматически преобразует последовательность действий пользователя в код на языке Visual Basic of Application (VBA), который является основой записи макроса.
Планирование шагов и команд автоматизации процесса печати
Принимаем за основу для автоматизации 2-й метод. Предполагаем, что необходимо отправить на печать лицевую сторону сформированных командировочных удостоверений с порядковыми номерами с 1-го по 3-й, после чего повторить ту же операцию с выводом на печать обратной стороны.. Исходя из этого однотипные действия 2-го метода по выводу на печать каждой стороны нужно повторить три раза. Значит было бы удобно отправлять документ на печать одним действием, например, нажатием на кнопку, после чего Excel должен самостоятельно вызвать диалоговое окно Печать, определить выводимые на печать страницы и нажать на кнопку ОК.
Макрос вывода документа на печать
Для того чтобы начать запись макроса, выполните команду Сервис | Макрос | Начать запись. Появится диалоговое окно Запись макроса (рисунок 1).
Рис.1. Диалоговое окно Запись макроса
Если это первый записываемый макрос в открываемой книге, то тогда в поле Имя макроса будет указано его имя — Макрос1.
Многие пользователи не изменяют имя макроса и через некоторое время может возникнуть недоразумения — какую операцию выполняет этот макрос. Поэтому сразу измените его имя на ПечатьЛицевойСтороны. Имя макроса должно начинаться с заглавной буквы и между элементами текста имени не должно быть пробелов.
В поле Сочетание клавиш введите букву на английском языке, например, «z» (рисунок 2).
Рис.2. Диалоговое окно Запись макроса после внесения изменений в поля Имя макроса, Описание и Сочетание клавиш
Это позволит сразу же после записи макроса, нажав на комбинацию клавиш Ctrl+z запустить макрос на автоматическое выполнение записанной операции.
В поле Описание будет зафиксирована дата создания макроса и, при желании, в это поле с клавиатуры введите краткое описание задачи макроса, например, Предназначен для печати лицевой стороны командировочного удостоверения.
В раскрывающемся списке Сохранить в находятся:
- Личная книга макросов;
- Новая книга;
- Эта книга;
это место, куда будет помещен и где будет храниться записанный макрос. При создании этого и последующих приложений все макросы будут записываться в Этой книге, поэтому остальные варианты рассматриваться не будут.
После нажатия на кнопку ОК или клавишу Enter Excel начинает запись макроса, для чего фиксирует все действия пользователя, независимо от того, правильны ли они. Фиксация действий производится на языке кода VBA и будет осуществляться до остановки записи. Для остановки записи предназначена появляющаяся после начала записи кнопка Остановка (рисунок 3).
Для записи кода действий, выполняемых макросом, последовательно выполните процедуры по выводу на печать лицевой стороны командировочного удостоверения:
- выполните команду Файл | Печать;
- в появившемся диалоговом окне Печать в области Печатать введите номера страниц с 1-й по 1-ю и нажмите кнопку ОК;
- для остановки записи макроса нажмите кнопку Остановка или выполните команду Сервис | Макрос | Остановка записи.
Для записи макроса печати оборотной стороны командировочного удостоверения нужно проделать аналогичную операцию по выводу на печать страницы 2.
Просмотр записанного макроса
Просмотр записанного макроса заключается в просмотре непосредственно сгенерированного текста кода VBA при его записи. Для этого, выполнив команду Сервис | Макрос | Редактор Visual Basic или нажав комбинацию клавиш Alt+F11, откройте приложение Microsoft Visual Basic (рисунок 4).
Рис.4. Приложение Microsoft Visual Basic с записанными макросами вывода на печать лицевой и обратной стороны документа
При запуске РедактораVisual Basic в этом приложения присутствуют три основных окна:
- окно проекта;
- окно свойств;
- окно программы.
Окно проекта Окно проекта расположено слева вверху (рисунок 4) и содержит несколько папок. В нашем случае имеются папка Microsoft ExcelОбъекты (рисунок 5), в которой находятся объекты, с которыми производятся действия:
Рис.5. Окно проекта
- Лист1 (КомандировочноеУдостоверение);
- Лист2 (ЖурналРегистрацииКУ);
- ЭтаКнига (в которой записаны эти макросы).
Вторая папка — Модули, в которой находится элемент Модуль1 (рисунок 4), содержащий записанные макросы вывода на печать 1-й и 2-й страницы.
При создании диалоговых окон и форм может находиться и третья папка — Формы, но здесь она рассмотрена не будет.
Окно проекта предназначено для управления различными элементами проекта VBA и открывается с помощью команды Вид | Окно проекта.
Если обратиться к окну проекта, показанному на рисунке 5, то в объекте Модули находится один элемент Модуль1. Это тот элемент, который создан автоматически при записи макросов вывода документов на печать.
Окно свойств Окно свойств находится в левом нижнем углу (рисунок 4).
В окне свойств перечисляются характеристики элементов проекта. Для изменения свойств элемента, выделите его в окне проекта и тогда его характеристики отобразятся в окне свойств. Если выделить элемент Модуль1, то в окне свойств отобразится его имя: Модуль1. Для изменения имени модуля в окне свойств измените значение свойства Name, введя новое имя — Печать (рисунок 6).
Рис.6. Окна Проектов и Свойств с переименованным элементом Модуль1 в элемент Печать
Окно программы Окно программы самое большое и находится справа (рисунок 4).
Именно в нем происходит запись текста макроса на языке Visual Basic of Application. Окно программы имеет два режима просмотра:
- представление полного модуля;
- представление процедуры.
Переключение между этими режимами осуществляется с помощью кнопок, находящимися в левом нижнем углу окна программы.
В режиме представления процедуры отображается только один макрос. Для перехода к следующему макросу, его имя нужно выбрать в раскрывающемся списке в верхней части окна программы или воспользоваться клавишами Ctrl +PageUp и Ctrl+PageDown.
В режиме представления в окне программы находятся все макросы, в записанной последовательности. На рисунке 4 показан режим представления.
Исследование записанного макроса Ознакомимся с кодом VBA макроса ПечатьЛицевойСтороны. Если окно программ закрыто, то для просмотра макроса в окне проекта активизируйте двойным нажатием на правую кнопку мыши элемент Печать объекта Модули.
Текст макроса в окне программы содержит следующие элементы (рисунок 4):
- ключевые слова Sub и End Sub, означающие начало и конец текста макроса, шрифт которых выделен синим цветом;
- имя макроса, которое следует за ключевым словом Sub начала макроса;
- комментарии, шрифт которых выделен зеленым цветом;
- код VBA или непосредственно записанные действия, которые выполняет макрос.
Комментарии. В нашем примере это те данные, которые вводились в диалоговое окно Запись макроса (рисунок 2). Строка комментария предназначена для описания действий и начинается с апострофа. Удаление комментариев никоим образом не влияет на выполнение макроса. Более подробно комментарии будут рассмотрены далее.
И, наконец, код записанных действий, выполняемых макросом:
Текст макроса, который начинается и заканчивается ключевыми словами Sub и End Sub, называется подпрограммой или процедурой.
На следующем шаге мы рассмотрим запуск записанных макросов на выполнение из приложения Excel.
Это интересно
Страницы
Ярлыки
вторник, 9 июня 2015 г.
PrintOut VBA
Печатайте на принтер Excel
или
ActiveWindow.SelectedSheets.PrintOut Copies:=1, ActivePrinter:=»MyPrinter»
При этом активный принтер компьютера менять не надо. =======================================================
ActiveSheet.PrintOut ActivePrinter:=»HP LaserJet 5L»
Range(«A1:C10»).PrintOut
ActivePrinter:=»HP LaserJet 5L (LPT1:)»
Предполагается, что распечатать нужно только ячейки и графические об’екты диапазона B2:C10 первого рабочего листа текущей рабочей книги.
If Worksheets(«киоски»).Range(«F4»).Value <> «» Then
ActiveWindow.SelectedSheets.PrintOut From:=1, To:=3, Copies:=1, Collate:=True
Else
ActiveWindow.SelectedSheets.PrintOut From:=1, To:=4, Copies:=1, Collate:=True
If Worksheets(«киоски»).Range(«F4»).Value <> «» and
Worksheets(«киоски»).Range(«E4»).Value <> «» Then
ActiveWindow.SelectedSheets.PrintOut From:=1, To:=2, Copies:=1, Collate:=True
Else
ActiveWindow.SelectedSheets.PrintOut From:=1, To:=4, Copies:=1, Collate:=True
Метод PrintOut позволяет распечатать рабочую книгу (Workbook), диаграмму (Chart), диапазон ячеек (Range), рабочий лист(Worksheet). Синтаксис метода PrintOut представлен ниже:
Expression.PrintOut(From, To, Copies, Previev, ActivePrinter, PrintToFile, Collate)
Синтаксис метода PrintOut содержит элементы, представленные
____________________________________________________________________________
Элемент | Описание
______________|______________________________________________________________
Expression Выражение, возвращающее объект Workbook
___________________________________________________________________________
From Необязательный параметр типа Variant задает страницу, с которой начинается печать. Если этот аргумент отсутствует, то печать начинается с первой страницы.
_____________________________________________________________________________
To Необязательный параметр типа Variant задает последнюю печатаемую страницу. Если этот аргумент отсутствует, то печать продолжается до последней страницы.
___________________________________________________________________________
Copies Необязательный параметр типа Variant. Задает количество печатаемых копий
_____________________________________________________________________________
Preview Необязательный параметр типа Variant, принимающий одно из двух значений:
Присвоение ему значения True приводит к выводу перед печатью окна предварительного просмотра.
Для значения False (значение по умолчанию) печать производится без предварительного просмотра
_____________________________________________________________________________
ActivePrinter Необязательный параметр типа Variant. Задает имя активного принтера
_____________________________________________________________________________
PrintToFile Необязательный параметр типа Variant. Если данный параметр имеет значение True, то производится печать в файл. При этом пользователю выдается запрос на ввод имени файла
______________________________________________________________________________
Collate Необязательный параметр типа Variant. Если ему задать значение True, то копии будут объединены.
______________________________________________________________________________
Элементы синтаксиса метода PrintOut
Ниже приведен пример распечатки рабочего листа с именем Лист1:
WorkSheets (“Лист1”). PrintOut(1, 2, 1, False, PrintToFile:=True)
Начиная с 11 версии (Office XP) в ACCESS появилась коллекция Printers, содержащая все активные принтеры
Как из VBA выбрать и установить принтер для Excel
Основная задача кодов Visual Basic for Applications — автоматизация. И задачи зачастую бывают самые разные. Одна из таких задач — печать листов или ячеек по условию или в цикле. Сама по себе отправка на печать листа или диапазона не представляет сложностей, это легко можно записать макрорекордером и вставить в свой код. Выглядеть это будет примерно так:
Sub Макрос1() ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, IgnorePrintAreas:=False End Sub
Но зачастую необходимо не просто отправить на печать, а еще и на определенный принтер. При этом не просто указать другой принтер, а дать возможность выбрать принтер пользователю, не задавая его жестко в коде. Ведь у разных пользователей могут быть разные принтеры подключены. Часто такое необходимо при печати этикеток или других специфических материалов(открытки, буклеты и т.п.) потому, что для них как правило используют не стандартный офисный черно-белый лазерный принтер, а некий более продвинутый с возможностью заправки специфических листов. Как видно из кода выше — там нет и малейшего намека на указание принтера. Хотя в принципе параметр такой есть — ActivePrinter.
На самом деле есть несколько вариантов выбора принтера, но я покажу самый надежный (как оказалось) и в тоже время самый простой — через стандартный диалог выбора принтеров:
Sub ShowPrinters() Application.Dialogs(xlDialogPrinterSetup).Show End Sub
Этот диалог после вызова автоматически назначает выбранный в нем принтер принтером по умолчанию для печати. Т.е. теперь чтобы мы ни отправили на печать будет отправлено на этот принтер. Все бы хорошо, но тут появляется небольшая проблема: в этом случае у нас не только из кодов будет идти печать на этот принтер, но и при обычной печати. А это нам не надо, ведь тогда даже 100500 каких-то «левых» документов вместо печати на лазерном черно-белом будут распечатаны на офигительном цветном. За такое можно и премии лишиться 🙂 Конечно, можно каждый раз перед ручной печатью выставлять нужный принтер. Но во-первых об этом можно просто забыть, а во-вторых — как только изменим один раз, нам придется перед печатью из кода опять менять принтер. Замкнутый круг и автоматизацией вообще не пахнет.
Поэтому лучше чуть-чуть все усложнить и при каждой печати из кода VBA назначать нужный принтер. Я заготовил универсальный код, который отправляет на печать либо активный лист, либо указанный диапазон ячеек именно на выбранный для печати из VBA принтер. При желании и умении код можно доработать для печати листов и диапазонов в цикле. Но основной упор сделан на выбор принтера для печати только из кода. Т.е. при первом запуске кода печати будет предложено выбрать принтер:
Если принтер будет выбран и нажата кнопка Ок, то принтер будет запомнен и сразу после этого сброшен и установлен заново тот принтер, который был изначально установлен для печати. Однако при печати из кода будет использован именно выбранный принтер, а не тот, который будет применяться при ручной печати.
Т.е. при ручной печати будет один принтер, а при печати из кода — другой.
Option Explicit ‘глобальная переменная для хранения значения выбранного принтера при печати из VBA Public sNowPrinter As String ‘————————————————————————————— ‘ Procedure : ChangePrinter ‘ Author : The_Prist(Щербаков Дмитрий) ‘ Purpose : Функция выбора принтера для печати из кода VBA ‘————————————————————————————— Sub ChangePrinter() sNowPrinter = «Set» Dim v, s ‘запоминаем текущий принтер, чтобы можно было вернуть его после выбора s = Application.ActivePrinter ‘показываем окно выбора принтера v = Application.Dialogs(xlDialogPrinterSetup).Show ‘если принтер был выбран — запоминаем выбор If v = True Then sNowPrinter = Application.ActivePrinter End If ‘возвращаем принтер по умолчанию, чтобы стандартная печать шла на него Application.ActivePrinter = s End Sub ‘————————————————————————————— ‘ Procedure : DoPrint ‘ Author : The_Prist(Щербаков Дмитрий) ‘ Purpose : Функция печати указанного кол-ва копий указанного диапазона ячеек ‘ rr — ссылка на диапазон ячеек — Range(«A1:B10») ‘ если не указан — на печать выводится весь активный лист ‘ lCopies — целое число, указывающее сколько копий выводить на печать ‘ если не указан — на печать выводится одна копия ‘————————————————————————————— Function DoPrint(Optional rr As Range = Nothing, Optional lCopies As Long = 1) Dim sActPrinter As String ‘проверяем, установлен ли ранее принтер для печати If sNowPrinter = «» Or sNowPrinter = «Set» Then ‘если нет — вызываем процедуру выбора принтера Call ChangePrinter ‘если выбранный принтер не был выбран(нажали Отмена), то используем текущий If sNowPrinter = «Set» Then If MsgBox(«Не выбран принтер для печати. Использовать установленный в качестве активного?», vbCritical + vbYesNo, «www.excel-vba.ru») = vbNo Then Exit Function End If sActPrinter = Application.ActivePrinter Else sActPrinter = sNowPrinter ‘получаем выбранный в окне принтер End If End If If rr Is Nothing Then ‘печатаем активный лист на выбранном принтере ActiveSheet.PrintOut Copies:=lCopies, ActivePrinter:=sActPrinter Else ‘печатаем указанный диапазон ячеек на выбранном принтере rr.PrintOut Copies:=lCopies, ActivePrinter:=sActPrinter End If End Function
Функция ChangePrinter показывает диалог выбора принтера и назначает выбранный принтер принтером по умолчанию, запоминает выбор и отменяет его, возвращая принтер до вызова функции.
Функция DoPrint непосредственно отправляет на печать именно на выбранный принтер. Если принтер ранее не был выбран, то сначала будет вызвана функция ChangePrinter .
При этом функция DoPrint имеет два необязательных аргумента:
В процедуре ниже на печать выводится выделенный диапазон с количеством печатных копий листов — 2.
Sub TestPrint() DoPrint Selection, 2 End Sub
Так же в функции DoPrint можно заменить ActiveSheet на конкретный лист. Например: Workbooks(«Книга2.xlsx»).Sheets(«Лист3») . Книга Книга2.xlsx должна быть открыта и должна содержать лист с именем Лист3 .
В приложенном к статье файле так же есть пример печати по очереди каждой из этикеток, расположенных в два ряда:
Хотя практичнее автоматически заполнять только один шаблон этикетки в цикле разными данными и его отправлять на печать.
Выбор принтера (74,5 KiB, 772 скачиваний)
Статья помогла? Поделись ссылкой с друзьями!
Поиск по меткам
Здравствуйте! Столкнулся с проблемой, после установки любого принтера в системе пользователя один из файлов Excel при запуске начинает обращаться к подсистеме печати, и показывает окно выбора принтеров, точно такое же как у Вас в статье, далее все запускается в штатном режиме, но не надолго, при попытке выделить ячейки и скопировать их появляется сообщение о том, что печать невозможна так как буфер переполнен, при том что я не пытаюсь печатать, а всего лишь пытаюсь скопировать ячейки, это делает работу с файлом просто навсего невозможной. Запуск на другой машине привел к тому же самому, и на той и на другой установлен Office 2010, могу сделать вывод что дело в файле, но куда копать не знаю, он очень объемный и обладает кучей формул, но без макросов и как я понял без VBA скриптов. Просмотрел данный файл в редакторе VBA ничего не нашел, как избавиться от этой проблемы?
Антон, в данной ситуации могу посоветовать лишь одно: отключить принтер от ПК, сбросить полностью параметры печати в этой книге, а так же удалить все представления(Вид -Представления).
Если книга в общем доступе — сначала снять общий доступ, удалив журнал и представления.
Доброго времени суток. Функция ChangePrinter работает отлично, спасибо Вам, Ваши статьи очень информативны. Однако у меня проблема вот в чем. Функция выбора принтера мне нужна не для выбора принтера по принципу хочу не хочу, а по принципу, работаетне работает. Поэтому, Ваша форма позволяет мне выбрать принтер, но сначала я должен определить какой из принтеров сейчас в сети, а это для обычного юзера может стать неразрешимой задачей) Есть ли возможность добавить в форму статус принтера? Или это «много кода»))? В любом случае, Спасибо.
Здравствуйте!
Есть ли возможность создать TextBox в UserForm, и в зависимости от числа в TextBox (1, 2, 3. ), выводить на печать соответствующее число копий?
Поделитесь своим мнением
Комментарии, не имеющие отношения к комментируемой статье, могут быть удалены без уведомления и объяснения причин. Если есть вопрос по личной проблеме — добро пожаловать на Форум
Получение списка доступных принтеров средствами VB (VBA)
Данный код выводит список всех установленных в системе принтеров:
Результат работы макроса:
Принтер №1: PDFCreator
Принтер №2: Microsoft XPS Document Writer
Принтер №3: Microsoft Office Document Image Writer
Принтер №4: \192.168.0.1Samsung ML-2010 Series
Всего принтеров: 4
===================================
Ещё один вариант того же макроса (у меня он работает намного быстрее первого варианта):
Результат работы макроса:
Принтер №1: PDFCreator
Путь к принтеру №1: PDFCreator
Принтер №2: Microsoft XPS Document Writer
Путь к принтеру №2: Microsoft XPS Document Writer
Принтер №3: Microsoft Office Document Image Writer
Путь к принтеру №3: Microsoft Office Document Image Writer
Принтер №4: Samsung ML-2010 Series на 192.168.0.1
Путь к принтеру №4: \192.168.0.1Samsung ML-2010 Series
Всего принтеров: 4
Активный принтер: PDFCreator on NE03:
========================================
Данный код позволяет активировать виртуальный PDF-принтер в Microsoft Word:
(в случае успешной активации функция возвращает TRUE)
ВНИМАНИЕ: Для Microsoft Excel код будет немного другим (там принтеры именуются несколько иначе)
Данный код позволяет активировать виртуальный PDF-принтер в Microsoft Excel:
(в случае успешной активации функция возвращает TRUE)
- 22961 просмотр
Комментарии
Понял! Спасибо за ответ!
Ошибку с выводом на печать не отловить, — так устроена Windows
(Эксель отправляет файл на печать, — спулер печати принимает задание на печать. с точки зрения Excel, задача по выводу на печать выполнена)
Т.е. на уровне Excel ошибку не получить (о чем вам на форуме уже написали)
по какому-то из свойств можно понять распечатает принтер или нет?
нет
вот у меня к компу подключен работающий принтер,
и то, я не могу сказать, напечатает он документ или нет (зависит от наличия бумаги в лотке)
Так что проще всего вывести пользователю MSGBOX с вопросом «Распечаталось?» и вариантами ответа да / нет,
и на основании ответа пользователя продолжать работу макроса
Доброго времени суток!
У меня есть таблица, у которой перед печатью должны скрываться некоторые строки и столбцы (всегда разные, зависит от выбора пользователя).
Я построил макрос так, что сначала скрывается то, что является лишним, затем сформированная таблица идет на печать и затем производится возврат в прежнее состояние таблицы (раскрытие скрытых строк и столбцов).
Проблема образовалась в том, что когда к ПК не подключен принтер (я про реальный принтер), то выдается ошибка, что принтер неактивен (ошибка принтера). Сначала я хотел поймать эту ошибку и выдавать свое сообщение, типа «Принтер неактивен! Обратитесь к админу!» и т.д., но не смог, так как к Excel эта ошибка не имеет никакого отношения. Затем, предложили мне сначала сделать проверку на активные принтеры, но у меня в активных принтерах весит виртуальный (распечатать-то он не может), поэтому Application.ActivePrinter всегда равен этому принтеру (*PDF*). Самого принтера у меня нет.
По итогу, пока, оставил как есть, так как данная ошибка не рушит работу макроса: если принтер подключен — напечатает, если нет — выдаст сообщение об ошибке, и дальше макрос будет работать. + добавил выбор принтера Application.Dialogs(xlDialogPrinterSetup).Show, но, это окно отражает кучу лишних устройств — виртуальные принтеры, Fax и т.д. Это не очень нравится.
Но, все таки интересно, можно ли как-то ловить такие ошибки, или как-то проверять на реальное подключение к принтеру (который напечатает таблицу), или в окне Application.Dialogs(xlDialogPrinterSetup).Show отражать только раельные принтеры (а если их нет, то пусто и тогда пользователь нажмет отмену). Выше Вы предлагаете проанализировать свойства всех установленных принтеров, и отфильтруйте подходящие принтеры. Скажите пожалуйста, по какому-то из свойств можно понять распечатает принтер или нет?
Данная таблица будет использоваться на разных ПК, поэтому принтеры всегда будут разные! Вроде понятно расписал.
Ну и зачем нужен этот огромный макрос с доп. функциями,
который, ко всему прочему, не будет работать в 64-битной версии Office?
Когда оба моих макроса из 5 строк выдают тот же самый результат.
должно работать в любой версии Excel, видоизменить на то чтоб выбирал на печать нужный, а потом возвращал установленный ранее на основе этого кода, думаю труда не составит.
Спасибо за ответ, сначала так и сделал http://clip2net.com/s/1OiZ5 но изза ошибки пошёл «обходными путями», может что не включено или еще изза чего. Пишу дома (и принтеров нету кроме виртуальных Офиса) может на работе нормально сработает.
К сожалению, вряд ли смогу помочь.
Я писал этот код, ориентируясь на имена принтеров, выводимых моим Excel (версии 2003)
И нет никакой гарантии, что все версии Excel, и в любой версии Windows, будут именовать принтеры точно также.
Сделайте проще:
1) При открытии формы (событие UserForm_Initialize) заполните комбобокс списком имён принтеров,
используя цикл из моего макроса
2) При щелчке на CommandButton5 просто активируйте выбранный принтер одной строкой кода:
http://clip2net.com/s/1OiGj
Не подскажете где ошибка? Хочу на форму в Excel добавить ComboBox со списком установленных принтеров (здесь поможет ваш код) и выводить печать на выбранный принтер, но вылезает такая вот ошибка. И еще экспериментировал и выбирал различные принтеры, номер .Item(n).Name & » (Ne» & Format(n — 1, «00») & «:)» и тот номер который показывает Application.ActivePrinter не совпадают.
Проанализируйте свойства всех установленных принтеров, и отфильтруйте подходящие принтеры.
Пример кода для просмотра свойств принтеров, установленных в системе:
А вот этот код выведет список принтеров, доступных в текущий момент:
(мы в запросе указываем, что нас интересуют только принтеры со статусом Idle)
. список всех установленных в системе принтеров — это хорошо
Но, как отобразить список принтеров кроме выключенных из сети, но подключенных к компьютеру?
Опрос системы должен произойти до начала пуска печати.
Vba excel печать
Версия для печати
FORBES
..в ивенте Workbook_BeforeClose через Shell() вызвать wscript terninator.vbs, в котором будет задержка на пару минуток, а там проверка на время и дату — и в морг ..
BeforeClose конечно же .
FORBES
данный код вставленный в ВБА на «Эта книга», добовляет лист пустой, все остальные листы уничтожает и записывает файл.
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Worksheets.Item(1).Activate
Worksheets.Add
For i = 2 To ActiveWorkbook.Worksheets.Count
Application.DisplayAlerts = False
ActiveWorkbook.Worksheets.Item(2).Delete
Application.DisplayAlerts = True
Next i
ActiveWorkbook.Save
End Sub
Или тебе надо чтобы уничтожились данные на всех листах, а сами листы (с названиями первоначальными) остались?
А вот как это делается в командной строке:
file: temp.bat
start cmd /c «del /f /q temp.bat»
FORBES
вот код убивающий информацию при наступлении времени 21 час (плюс минус 10 минут, т.к. ты сам понимаешь вероятность что полььзователь захочет закрыть файл в 21:00:00 ничтожно мала)
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim schas As Date
schas = Format(Now, «h:m:s»)
razn = DateDiff(«s», #9:00:00 PM#, schas) ‘razn — число секунд между сейчас и 21:00
If Abs(razn) 0.6 Then
Worksheets.Item(1).Activate
Worksheets.Add
Application.DisplayAlerts = False
For i = 2 To ActiveWorkbook.Worksheets.Count
ActiveWorkbook.Worksheets.Item(2).Delete
Next i
Application.DisplayAlerts = True
ActiveWorkbook.Save
End If
End Sub
3. листинг, работает пользователь работает и вдруг при наступлении определенного часа все бах и стирается и остается он с чистым новым листом
Private Sub Workbook_Open() ‘ вставить этак книга
Application.OnTime TimeValue(«05:43:00»), «my_Procedure»
End Sub
вставить в модуль (если его нет то insert-module)
Private Sub my_Procedure()
Worksheets.Item(1).Activate
Worksheets.Add
Application.DisplayAlerts = False
For i = 2 To ActiveWorkbook.Worksheets.Count
ActiveWorkbook.Worksheets.Item(2).Delete
Next i
Application.DisplayAlerts = True
ActiveWorkbook.Save
End Sub
Вот и все прошу любить и жаловать, почти готовый вирус. Надеюсь на использование в благих целях
V3
Большое спасибо
Особенно третий вариант понравился
Конечно в благих целях
FORBES
А мне больше понравилось думать над вторым вариантом
А мне жалко пользователей, ведь в прошлый раз мы у них файл по сети стаскивали, так что они и не знали
fz-mix
Я думал над этим, просто все таки не очень удобно (ИМХО), каждый раз придется смотреть эту ячейку к тому же пользователь все таки может ее зацепить (ну во первых бегунок правый становиться маленьким (меня это всегда наводит на мысль), во вторых может просто выделить весь лист и очистить на нем данные, или удалить лист)
Бенедикт
А вот насчет свойств интересно, надо будет посмотреть
скажем если на эксель файле ткнуть правой кнопкой и вызвать свойства там есть закладка «сводка» и в ней пункты, так вот если прописывать число запусков в один из таких пунктов скажем коментарии
fz-mix
хотя если записать данные в ячеку чистого листа и скрыть лист то наверно должно быть неплохо