|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » VBA - Замена шифра в тексте и печать большого количества документов |
|
|
VBA - Замена шифра в тексте и печать большого количества документов
|
Новый участник Сообщения: 26 |
Профиль | Отправить PM | Цитировать Имеется документ MS Word, который состоит из двух страниц. На первой странице документа в четырех местах имеется шифр вида "x" и этот шифр необходимо менять в арифметической последовательности "x+1" (то есть сначала в четырёх местах написан шифр "x", потом шифр меняется и во всех четырёх местах напсиан шифр "x+1" и так далее, до определённого значения), а остальной текст оставлять без изменений и при этом распечатывать каждый раз при изменении значения в автоматическом режиме, используя двустороннюю печать.
Используя возможности VB я добился следующего: 1 - при открытии документа у меня появляется форма, в которую я ввожу начальное значение шифра вида "x", потом ввожу общее число необходимых мне подстановок "y" 2 - кнопка "подстановка" меняет шифр вида "x" на введённое значение в создаваемом документе в необходимых мне четырёх местах (это я сделал при помощи закладок). На текущий момент времени я могу создавать только один документ с введённым форму значением. 3 - кнопка "отмена" закрывает форму, потом документ и затем закрывает Word Вот как это выглядит на текущий момент времени Private Sub CommandButton1_Click() If CheckBox1.Value = False Then MsgBox "Ошибка!" & " " & "Необходимо принять условие." 'выводим сообщение Else Dim oDoc As Document Set oDoc = Application.Documents.Add("C:\Template.dotm") oDoc.Bookmarks("bN_1").Range.Text = txtBlank.Value oDoc.Bookmarks("bN_2").Range.Text = txtBlank.Value oDoc.Bookmarks("bN_3").Range.Text = txtBlank.Value UserForm1.Hide oDoc.Activate End If End Sub Private Sub CommandButton2_Click() 'Выход из формы и закрытие окна документа при нажатии кнопки "Отменить" On Error GoTo ErrLabel Unload Me 'Закрываем форму ActiveDocument.Close 'Закрываем текущий документ ErrLabel: Application.Quit 'закрываем Word End Sub Private Sub txtBlank_Exit(ByVal Cancel As MSForms.ReturnBoolean) 'действия с полем номер бланка With Me.txtBlank If Not IsNumeric(.Text) Or Len(.Text) <> 6 Then 'если в поле "Бланк" данные не цифры и меньше или больше 6, то MsgBox "Ошибка!" & " " & "Введите 6 цифр бланка." 'выводим сообщение Cancel = True 'возвращаемся к полю .Text = "" 'очищаем поле .SetFocus End If End With End Sub Private Sub txtKolvo_Exit(ByVal Cancel As MSForms.ReturnBoolean) 'действия с полем общее количество бланков With Me.txtKolvo If Not IsNumeric(.Text) Or Len(.Text) <> 2 Then 'если в поле "общее количество бланков" данные не цифры и общее число цифр меньше или больше 2, то MsgBox "Ошибка!" & " " & "Вводить только число, состоящее из 2 цифр." 'выводим сообщение Cancel = True 'возвращаемся к полю .Text = "" 'очищаем поле .SetFocus End If End With End Sub здесь приводится пример как на странице документа выставляется каждый раз новое число с одного до другого и каждый раз при этом документ распечатывается. я надеюсь правильно понял пример Sub Печать_кучи_документов_с_номерами() ' В документе там где должен быть номер должна стоять 239366 ' For Номер_документа = 239366+1 To 239366+100 With Selection.Find .Text = Trim(Str(Номер_документа - 1)) .Replacement.Text = Trim(Str(Номер_документа)) .Forward = True .Wrap = wdFindContinue End With Selection.Find.Execute Replace:=wdReplaceAll Application.PrintOut Range:=wdPrintAllDocument, Item:= _ wdPrintDocumentContent, Copies:=1, Pages:="", PageType:=wdPrintAllPages, _ ManualDuplexPrint:=False, Collate:=True, Background:=True, PrintToFile:= _ False, PrintZoomColumn:=0, PrintZoomRow:=0, PrintZoomPaperWidth:=0, _ PrintZoomPaperHeight:=0 Next End Sub она меня безумно напугала из-за огромного кода на казалось бы простую операцию - установка дуплекса на печать документа вообщем, как видите, пока что в голове бардак... Требуется помощь для наведения порядка в голове и мыслях. |
|
Отправлено: 22:11, 12-09-2012 |
Новый участник Сообщения: 15
|
Профиль | Отправить PM | Цитировать IMHO, вы слишком усложняете. По сути, вам нужно выполнить цикл c глобальной заменой (как в первом примере) или перебором закладок с последующей печатью документа. Двухстороннюю печать на время выполнения кода проще задать в свойствах принтера по умолчанию, чтобы не связываться с WinAPI.
|
Отправлено: 23:45, 24-09-2012 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Новый участник Сообщения: 26
|
Профиль | Отправить PM | Цитировать Dr.DG,
вот что мне удалось сделать на текущий момент времени: Private Sub CommandButton1_Click() Dim lNumber As Long Dim i As Long 'Помещаем в переменную lNumber, с какого номера 'должна начинаться нумерация бланков. lNumber = Me.TextBox1.Value 'проверяем на согласие с условием If CheckBox1.Value = False Then 'выводим сообщение MsgBox "Ошибка!" & " " & "Необходимо принять условие." Else 'Делаем столько витков цикла, сколько бланков необходимо вывести на печать. For i = 1 To Me.TextBox2.Value Step 1 Dim oDoc As Document Set oDoc = Application.Documents.Add("C:\Primer\BLANK.docm") 'Помещаем в закладку "bN_1" данные из переменной lNumber. oDoc.Bookmarks("bN_1").Range.Text = lNumber + (i - 1) 'Помещаем в закладку "bN_2" данные из переменной lNumber. oDoc.Bookmarks("bN_2").Range.Text = lNumber + (i - 1) 'Помещаем в закладку "bN_3" данные из переменной lNumber. oDoc.Bookmarks("bN_3").Range.Text = lNumber + (i - 1) 'Помещаем в закладку "bN_4" данные из переменной lNumber. oDoc.Bookmarks("bN_4").Range.Text = lNumber + (i - 1) 'Распечатываем. Application.PrintOut Range:=wdPrintAllDocument, Item:= _ wdPrintDocumentContent, Copies:=1, Pages:="", PageType:=wdPrintAllPages, _ ManualDuplexPrint:=True, Collate:=True, Background:=True, PrintToFile:= _ False, PrintZoomColumn:=0, PrintZoomRow:=0, PrintZoomPaperWidth:=0, _ PrintZoomPaperHeight:=0 'Скрываем пользовательскую форму UserForm1.Hide Next i End If End Sub По-прежнему есть некоторые моменты, которые хотелось бы улучшить: 1 - в документе "BLANK.docm", над которым и проводятся все действия, имеется 4 закладки на 4 одинаковых числа, которые начинаются с цифры "ноль". Например, 012222. Так вот сейчас я вынужден был перед каждой закладкой поместить цифру "ноль",а в поле TextBox1 пользовательской формы UserForm1 вбивать значение без цифры "ноль", например 12222. Можно ли сделать так, чтобы в поле TextBox1 я вносил значение например 012222, в поле TextBox2 я вносил значение например 2 и при этом происходила правильная отработка "lNumber + (i - 1)" и на печать выводились документы с изменёнными номерами - 012222 в первом документе и 012223 во втором документе? 2 - во время выполнения кода открываются новые вкладки с документами, с изменёнными номерами. Как избавиться от этого, чтобы ничего не появлялось, а просто в очередь печати все документы складывались сразу и всё? 3 - необходима двусторонняя печать документа "BLANK.docm". Принтер обладает необходимой функцией. |
Отправлено: 20:14, 29-09-2012 | #3 |
Новый участник Сообщения: 26
|
Профиль | Отправить PM | Цитировать |
Отправлено: 20:48, 29-09-2012 | #4 |
Новый участник Сообщения: 26
|
Профиль | Отправить PM | Цитировать и ещё появились следующие вопросы (сохранена сквозная нумерация проблем):
4 - текст, вводимый в TextBox1, должен проверяться на следующие условия - это должно быть число, число должно состоять из 5 цифр, и не должно начинаться на ноль. 5 - текст, вводимый в TextBox2, должен проверяться на следующие условия - это должно быть число равное "1", "2" или "50". |
|
Отправлено: 22:31, 29-09-2012 | #5 |
Новый участник Сообщения: 15
|
Профиль | Отправить PM | Цитировать 1 - непонятно.
2 - новые вкладки (новые документы) создаются из-за этой строчки: Нужно так , но, так как вы работаете только с активным документом, IMHO, переменная oDoc вообще не нужна, обращайтесь напрямую к ActiveDocument. 3 - повторяю, задаёте двухстороннюю печать в свойствах принтера в Панели управления. ManualDuplexPrint:=True - это ручной дуплекс средствами Word. 4 - Проверка на число Проверка на количество цифр Проверка на 0 в первой цифре 5 - |
Отправлено: 14:24, 01-10-2012 | #6 |
Новый участник Сообщения: 26
|
Профиль | Отправить PM | Цитировать спасибо огромное за подсказки, сейчас всё переварю, отрихтую и проверю
|
Отправлено: 19:08, 01-10-2012 | #7 |
Новый участник Сообщения: 26
|
Профиль | Отправить PM | Цитировать Итак, сходу образовалась вот какая проблема:
решил использовать ActiveDocument, убрав переменную oDoc, то есть строки стали вот какимим 'Помещаем в закладку "bN_1" данные из переменной lNumber. ActiveDocument.Bookmarks("bN_1").Range.Text = lNumber + (i - 1) 'Помещаем в закладку "bN_2" данные из переменной lNumber. ActiveDocument.Bookmarks("bN_2").Range.Text = lNumber + (i - 1) 'Помещаем в закладку "bN_3" данные из переменной lNumber. ActiveDocument.Bookmarks("bN_3").Range.Text = lNumber + (i - 1) 'Помещаем в закладку "bN_4" данные из переменной lNumber. ActiveDocument.Bookmarks("bN_4").Range.Text = lNumber + (i - 1) как правильно использовать подстановку на место закладки? |
Отправлено: 19:28, 01-10-2012 | #8 |
Новый участник Сообщения: 26
|
Профиль | Отправить PM | Цитировать и еще вопрос у меня напрашивается например по пункту 5:
я не понимаю что мне писать в коде после слова Then после слова Else я напишу чтобы появлялось MsgBox "Ошибка!" & " " & "Введите значение равное 1, 2 или 50" а вот что после слова Then? что-то я не догоняю... мне бы наоборот сделать, чтобы если НЕ РАВНО, то сообщение, вот как-то так... если пишу If Not , то проверяется только первое значение на 1, а дальше проверка не идёт... |
Отправлено: 20:02, 01-10-2012 | #9 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать |
Отправлено: 20:23, 01-10-2012 | #10 |
|
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Установка большого количества .exe | LEXYS | AutoIt | 1 | 23-02-2012 09:44 | |
CMD/BAT - Подстановка большого количества параметров. | Zeneth | Скриптовые языки администрирования Windows | 13 | 30-12-2011 13:16 | |
Разное - Поиск количества строк в тексте | DaRiYs | Программирование и базы данных | 2 | 15-03-2010 16:24 | |
Разное - IE зависает при открытии большого количества вкладок | multy | Microsoft Windows Vista | 2 | 11-10-2007 14:25 | |
замена символа в тексте (PHP) | Casufi | Вебмастеру | 3 | 11-04-2003 11:07 |
|