День добрый уважаемые форумчане Нарыл на забугорном сайте не плохой макрос для печати из под экселя совершенно любого формата файла (главное чтоб тот был зарегистрирован в системе) Вот сам макрос: [vba]
Код
Option Explicit Public Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" ( _ ByVal hwnd As Long, _ ByVal lpOperation As String, _ ByVal lpFile As String, _ ByVal lpParameters As String, _ ByVal lpDirectory As String, _ ByVal nShowCmd As Long) As Long
Public Function PrintThisDoc(formname As Long, FileName As String) On Error Resume Next Dim X As Long X = ShellExecute(formname, "Print", FileName, 0&, 0&, 3) End Function
Sub testPrint() Dim printThis Dim strDir As String Dim strFile As String
strDir = "C:\NewFolder" strFile = "My.pdf" printThis = PrintThisDoc(0, strDir & "\" & strFile) End Sub
[/vba] А под себя я переделал - Отдельным модулем эту часть: [vba]
Код
Option Explicit Public Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" ( _ ByVal hwnd As Long, _ ByVal lpOperation As String, _ ByVal lpFile As String, _ ByVal lpParameters As String, _ ByVal lpDirectory As String, _ ByVal nShowCmd As Long) As Long
Public Function PrintThisDoc(formname As Long, FileName As String) On Error Resume Next Dim X As Long X = ShellExecute(formname, "Print", FileName, 0&, 0&, 3) End Function
[/vba] А оставшуюся часть заключил в цикл (для нужного количество печати): [vba]
Код
Private Sub CommandButton1_Click()
If CheckBox1.Value Then For i = 1 To TextBox1 '____________________________ 'Указываем расположение файла strDir = Range("b3") 'Название файла strFile = Range("c3") printThis = PrintThisDoc(0, strDir & "\" & strFile) '____________________________ Next Else End If
'И т.д. и т.п.
If CheckBox(N).Value Then For i = 1 To TextBox1 '____________________________ 'Указываем расположение файла strDir = Range("b(N)") 'Название файла strFile = Range("c(N)") printThis = PrintThisDoc(0, strDir & "\" & strFile) '____________________________ Next Else End If
End Sub
[/vba] Так вот данный метод - метод цикла тормозит процесс печати, получается файл открывается N-е кол-во раз - заданное в макросе(TextBox1),перед каждой печатью. Чутье мне подсказывает где то зарыта собака в первой части. Помогите пожалуйста. Каждая часть заключена в цикл для того чтоб не разбиралась , по копиям. Если же весь макрос заключить в цикл то пример печати будет 1,2,3 1,2,3 1,2,3, вместо положенного 1,1,1 2,2,2 3,3,3. Кстати это тоже было бы замечательно осуществить - выбор печати.
День добрый уважаемые форумчане Нарыл на забугорном сайте не плохой макрос для печати из под экселя совершенно любого формата файла (главное чтоб тот был зарегистрирован в системе) Вот сам макрос: [vba]
Код
Option Explicit Public Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" ( _ ByVal hwnd As Long, _ ByVal lpOperation As String, _ ByVal lpFile As String, _ ByVal lpParameters As String, _ ByVal lpDirectory As String, _ ByVal nShowCmd As Long) As Long
Public Function PrintThisDoc(formname As Long, FileName As String) On Error Resume Next Dim X As Long X = ShellExecute(formname, "Print", FileName, 0&, 0&, 3) End Function
Sub testPrint() Dim printThis Dim strDir As String Dim strFile As String
strDir = "C:\NewFolder" strFile = "My.pdf" printThis = PrintThisDoc(0, strDir & "\" & strFile) End Sub
[/vba] А под себя я переделал - Отдельным модулем эту часть: [vba]
Код
Option Explicit Public Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" ( _ ByVal hwnd As Long, _ ByVal lpOperation As String, _ ByVal lpFile As String, _ ByVal lpParameters As String, _ ByVal lpDirectory As String, _ ByVal nShowCmd As Long) As Long
Public Function PrintThisDoc(formname As Long, FileName As String) On Error Resume Next Dim X As Long X = ShellExecute(formname, "Print", FileName, 0&, 0&, 3) End Function
[/vba] А оставшуюся часть заключил в цикл (для нужного количество печати): [vba]
Код
Private Sub CommandButton1_Click()
If CheckBox1.Value Then For i = 1 To TextBox1 '____________________________ 'Указываем расположение файла strDir = Range("b3") 'Название файла strFile = Range("c3") printThis = PrintThisDoc(0, strDir & "\" & strFile) '____________________________ Next Else End If
'И т.д. и т.п.
If CheckBox(N).Value Then For i = 1 To TextBox1 '____________________________ 'Указываем расположение файла strDir = Range("b(N)") 'Название файла strFile = Range("c(N)") printThis = PrintThisDoc(0, strDir & "\" & strFile) '____________________________ Next Else End If
End Sub
[/vba] Так вот данный метод - метод цикла тормозит процесс печати, получается файл открывается N-е кол-во раз - заданное в макросе(TextBox1),перед каждой печатью. Чутье мне подсказывает где то зарыта собака в первой части. Помогите пожалуйста. Каждая часть заключена в цикл для того чтоб не разбиралась , по копиям. Если же весь макрос заключить в цикл то пример печати будет 1,2,3 1,2,3 1,2,3, вместо положенного 1,1,1 2,2,2 3,3,3. Кстати это тоже было бы замечательно осуществить - выбор печати.televnoy
А зачем тут Excel и VBA приплетать? Ставите любой бесплатный PDF-принтер (если его у Вас ещё нет) хоть, например, ОТСЮДА, открываете файл родным для него приложением и печатаете сколько нужно копий на этот принтер. И никаких проблем. А предложение открывать в Excel'e файл стороннего приложения и печатать через него - это, извините, операция на гландах через анус.
А зачем тут Excel и VBA приплетать? Ставите любой бесплатный PDF-принтер (если его у Вас ещё нет) хоть, например, ОТСЮДА, открываете файл родным для него приложением и печатаете сколько нужно копий на этот принтер. И никаких проблем. А предложение открывать в Excel'e файл стороннего приложения и печатать через него - это, извините, операция на гландах через анус.Alex_ST
С уважением, Алексей MS Excel 2003 - the best!!!
Сообщение отредактировал Alex_ST - Четверг, 25.09.2014, 10:39
Alex_ST, Около 500 папок, в каждой как минимум по 10-15 файлов. Ежедневно перелопачивать эти папки и каждый открыть и отправить на печать.
Хм, а мне почему то казалось что намного удобнее будет открыть книгу с данными. Проставить галочки требуемых файлов, и отправить их на печать, в требуемом количестве, которое тоже меняется ежедневно.
Изначально файлы экселевские. Которые весят некоторые под 15 МБ напихано в них рисунки, форматы и др(представляете как долго подвисает система). ПДФ-ки весят от 70-100 Кб разница явно ощутима, и так не грузит систему.
А ниже вся таблица которую ползаватель видит, а не перебирает весь проводник то там маленько а говорю около 5000 файлов получается.
Alex_ST, Около 500 папок, в каждой как минимум по 10-15 файлов. Ежедневно перелопачивать эти папки и каждый открыть и отправить на печать.
Хм, а мне почему то казалось что намного удобнее будет открыть книгу с данными. Проставить галочки требуемых файлов, и отправить их на печать, в требуемом количестве, которое тоже меняется ежедневно.
Изначально файлы экселевские. Которые весят некоторые под 15 МБ напихано в них рисунки, форматы и др(представляете как долго подвисает система). ПДФ-ки весят от 70-100 Кб разница явно ощутима, и так не грузит систему.
А ниже вся таблица которую ползаватель видит, а не перебирает весь проводник то там маленько а говорю около 5000 файлов получается.
Alex_ST, Мне нужен лист задания на печать. Он получился но с тормозом. Один и тот же файл открывается n-ое количество раз, после печать. Вместо того чтоб открыться один раз распечаталось n-ое количество копий.
Alex_ST, Мне нужен лист задания на печать. Он получился но с тормозом. Один и тот же файл открывается n-ое количество раз, после печать. Вместо того чтоб открыться один раз распечаталось n-ое количество копий.televnoy
О-па! 0_o
Сообщение отредактировал televnoy - Четверг, 25.09.2014, 11:48
Alex_ST, Бывают, бывают собаки-сисадмины =) А я не спрашиваю у них. Куча прог portable стоит. Из за невозможности поставить полнофункционал. Но это пока единственное чем я ограничен.
Ребята и девчата куму дают сисадмины (в хорошем смысле ) , пожалуйста примите участие
Alex_ST, Бывают, бывают собаки-сисадмины =) А я не спрашиваю у них. Куча прог portable стоит. Из за невозможности поставить полнофункционал. Но это пока единственное чем я ограничен.
Ребята и девчата куму дают сисадмины (в хорошем смысле ) , пожалуйста примите участие televnoy
AndreTM, Блин, видели бы вы мое выражение лица. Как мое мировоззрение поменялось. И было б нечего, если бы я в начале не отнесся к WSH скептически. Но при написании простой фразы MsgBox "Hello" в текстовом редакторе и сохранении его в vbs, после запуска я чуть не заревел. Какой я....... Но это ладно. Зачем приплетать Excel и VBA так как я хоть маленько ориентируюсь в этом. Допустим в Excel есть какой то список файлов напротив CheckBox где задаю да,или нет. Пусть без Excel в VBA UserForm смогу состряпать. И то VBA из под Excel. Пытался нарыть самоучители или что то вроде этого в инете, но инфы не нашел, а самому тыкатся в Visual Studio 2012, сложновато. И
Цитата
VBS (вернее, использование WSH) не помогут?
Возможно помогут но как? Я так понял vbs аналогичен vba... Не проще ли доделать уж эту задачку? Тем более она рабочая но тормазнутая. И мне от тормоза надо избавится.
AndreTM, Блин, видели бы вы мое выражение лица. Как мое мировоззрение поменялось. И было б нечего, если бы я в начале не отнесся к WSH скептически. Но при написании простой фразы MsgBox "Hello" в текстовом редакторе и сохранении его в vbs, после запуска я чуть не заревел. Какой я....... Но это ладно. Зачем приплетать Excel и VBA так как я хоть маленько ориентируюсь в этом. Допустим в Excel есть какой то список файлов напротив CheckBox где задаю да,или нет. Пусть без Excel в VBA UserForm смогу состряпать. И то VBA из под Excel. Пытался нарыть самоучители или что то вроде этого в инете, но инфы не нашел, а самому тыкатся в Visual Studio 2012, сложновато. И
Цитата
VBS (вернее, использование WSH) не помогут?
Возможно помогут но как? Я так понял vbs аналогичен vba... Не проще ли доделать уж эту задачку? Тем более она рабочая но тормазнутая. И мне от тормоза надо избавится.televnoy
Возможно помогут но как? Я так понял vbs аналогичен vba... Не проще ли доделать уж эту задачку?
Вы загружаете Excel только для того, чтобы выдать список файлов с чекбоксами, так? Используя WSH, вы можете просто создать свою формочку, со списком файлов, с возможностью их отметить (как - это уж ваше дело - хоть грид с чекбоксами, хоть лист/комбо с мультивыбором, хоть...), а затем оттуда же все обработаете, как вам надо. Ведь из Excel вам все равно, если по уму, придется обращаться к системе (например, опрашивать принтеры через WMI, вызывать внешние проги для печати), так зачем это делать, если можно работать без Офиса вообще? Да может, у меня и Excelя-то нету, а печатать файлы я хочу
Возможно помогут но как? Я так понял vbs аналогичен vba... Не проще ли доделать уж эту задачку?
Вы загружаете Excel только для того, чтобы выдать список файлов с чекбоксами, так? Используя WSH, вы можете просто создать свою формочку, со списком файлов, с возможностью их отметить (как - это уж ваше дело - хоть грид с чекбоксами, хоть лист/комбо с мультивыбором, хоть...), а затем оттуда же все обработаете, как вам надо. Ведь из Excel вам все равно, если по уму, придется обращаться к системе (например, опрашивать принтеры через WMI, вызывать внешние проги для печати), так зачем это делать, если можно работать без Офиса вообще? Да может, у меня и Excelя-то нету, а печатать файлы я хочу AndreTM
По сути - да. По идее, достаточно научиться создавать объекты через CreateObject() И просто насоздавать чего-нить из стандартной MSForms. И научиться динамичеси управлять объектами на форме. Т.е. то, что в IDE вы рисуете ручками (юзерформу и элементы управления) - там нужно делать кодом (ну, если не скомлилить свои библиотеки ). Или если знаете VC (вернее, яву) - то ведь в WSH есть и JS...
По сути - да. По идее, достаточно научиться создавать объекты через CreateObject() И просто насоздавать чего-нить из стандартной MSForms. И научиться динамичеси управлять объектами на форме. Т.е. то, что в IDE вы рисуете ручками (юзерформу и элементы управления) - там нужно делать кодом (ну, если не скомлилить свои библиотеки ). Или если знаете VC (вернее, яву) - то ведь в WSH есть и JS...AndreTM
AndreTM, При создании новой формы, выяснилось, что не
Цитата
только для того, чтобы выдать список файлов с чекбоксами
, но на листе своего рода база данных с путями и именами фалов. Так как при изменении имени Listbox вводимым в TextBoх, данные путей так же вводимыми в TextBoх, форма при закрытии и открытии не сохраняет этих данных. Следовательно надо делать какуето базу данных, чтоб форма при открытии подкачивала эти значения с нее. Или работа с реестром, что не одобрят
Цитата
собаки-сисадмины
. Сами формы написаны на ВБА, файл с расширение exe.
В общем в продолжении темы НЕЛЬЗЯ ЛИ ДОДЕЛАТЬ уже существующий, что б в данный момент не лезть пока в дебри программирования. Или же начинать заводить новую тему форума, и сомневаюсь, что следует ее заводить на данном сайте. Ведь это рельно уже вопрос по программированию.
AndreTM, При создании новой формы, выяснилось, что не
Цитата
только для того, чтобы выдать список файлов с чекбоксами
, но на листе своего рода база данных с путями и именами фалов. Так как при изменении имени Listbox вводимым в TextBoх, данные путей так же вводимыми в TextBoх, форма при закрытии и открытии не сохраняет этих данных. Следовательно надо делать какуето базу данных, чтоб форма при открытии подкачивала эти значения с нее. Или работа с реестром, что не одобрят
Цитата
собаки-сисадмины
. Сами формы написаны на ВБА, файл с расширение exe.
В общем в продолжении темы НЕЛЬЗЯ ЛИ ДОДЕЛАТЬ уже существующий, что б в данный момент не лезть пока в дебри программирования. Или же начинать заводить новую тему форума, и сомневаюсь, что следует ее заводить на данном сайте. Ведь это рельно уже вопрос по программированию.televnoy
Как раз 4-ый аргумент Shellexecute предназначен для передачи параметров. 0& - это тоже самое, что NULL. Т.е. ничего не передается. И по сути Вам надо узнать поддерживает ли передачу параметров из командной строки Ваша программа, которая печатает PDF. Если да - в каком виде. И уже тогда передавать кол-во копий в этот аргумент в нужном формате. Правда, т.к. Вы передаете в качестве имени файла документ - то аргументы уже не получится передать. Т.е. по факту если вместо имени документа открывать само приложение - то можно передать какие-то доп.параметры(в том числе и имя файла). В ином случае - нет. Т.е. за все приходится чем-то платить - в данном случае за возможность печатать не указывая конкретное приложение Вы платите невозможностью указать дополнительные параметры печати.
Как раз 4-ый аргумент Shellexecute предназначен для передачи параметров. 0& - это тоже самое, что NULL. Т.е. ничего не передается. И по сути Вам надо узнать поддерживает ли передачу параметров из командной строки Ваша программа, которая печатает PDF. Если да - в каком виде. И уже тогда передавать кол-во копий в этот аргумент в нужном формате. Правда, т.к. Вы передаете в качестве имени файла документ - то аргументы уже не получится передать. Т.е. по факту если вместо имени документа открывать само приложение - то можно передать какие-то доп.параметры(в том числе и имя файла). В ином случае - нет. Т.е. за все приходится чем-то платить - в данном случае за возможность печатать не указывая конкретное приложение Вы платите невозможностью указать дополнительные параметры печати.The_Prist
Errare humanum est, stultum est in errore perseverare