Есть код, который открывает текстовые файлы через ворд (так нужно коллегам), ищет в них пару значений, заменяет их на другие и печатает
[vba]
Код
Public Sub Print98()
Set FSO = CreateObject("Scripting.FileSystemObject") Set objWord = CreateObject("Word.Application")
Set objDoc98 = objWord.Documents.Open("\\d\test.txt", ReadOnly:=True)
With objWord.Selection .Find.Text = "PQ1" .Find.Replacement.Text = "PQ" & m .Find.Execute Replace:=1, Forward:=True, _ Wrap:=wdFindContinue
.Find.Text = "{PARAM1}" If .Find.Found = True Then .Find.Replacement.Text = 22 .Find.Execute Replace:=wdReplaceAll, Forward:=True, _ Wrap:=wdFindContinue End If objDoc98.PrintOut End With End Sub
[/vba]
Работает вроде бы хорошо, но мои коллеги жалуются, что не могут отправить на другой принтер новое задание, пока предыдущее полностью не отпечатается (порядка 10 принтеров zebra в подчинении - печатают этикетки). Но ждать некогда, нарушается производительность....(((
Узнал, что через Шелл вроде как можно сделать параллельные процессы сделать, вот только, как тогда мне организовывать корректировку значений в открываемых файлах перед печатью?
[vba]
Код
Dim objWord As Object, objDoc98 As Object
Set FSO = CreateObject("Scripting.FileSystemObject") shell "word.exe \\d\file1.txt" Set objDoc1 = getObject(, "Word.Application")
objDoc1.PrintOut
[/vba] Ну и дальше мне закрывать их кодом как-то понадобится... Подскажите пожалуйста, как такое можно организовать?
Добрый день.
Есть код, который открывает текстовые файлы через ворд (так нужно коллегам), ищет в них пару значений, заменяет их на другие и печатает
[vba]
Код
Public Sub Print98()
Set FSO = CreateObject("Scripting.FileSystemObject") Set objWord = CreateObject("Word.Application")
Set objDoc98 = objWord.Documents.Open("\\d\test.txt", ReadOnly:=True)
With objWord.Selection .Find.Text = "PQ1" .Find.Replacement.Text = "PQ" & m .Find.Execute Replace:=1, Forward:=True, _ Wrap:=wdFindContinue
.Find.Text = "{PARAM1}" If .Find.Found = True Then .Find.Replacement.Text = 22 .Find.Execute Replace:=wdReplaceAll, Forward:=True, _ Wrap:=wdFindContinue End If objDoc98.PrintOut End With End Sub
[/vba]
Работает вроде бы хорошо, но мои коллеги жалуются, что не могут отправить на другой принтер новое задание, пока предыдущее полностью не отпечатается (порядка 10 принтеров zebra в подчинении - печатают этикетки). Но ждать некогда, нарушается производительность....(((
Узнал, что через Шелл вроде как можно сделать параллельные процессы сделать, вот только, как тогда мне организовывать корректировку значений в открываемых файлах перед печатью?
[vba]
Код
Dim objWord As Object, objDoc98 As Object
Set FSO = CreateObject("Scripting.FileSystemObject") shell "word.exe \\d\file1.txt" Set objDoc1 = getObject(, "Word.Application")
objDoc1.PrintOut
[/vba] Ну и дальше мне закрывать их кодом как-то понадобится... Подскажите пожалуйста, как такое можно организовать?Raven2009
Сообщение отредактировал Raven2009 - Воскресенье, 24.11.2019, 12:13
что не могут отправить на другой принтер новое задание,
что под этим подразумевается? Ручной выбор или просто в момент печати идет рендеринг, не позволяющий работать Word. Если печать идет из Word, то рендеринг для зебры сравнительно долгий, нужно переходить на ZPL, все ускорится в разы, в том числе и печать.
что не могут отправить на другой принтер новое задание,
что под этим подразумевается? Ручной выбор или просто в момент печати идет рендеринг, не позволяющий работать Word. Если печать идет из Word, то рендеринг для зебры сравнительно долгий, нужно переходить на ZPL, все ускорится в разы, в том числе и печать.bmv98rus
Замечательный Временно просто медведь , процентов на 20.
Я не против этого, но есть куча текстовых файлов, с которыми работают вручную и направляют напрямую на печать) Я не пользовался ZPL, может подскажете по одному из примеров текстового файла?:
-по причинам периодических смещений бумаги после ее новой установки на принтер, например перед печатью нужно выравнивать расположение текста через изменения числовых значений после слов LT (выравнивание по высоте) и LS (выравнивание по ширине) -есть слово в тексте {PARAM}, которое тоже ручками пользователь меняет на срок годности (месяц/год) - в конце текста числовое значение после PQ пользователь ручками меняет на нужное ему - это количество страниц
ZPL поможет в выполнении этих условий? Если да, то это ПО в свободном доступе?
Я не против этого, но есть куча текстовых файлов, с которыми работают вручную и направляют напрямую на печать) Я не пользовался ZPL, может подскажете по одному из примеров текстового файла?:
-по причинам периодических смещений бумаги после ее новой установки на принтер, например перед печатью нужно выравнивать расположение текста через изменения числовых значений после слов LT (выравнивание по высоте) и LS (выравнивание по ширине) -есть слово в тексте {PARAM}, которое тоже ручками пользователь меняет на срок годности (месяц/год) - в конце текста числовое значение после PQ пользователь ручками меняет на нужное ему - это количество страниц
ZPL поможет в выполнении этих условий? Если да, то это ПО в свободном доступе?Raven2009
Raven2009, в приложении и есть уже ZPL, значит все с эти ок. Не понятно зачем тогда Word, как промежуток. Если все сводится к необходимой замене, то это можно делать простым VBS и им же отправлять на печать, разве что нужно понимать как подключены принтера и как осуществлять их выбор. Одно скажу точно, запускать еще одну копию приложения - не лучшее решение.
Raven2009, в приложении и есть уже ZPL, значит все с эти ок. Не понятно зачем тогда Word, как промежуток. Если все сводится к необходимой замене, то это можно делать простым VBS и им же отправлять на печать, разве что нужно понимать как подключены принтера и как осуществлять их выбор. Одно скажу точно, запускать еще одну копию приложения - не лучшее решение.bmv98rus
Замечательный Временно просто медведь , процентов на 20.
ну пользователи так привыкли делать. открывают напрямую сохраненные текстовые файлы, корректируют их через ворд (в нем им удобно поиски параметров для замены делать) и отправляют на печать...
Если все сводится к необходимой замене, то это можно делать простым VBS и им же отправлять на печать, разве что нужно понимать как подключены принтера и как осуществлять их выбор.
Мы вернулись к моему вопросу по VBA в этой теме? У принтеров тут своеобразное подключение. Что я понял, нельзя сделать принтер зебра активным на момент печати, все пойдет на печать на принтер по умолчанию. Поэтому нашел способ временно делать принтер зебра, на который хочу сделать распечатку, принтером по умолчанию, распечатывать, а потом возвращать обратно старый принтер. Если это конечно поможет в решении вопроса...
ну пользователи так привыкли делать. открывают напрямую сохраненные текстовые файлы, корректируют их через ворд (в нем им удобно поиски параметров для замены делать) и отправляют на печать...
Если все сводится к необходимой замене, то это можно делать простым VBS и им же отправлять на печать, разве что нужно понимать как подключены принтера и как осуществлять их выбор.
Мы вернулись к моему вопросу по VBA в этой теме? У принтеров тут своеобразное подключение. Что я понял, нельзя сделать принтер зебра активным на момент печати, все пойдет на печать на принтер по умолчанию. Поэтому нашел способ временно делать принтер зебра, на который хочу сделать распечатку, принтером по умолчанию, распечатывать, а потом возвращать обратно старый принтер. Если это конечно поможет в решении вопроса...Raven2009
хорошо, тогда может, привязывать каждому открываемому объекту новую переменную, чтобы на печать они шли независимо? Вот здесь в моем вопросе например только 1 переменная, на которую пишется открываемый файл и потом этот объект печатается
[vba]
Код
Set objDoc98 = objWord.Documents.Open("\\d\test.txt", ReadOnly:=True)
[/vba]
Например если первый открываемый файл вешается на objDoc1
[vba]
Код
Set objDoc1 = objWord.Documents.Open("\\d\test1.txt", ReadOnly:=True)
[/vba]
пока печатается этот объект на одном принтере...
...второй открываемый файл вешается на objDoc2
[vba]
Код
Set objDoc2 = objWord.Documents.Open("\\d\test2.txt", ReadOnly:=True)
[/vba]
...и печатается на другой принтер
Возможно такое? Как правильно код мне написать если цикл для присвоения таких переменных нужен ObjDoc(i)? Корректировки внутри открываемых файлов тоже нужны будут...
хорошо, тогда может, привязывать каждому открываемому объекту новую переменную, чтобы на печать они шли независимо? Вот здесь в моем вопросе например только 1 переменная, на которую пишется открываемый файл и потом этот объект печатается
[vba]
Код
Set objDoc98 = objWord.Documents.Open("\\d\test.txt", ReadOnly:=True)
[/vba]
Например если первый открываемый файл вешается на objDoc1
[vba]
Код
Set objDoc1 = objWord.Documents.Open("\\d\test1.txt", ReadOnly:=True)
[/vba]
пока печатается этот объект на одном принтере...
...второй открываемый файл вешается на objDoc2
[vba]
Код
Set objDoc2 = objWord.Documents.Open("\\d\test2.txt", ReadOnly:=True)
[/vba]
...и печатается на другой принтер
Возможно такое? Как правильно код мне написать если цикл для присвоения таких переменных нужен ObjDoc(i)? Корректировки внутри открываемых файлов тоже нужны будут...Raven2009
Странно, что печать тормозит, по идее в спулер должно все улететь, в очередь и можно продолжать работать. Открытие второго файла не вылечит если приложение занято печатью. Зебра какая? Я посмотрю завтра.
Странно, что печать тормозит, по идее в спулер должно все улететь, в очередь и можно продолжать работать. Открытие второго файла не вылечит если приложение занято печатью. Зебра какая? Я посмотрю завтра.bmv98rus
Замечательный Временно просто медведь , процентов на 20.