![]() |
Внимание, важное сообщение: Дорогие Друзья!
В ноябре далекого 2001 года мы решили создать сайт и форум, которые смогут помочь как начинающим, так и продвинутым пользователям разобраться в операционных системах. В 2004-2006г наш проект был одним из самых крупных ИТ ресурсов в рунете, на пике нас посещало более 300 000 человек в день! Наша документация по службам Windows и автоматической установке помогла огромному количеству пользователей и сисадминов. Мы с уверенностью можем сказать, что внесли большой вклад в развитие ИТ сообщества рунета. Но... время меняются, приоритеты тоже. И, к сожалению, пришло время сказать До встречи! После долгих дискуссий было принято решение закрыть наш проект. 1 августа форум переводится в режим Только чтение, а в начале сентября мы переведем рубильник в положение Выключен Огромное спасибо за эти 24 года, это было незабываемое приключение. Сказать спасибо и поделиться своей историей можно в данной теме. С уважением, ваш призрачный админ, BigMac... |
|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » VBA - Замена шифра в тексте и печать большого количества документов |
|
VBA - Замена шифра в тексте и печать большого количества документов
|
Новый участник Сообщения: 26 |
Имеется документ 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 | Цитировать Цитата AKBAMAPUH:
|
|
Отправлено: 22:18, 01-10-2012 | #11 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Новый участник Сообщения: 26
|
Профиль | Отправить PM | Цитировать Iska,
спасибо огромное за подсказку со скобками! фантастика, как просто с одной стороны, но мне и в голову не пришло, что можно использовать скобку в таком случае. P.S. вы даже не представляете, как много я уже узнал за последний месяц, решая эту задачу ![]() Dr.DG, да, я примерно понимаю о чём вы говорите... я находил на просторах инета что-то подобное, но не смог сделать, поскольку там явно были ошибки, которые мне не удалось решить. сейчас найду ещё раз и буду внимательно изучать в этом направлении. Спасибо огромное! Dr.DG, кстати, по поводу нулей в начале шифра, вот что мне удалось найти "0"&Cstr(lNumber + (i - 1)) вот как просто добавлять ноль в начале шифра и корректно отрабатывать арифметическую прогрессию с подобным шифром. |
Отправлено: 22:26, 01-10-2012 | #12 |
Новый участник Сообщения: 26
|
Профиль | Отправить PM | Цитировать Цитата Dr.DG:
завтра продолжу поиск - сейчас уже спать... |
|
Отправлено: 22:45, 01-10-2012 | #13 |
Новый участник Сообщения: 26
|
Профиль | Отправить PM | Цитировать вот нашёл дуплексная печать
безумное количество букв и абсолютно мне непонятно.... |
Отправлено: 21:18, 02-10-2012 | #14 |
Новый участник Сообщения: 26
|
Профиль | Отправить PM | Цитировать Option Explicit 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\TEMP\1.docm") 'Помещаем в закладку "bm_1" данные из переменной lNumber. oDoc.Bookmarks("bm_1").Range.Text = "0" & CStr(lNumber + (i - 1)) 'Помещаем в закладку "bm_2" данные из переменной lNumber. oDoc.Bookmarks("bm_2").Range.Text = "0" & CStr(lNumber + (i - 1)) 'Помещаем в закладку "bm_3" данные из переменной lNumber. oDoc.Bookmarks("bm_3").Range.Text = "0" & CStr(lNumber + (i - 1)) 'Помещаем в закладку "bm_4" данные из переменной lNumber. oDoc.Bookmarks("bm_4").Range.Text = "0" & CStr(lNumber + (i - 1)) 'Распечатываем. ActivePrinter = "doPDF v7" ActiveDocument.PrintOut 'Скрываем пользовательскую форму UserForm1.Hide 'закрываем активный документ без сохранения изменений, поскольку после вставки 'текста произошла замена закладки ActiveDocument.Close SaveChanges:=wdDoNotSaveChanges Next i End If End Sub Private Sub CommandButton2_Click() 'Выход из формы и закрытие окна документа при нажатии кнопки "ОТМЕНА" On Error GoTo ErrLabel 'Закрываем форму Unload Me 'Закрываем текущий документ ActiveDocument.Close ErrLabel: End Sub Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean) 'действия с полем первый номер бланка для подстановки With Me.TextBox1 If Not IsNumeric(.Text) Or Len(.Text) < 6 Then 'если в поле введены не цифры и их число меньше 6, то MsgBox "Ошибка!" & " " & "Введите 6 цифр номера задания" 'выводим сообщение Cancel = True 'возвращаемся к полю .Text = "" 'очищаем поле .SetFocus End If End With End Sub Private Sub TextBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean) 'действия с полем общее количество необходимых бланков With Me.TextBox2 If Not (TextBox2.Value = 1 Or TextBox2.Value = 2 Or TextBox2.Value = 50) Then MsgBox "Ошибка!" & " " & "Введите значение равное 1, 2 или 50" 'выводим сообщение Cancel = True 'возвращаемся к полю .Text = "" 'очищаем поле .SetFocus 'фокус на поле End If End With End Sub есть правда по-прежнему небольшие недочёты, которые вносят в некотором роде незавершённость данному проекту: 1 - двустороння печать реализована путём создания нового принтера, в свойствах печати которого выставлена принудительно двусторонняя печать и весь документ печатается исключительно через этот принтер. А хотелось бы конечно иметь более универсальный проект, чтобы не приходилось дополнительно производить какие либо манипуляции с компом и его принтерами. 2 - по-прежнему не могу понять как реализовать правильное использования закладок (bookmarks), поскольку на текущий момент времени у меня происходит не вставка текста, а полная замена закладки на текст, поэтмоу приходится с каждым витком открывать документ снова и снова. Вот нашёл казалось бы замечательную статью про закладки, но не могу понять что делать с ней и как изменить под свои условия - см. эту статью 3 - в момент открытия документа появляется UserForm1, если нажать на "крестик", то появляется вот это сообщение из кода проекта А хотелось бы, чтобы закрывалась UserForm1 и текущий открытый документ, то есть то событие, которое происходит сейчас при нажатии на CommandButton2 (см. код выше). Либо как вариант чтобы отсутствовал тот самый "крестик" на форме ![]() Помогите пожалуйста, осталось совсем немного... |
Отправлено: 22:27, 03-10-2012 | #15 |
Новый участник Сообщения: 15
|
Профиль | Отправить PM | Цитировать 2 - в статье по вашей ссылке есть подпрограмма обновления текста закладки UpdateBookmark, используйте её вместо прямого обновления. Вместо строк типа
нужно вызывать её вот так
3 - установите точку останова (F9) где-нибудь в начале программы и отлаживайте по шагам (F8). Смотрите, что выполняется и в какой последовательности.
|
Отправлено: 23:02, 04-10-2012 | #16 |
Новый участник Сообщения: 26
|
Профиль | Отправить PM | Цитировать Dr.DG,
мне бы даже в голову не пришло, что простая вставка кода в форму решит вопрос с обновлением закладок, даже менять ничего не пришлось. у меня теперь другие вопросы возникли: 1 - каким образом сделать UserForm1 незакрывающуюся? То есть чтобы на форме отсутствовал "крестик", либо чтобы на UserForm1 "крестик" был неактивным, затемнен. Хотя лучше конечно чтобы он просто-напросто отсутствовал. 2 - каким образом осуществить закрытие приложения Word? указанный ниже код не закрывает приложение... |
Последний раз редактировалось AKBAMAPUH, 07-10-2012 в 13:02. Отправлено: 12:56, 07-10-2012 | #17 |
Новый участник Сообщения: 26
|
Профиль | Отправить PM | Цитировать по поводу первого пункта нашёл замечательную вещь, но абсолютно в ней не могу разобраться, поскольку кода очень много для меня, мне столько не переварить...
мне необходим либо вариант "меню", либо вариант "крестик" (см. пример во вложении) подскажите какой код выдернуть из примера и куда его вставить, пожалуйста. |
Отправлено: 13:48, 07-10-2012 | #18 |
Новый участник Сообщения: 26
|
Профиль | Отправить PM | Цитировать по поводу пункта 2 - возникло недоразумение из-за того, что сначала выполнялась процедура закрытия текущего активного документа, а потом осуществлялась попытка закрыть приложение Word, но в этом и есть абсурдность ситуации, потому что уже некому и нечему выполнять код
![]() я думаю, что верно понял этот момент. получается, что эту ситуацию необходимо оставить как есть. хотя если есть у кого комментарии - высказывайтесь, может есть другое решение вопроса. всё ещё жду решение вопроса по пункту 1. спасибо за внимание. |
Последний раз редактировалось AKBAMAPUH, 07-10-2012 в 21:30. Отправлено: 21:25, 07-10-2012 | #19 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать AKBAMAPUH, ничто не мешает сохранить документ/документы и воспользоваться сразу «Application.Quit» без «Document.Close». Либо просто использовать потребным образом первый аргумент — «SaveChanges» — метода «Application.Quit»: Quit Method.
|
Отправлено: 23:58, 07-10-2012 | #20 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Установка большого количества .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 |
|