![]() |
Замена шифра в тексте и печать большого количества документов
Имеется документ MS Word, который состоит из двух страниц. На первой странице документа в четырех местах имеется шифр вида "x" и этот шифр необходимо менять в арифметической последовательности "x+1" (то есть сначала в четырёх местах написан шифр "x", потом шифр меняется и во всех четырёх местах напсиан шифр "x+1" и так далее, до определённого значения), а остальной текст оставлять без изменений и при этом распечатывать каждый раз при изменении значения в автоматическом режиме, используя двустороннюю печать.
Используя возможности VB я добился следующего: 1 - при открытии документа у меня появляется форма, в которую я ввожу начальное значение шифра вида "x", потом ввожу общее число необходимых мне подстановок "y" 2 - кнопка "подстановка" меняет шифр вида "x" на введённое значение в создаваемом документе в необходимых мне четырёх местах (это я сделал при помощи закладок). На текущий момент времени я могу создавать только один документ с введённым форму значением. 3 - кнопка "отмена" закрывает форму, потом документ и затем закрывает Word Вот как это выглядит на текущий момент времени Код:
Private Sub CommandButton1_Click() здесь приводится пример как на странице документа выставляется каждый раз новое число с одного до другого и каждый раз при этом документ распечатывается. я надеюсь правильно понял пример =) Код:
Sub Печать_кучи_документов_с_номерами() она меня безумно напугала из-за огромного кода на казалось бы простую операцию - установка дуплекса на печать документа вообщем, как видите, пока что в голове бардак... Требуется помощь для наведения порядка в голове и мыслях. |
IMHO, вы слишком усложняете. По сути, вам нужно выполнить цикл c глобальной заменой (как в первом примере) или перебором закладок с последующей печатью документа. Двухстороннюю печать на время выполнения кода проще задать в свойствах принтера по умолчанию, чтобы не связываться с WinAPI.
|
Dr.DG,
вот что мне удалось сделать на текущий момент времени: Код:
Private Sub CommandButton1_Click() По-прежнему есть некоторые моменты, которые хотелось бы улучшить: 1 - в документе "BLANK.docm", над которым и проводятся все действия, имеется 4 закладки на 4 одинаковых числа, которые начинаются с цифры "ноль". Например, 012222. Так вот сейчас я вынужден был перед каждой закладкой поместить цифру "ноль",а в поле TextBox1 пользовательской формы UserForm1 вбивать значение без цифры "ноль", например 12222. Можно ли сделать так, чтобы в поле TextBox1 я вносил значение например 012222, в поле TextBox2 я вносил значение например 2 и при этом происходила правильная отработка "lNumber + (i - 1)" и на печать выводились документы с изменёнными номерами - 012222 в первом документе и 012223 во втором документе? 2 - во время выполнения кода открываются новые вкладки с документами, с изменёнными номерами. Как избавиться от этого, чтобы ничего не появлялось, а просто в очередь печати все документы складывались сразу и всё? 3 - необходима двусторонняя печать документа "BLANK.docm". Принтер обладает необходимой функцией. |
по пункту 2 родилась вот какая идея
Код:
'закрываем активный документ без сохранения изменений, поскольку после вставки |
и ещё появились следующие вопросы (сохранена сквозная нумерация проблем):
4 - текст, вводимый в TextBox1, должен проверяться на следующие условия - это должно быть число, число должно состоять из 5 цифр, и не должно начинаться на ноль. 5 - текст, вводимый в TextBox2, должен проверяться на следующие условия - это должно быть число равное "1", "2" или "50". |
1 - непонятно.
2 - новые вкладки (новые документы) создаются из-за этой строчки: Код:
Set oDoc = Application.Documents.Add("C:\Primer\BLANK.docm") Код:
Set oDoc = ActiveDocument 3 - повторяю, задаёте двухстороннюю печать в свойствах принтера в Панели управления. ManualDuplexPrint:=True - это ручной дуплекс средствами Word. 4 - Проверка на число Код:
If IsNumeric(TextBox1.Value) Then Код:
If Len(TextBox1.Text) = 5 Then Код:
If Left(TextBox1.Text, 1) = "0" Then Код:
If TextBox2.Value = 1 _ |
спасибо огромное за подсказки, сейчас всё переварю, отрихтую и проверю =)
|
Итак, сходу образовалась вот какая проблема:
решил использовать ActiveDocument, убрав переменную oDoc, то есть строки стали вот какимим Код:
как правильно использовать подстановку на место закладки? |
и еще вопрос у меня напрашивается например по пункту 5:
я не понимаю что мне писать в коде после слова Then Код:
If TextBox2.Value = 1 _ а вот что после слова Then? что-то я не догоняю... мне бы наоборот сделать, чтобы если НЕ РАВНО, то сообщение, вот как-то так... если пишу If Not , то проверяется только первое значение на 1, а дальше проверка не идёт... |
Код:
If Not (TextBox2.Value = 1 Or TextBox2.Value = 2 Or TextBox2.Value = 50) Then Код:
If TextBox2.Value <> 1 Or TextBox2.Value <> 2 Or TextBox2.Value <> 50 Then |
Цитата:
|
Iska,
спасибо огромное за подсказку со скобками! фантастика, как просто с одной стороны, но мне и в голову не пришло, что можно использовать скобку в таком случае. P.S. вы даже не представляете, как много я уже узнал за последний месяц, решая эту задачу =) Dr.DG, да, я примерно понимаю о чём вы говорите... я находил на просторах инета что-то подобное, но не смог сделать, поскольку там явно были ошибки, которые мне не удалось решить. сейчас найду ещё раз и буду внимательно изучать в этом направлении. Спасибо огромное! Dr.DG, кстати, по поводу нулей в начале шифра, вот что мне удалось найти "0"&Cstr(lNumber + (i - 1)) вот как просто добавлять ноль в начале шифра и корректно отрабатывать арифметическую прогрессию с подобным шифром. |
Цитата:
завтра продолжу поиск - сейчас уже спать... |
вот нашёл дуплексная печать
безумное количество букв и абсолютно мне непонятно.... |
Код:
Option Explicit есть правда по-прежнему небольшие недочёты, которые вносят в некотором роде незавершённость данному проекту: 1 - двустороння печать реализована путём создания нового принтера, в свойствах печати которого выставлена принудительно двусторонняя печать и весь документ печатается исключительно через этот принтер. А хотелось бы конечно иметь более универсальный проект, чтобы не приходилось дополнительно производить какие либо манипуляции с компом и его принтерами. 2 - по-прежнему не могу понять как реализовать правильное использования закладок (bookmarks), поскольку на текущий момент времени у меня происходит не вставка текста, а полная замена закладки на текст, поэтмоу приходится с каждым витком открывать документ снова и снова. Вот нашёл казалось бы замечательную статью про закладки, но не могу понять что делать с ней и как изменить под свои условия - см. эту статью 3 - в момент открытия документа появляется UserForm1, если нажать на "крестик", то появляется вот это сообщение из кода проекта Код:
MsgBox "Ошибка!" & " " & "Введите 6 цифр номера задания" Либо как вариант чтобы отсутствовал тот самый "крестик" на форме =) Помогите пожалуйста, осталось совсем немного... |
2 - в статье по вашей ссылке есть подпрограмма обновления текста закладки UpdateBookmark, используйте её вместо прямого обновления. Вместо строк типа
Код:
oDoc.Bookmarks("bm_1").Range.Text = "0" & CStr(lNumber + (i - 1)) Код:
UpdateBookmark "bm_1", "0" & CStr(lNumber + (i - 1)) |
Dr.DG,
мне бы даже в голову не пришло, что простая вставка кода в форму решит вопрос с обновлением закладок, даже менять ничего не пришлось. у меня теперь другие вопросы возникли: 1 - каким образом сделать UserForm1 незакрывающуюся? То есть чтобы на форме отсутствовал "крестик", либо чтобы на UserForm1 "крестик" был неактивным, затемнен. Хотя лучше конечно чтобы он просто-напросто отсутствовал. 2 - каким образом осуществить закрытие приложения Word? указанный ниже код не закрывает приложение... Код:
Word.Application.Quit |
Вложений: 1
по поводу первого пункта нашёл замечательную вещь, но абсолютно в ней не могу разобраться, поскольку кода очень много для меня, мне столько не переварить...
мне необходим либо вариант "меню", либо вариант "крестик" (см. пример во вложении) подскажите какой код выдернуть из примера и куда его вставить, пожалуйста. |
по поводу пункта 2 - возникло недоразумение из-за того, что сначала выполнялась процедура закрытия текущего активного документа, а потом осуществлялась попытка закрыть приложение Word, но в этом и есть абсурдность ситуации, потому что уже некому и нечему выполнять код =)
я думаю, что верно понял этот момент. получается, что эту ситуацию необходимо оставить как есть. хотя если есть у кого комментарии - высказывайтесь, может есть другое решение вопроса. всё ещё жду решение вопроса по пункту 1. спасибо за внимание. |
AKBAMAPUH, ничто не мешает сохранить документ/документы и воспользоваться сразу «Application.Quit» без «Document.Close». Либо просто использовать потребным образом первый аргумент — «SaveChanges» — метода «Application.Quit»: Quit Method.
|
по пункту 1 мне вот что подсказали
Код:
'отключение крестика на UserForm1 А вот как сделал по пункту 2 Код:
|
Время: 07:53. |
Время: 07:53.
© OSzone.net 2001-