Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум 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 | Цитировать


IMHO, вы слишком усложняете. По сути, вам нужно выполнить цикл c глобальной заменой (как в первом примере) или перебором закладок с последующей печатью документа. Двухстороннюю печать на время выполнения кода проще задать в свойствах принтера по умолчанию, чтобы не связываться с WinAPI.
Это сообщение посчитали полезным следующие участники:

Отправлено: 23:45, 24-09-2012 | #2



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

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


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


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

Профиль | Отправить 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
Здесь представлен работающий код, теперь уже с пользовательской формой (в которой TextBox1 и TextBox2 для ввода значений, CheckBox1 для принятия условия, а также кнопка CommandButton1, которая является основной).

По-прежнему есть некоторые моменты, которые хотелось бы улучшить:

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
Благодарности: 0

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


по пункту 2 родилась вот какая идея

Код: Выделить весь код
    'закрываем активный документ без сохранения изменений, поскольку после вставки
    'текста произошла замена закладки
    ActiveDocument.Close SaveChanges:=wdDoNotSaveChanges
правильно сделал или есть более правильный вариант решения вопроса?

Отправлено: 20:48, 29-09-2012 | #4


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


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

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


и ещё появились следующие вопросы (сохранена сквозная нумерация проблем):
4 - текст, вводимый в TextBox1, должен проверяться на следующие условия - это должно быть число, число должно состоять из 5 цифр, и не должно начинаться на ноль.
5 - текст, вводимый в TextBox2, должен проверяться на следующие условия - это должно быть число равное "1", "2" или "50".

Отправлено: 22:31, 29-09-2012 | #5


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


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

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


1 - непонятно.
2 - новые вкладки (новые документы) создаются из-за этой строчки:
Код: Выделить весь код
Set oDoc = Application.Documents.Add("C:\Primer\BLANK.docm")
Нужно так
Код: Выделить весь код
Set oDoc = ActiveDocument
, но, так как вы работаете только с активным документом, IMHO, переменная oDoc вообще не нужна, обращайтесь напрямую к ActiveDocument.
3 - повторяю, задаёте двухстороннюю печать в свойствах принтера в Панели управления. ManualDuplexPrint:=True - это ручной дуплекс средствами Word.
4 - Проверка на число
Код: Выделить весь код
If IsNumeric(TextBox1.Value) Then
Else
End If
Проверка на количество цифр
Код: Выделить весь код
If Len(TextBox1.Text) = 5 Then
Else
End If
Проверка на 0 в первой цифре
Код: Выделить весь код
If Left(TextBox1.Text, 1) = "0" Then
Else
End If
5 -
Код: Выделить весь код
If TextBox2.Value = 1 _
    Or TextBox2.Value = 2 _
    Or TextBox2.Value = 50 _
Then
Else
End If
Это сообщение посчитали полезным следующие участники:

Отправлено: 14:24, 01-10-2012 | #6


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


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

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


спасибо огромное за подсказки, сейчас всё переварю, отрихтую и проверю

Отправлено: 19:08, 01-10-2012 | #7


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


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

Профиль | Отправить 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)
при таком раскладе выяснилось, что я похоже неправильно использую закладки (Bookmarks), то есть у меня происходит не подстановка значения на место закладки, а происходит полная замена закладки на указанное значение. И получается, что при втором витке в документе уже нет закладок, так как на их месте теперь просто указанные значения, соответсвенно цикл заканчивается на первом витке.

как правильно использовать подстановку на место закладки?

Отправлено: 19:28, 01-10-2012 | #8


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


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

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


и еще вопрос у меня напрашивается например по пункту 5:

я не понимаю что мне писать в коде после слова Then
Код: Выделить весь код
If TextBox2.Value = 1 _
    Or TextBox2.Value = 2 _
    Or TextBox2.Value = 50 _
Then
Else
End If
после слова Else я напишу чтобы появлялось MsgBox "Ошибка!" & " " & "Введите значение равное 1, 2 или 50"
а вот что после слова Then? что-то я не догоняю... мне бы наоборот сделать, чтобы если НЕ РАВНО, то сообщение, вот как-то так...

если пишу If Not , то проверяется только первое значение на 1, а дальше проверка не идёт...

Отправлено: 20:02, 01-10-2012 | #9


Ветеран


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

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


Код: Выделить весь код
If Not (TextBox2.Value = 1 Or TextBox2.Value = 2 Or TextBox2.Value = 50) Then
    …
Else
    …
End If
Оно же:
Код: Выделить весь код
If TextBox2.Value <> 1 Or TextBox2.Value <> 2 Or TextBox2.Value <> 50 Then
    …
Else
    …
End If
Это сообщение посчитали полезным следующие участники:

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



Компьютерный форум 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




 
Переход