Имя пользователя:
Пароль:
 | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » VBA - Замена шифра в тексте и печать большого количества документов

Ответить
Настройки темы
VBA - Замена шифра в тексте и печать большого количества документов

Новый участник


Сообщения: 26
Благодарности: 0


Конфигурация

Профиль | Отправить 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
Благодарности: 5

Профиль | Отправить PM | Цитировать


Цитата AKBAMAPUH:
происходит полная замена закладки на указанное значение. И получается, что при втором витке в документе уже нет закладок»
Как вариант, перед заменой текста закладок сохранять в переменных/массивах начала и концы (Start и End) свойств Range закладок и потом создавать новые объекты Range и закладки на их основе в сохранённых местах.
Это сообщение посчитали полезным следующие участники:

Отправлено: 22:18, 01-10-2012 | #11



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 26
Благодарности: 0

Профиль | Отправить PM | Цитировать


Iska,
спасибо огромное за подсказку со скобками!
фантастика, как просто с одной стороны, но мне и в голову не пришло, что можно использовать скобку в таком случае.

P.S. вы даже не представляете, как много я уже узнал за последний месяц, решая эту задачу

Dr.DG,
да, я примерно понимаю о чём вы говорите... я находил на просторах инета что-то подобное, но не смог сделать, поскольку там явно были ошибки, которые мне не удалось решить.
сейчас найду ещё раз и буду внимательно изучать в этом направлении. Спасибо огромное!

Dr.DG,
кстати, по поводу нулей в начале шифра, вот что мне удалось найти
"0"&Cstr(lNumber + (i - 1))
вот как просто добавлять ноль в начале шифра и корректно отрабатывать арифметическую прогрессию с подобным шифром.

Отправлено: 22:26, 01-10-2012 | #12


Новый участник


Сообщения: 26
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата Dr.DG:
Как вариант, перед заменой текста закладок сохранять в переменных/массивах начала и концы (Start и End) свойств Range закладок и потом создавать новые объекты Range и закладки на их основе в сохранённых местах. »
пока найти не могу, но смысл там был вот какой - расставлялись 2 закладки (начало и конец) в нужное место и потом осуществлялось выделение текста между этими закладками и вставка необходимого текста в это выделение.
завтра продолжу поиск - сейчас уже спать...

Отправлено: 22:45, 01-10-2012 | #13


Новый участник


Сообщения: 26
Благодарности: 0

Профиль | Отправить PM | Цитировать


вот нашёл дуплексная печать
безумное количество букв и абсолютно мне непонятно....

Отправлено: 21:18, 02-10-2012 | #14


Новый участник


Сообщения: 26
Благодарности: 0

Профиль | Отправить 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, если нажать на "крестик", то появляется вот это сообщение из кода проекта
Код: Выделить весь код
MsgBox "Ошибка!" & " " & "Введите 6 цифр номера задания"
А хотелось бы, чтобы закрывалась UserForm1 и текущий открытый документ, то есть то событие, которое происходит сейчас при нажатии на CommandButton2 (см. код выше).
Либо как вариант чтобы отсутствовал тот самый "крестик" на форме


Помогите пожалуйста, осталось совсем немного...

Отправлено: 22:27, 03-10-2012 | #15


Новый участник


Сообщения: 15
Благодарности: 5

Профиль | Отправить PM | Цитировать


2 - в статье по вашей ссылке есть подпрограмма обновления текста закладки UpdateBookmark, используйте её вместо прямого обновления. Вместо строк типа
Код: Выделить весь код
oDoc.Bookmarks("bm_1").Range.Text = "0" & CStr(lNumber + (i - 1))
нужно вызывать её вот так
Код: Выделить весь код
UpdateBookmark "bm_1", "0" & CStr(lNumber + (i - 1))
3 - установите точку останова (F9) где-нибудь в начале программы и отлаживайте по шагам (F8). Смотрите, что выполняется и в какой последовательности.
Это сообщение посчитали полезным следующие участники:

Отправлено: 23:02, 04-10-2012 | #16


Новый участник


Сообщения: 26
Благодарности: 0

Профиль | Отправить PM | Цитировать


Dr.DG,
мне бы даже в голову не пришло, что простая вставка кода в форму решит вопрос с обновлением закладок, даже менять ничего не пришлось.

у меня теперь другие вопросы возникли:

1 - каким образом сделать UserForm1 незакрывающуюся? То есть чтобы на форме отсутствовал "крестик", либо чтобы на UserForm1 "крестик" был неактивным, затемнен. Хотя лучше конечно чтобы он просто-напросто отсутствовал.

2 - каким образом осуществить закрытие приложения Word?
указанный ниже код не закрывает приложение...
Код: Выделить весь код
Word.Application.Quit

Последний раз редактировалось AKBAMAPUH, 07-10-2012 в 13:02.


Отправлено: 12:56, 07-10-2012 | #17


Новый участник


Сообщения: 26
Благодарности: 0

Профиль | Отправить PM | Цитировать


Вложения
Тип файла: xls Forma.xls
(80.5 Kb, 4 просмотров)

по поводу первого пункта нашёл замечательную вещь, но абсолютно в ней не могу разобраться, поскольку кода очень много для меня, мне столько не переварить...
мне необходим либо вариант "меню", либо вариант "крестик" (см. пример во вложении)
подскажите какой код выдернуть из примера и куда его вставить, пожалуйста.

Отправлено: 13:48, 07-10-2012 | #18


Новый участник


Сообщения: 26
Благодарности: 0

Профиль | Отправить PM | Цитировать


по поводу пункта 2 - возникло недоразумение из-за того, что сначала выполнялась процедура закрытия текущего активного документа, а потом осуществлялась попытка закрыть приложение Word, но в этом и есть абсурдность ситуации, потому что уже некому и нечему выполнять код
я думаю, что верно понял этот момент. получается, что эту ситуацию необходимо оставить как есть.
хотя если есть у кого комментарии - высказывайтесь, может есть другое решение вопроса.

всё ещё жду решение вопроса по пункту 1.
спасибо за внимание.

Последний раз редактировалось AKBAMAPUH, 07-10-2012 в 21:30.


Отправлено: 21:25, 07-10-2012 | #19


Ветеран


Сообщения: 27449
Благодарности: 8088

Профиль | Отправить PM | Цитировать


AKBAMAPUH, ничто не мешает сохранить документ/документы и воспользоваться сразу «Application.Quit» без «Document.Close». Либо просто использовать потребным образом первый аргумент — «SaveChanges» — метода «Application.Quit»: Quit Method.
Это сообщение посчитали полезным следующие участники:

Отправлено: 23:58, 07-10-2012 | #20



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » VBA - Замена шифра в тексте и печать большого количества документов

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Установка большого количества .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




 
Переход