Редактирование документов Word из кода VBA Excel. Добавление и форматирование текста. Объект Word.Range, свойство Text, методы InsertAfter и InsertBefore.
Работа с Word из кода VBA Excel
Часть 3. Редактирование документов Word
[Часть 1] [Часть 2] [Часть 3] [Часть 4] [Часть 5] [Часть 6]
Добавление текста в новый документ
Основные объекты, использующиеся в VBA Word для определения места вставки, добавления и форматирования текста – это Selection (выделение), Range (диапазон) и Bookmark (закладка).
Selection и Range позволяют заполнять текстом новые документы или редактировать существующие. Закладки можно использовать для вставки изменяемых реквизитов в шаблоны различных документов: договоры, акты, справки.
Объект Range имеет преимущество перед объектом Selection, так как он может быть создан только программно и не зависит от действий пользователя. Если для вставки и форматирования текста будет использоваться объект Selection, а пользователь во время работы программы просто поставит курсор в другое место документа, результат будет непредсказуем.
Word.Range кардинально отличается от объекта Range в Excel. В приложении Word он представляет из себя набор из одного или множества символов. А также он может вообще не содержать ни одного символа, а быть указателем ввода текста (виртуальным курсором).
Объект Range возвращается свойством Range других объектов приложения Word: Document, Selection, Bookmark, Paragraph, Cell (объект Table).
Вставка текста без форматирования
Если текст вставляется без форматирования, достаточно одной строки кода (myDocument – это переменная):
- Вставка текста с заменой имеющегося:
myDocument.Range.Text = "Вставляемый текст"
- Добавление текста после имеющегося:
myDocument.Range.InsertAfter "Добавляемый текст"
- Добавление текста перед имеющимся:
myDocument.Range.InsertBefore "Добавляемый текст"
Методами InsertAfter и InsertBefore можно вставить текст и на пустую страницу, также, как с помощью свойства Text. Перейти на новый абзац и начать предложение с красной строки можно с помощью ключевых слов vbCr (vbNewLine, vbCrLf) и vbTab.
Вставка текста с форматированием
Для форматирования отдельных участков текста необходимо указать диапазон символов, входящих в этот участок. Здесь нам также поможет объект Range, которому можно задать любой набор символов, содержащихся в документе Word.
Синтаксис присвоения диапазона символов объекту Range:
myDocument.Range(Start:=n, End:=m) ‘или без ключевых слов Start и End myDocument.Range(n, m) |
- myDocument – переменная;
- n – номер точки перед начальным символом;
- m – номер точки после конечного символа.
Счет точек вставки начинается с нуля. Знаки переноса строки, возврата каретки и табуляции учитываются как отдельные символы. 0 – это для объекта Word.Range виртуальная точка вставки на пустом документе, 1 – точка между первым и вторым символом, 2 – точка между вторым и третьим символом и т.д.
На пустом документе объекту Range можно присвоить только виртуальную точку вставки:
myDocument.Range(Start:=0, End:=0)
Первый символ в документе с текстом:
myDocument.Range(Start:=0, End:=1)
Диапазон с 11 по 20 символ:
myDocument.Range(Start:=10, End:=20)
Реальная точка вставки (курсор) принадлежит объекту Selection, который создается вручную или программно с помощью метода Select.
Вставка курсора в начало документа:
myDocument.Range(Start:=0, End:=0).Select
Эта строка вставит курсор между пятым и шестым символами:
myDocument.Range(Start:=5, End:=5).Select
Вставка курсора в конец документа:
myDocument.Range(.Range.Characters.Count - 1, .Range.Characters.Count - 1).Select
Ссылку на объект Range можно присвоить переменной, но при форматировании ее придется каждый раз переопределять и код получится длиннее. Пример присвоения ссылки объектной переменной:
Dim myRange As Word.Range Set myRange = myDocument.Range(Start:=0, End:=20) |
Для Range(Start:=0, End:=20)
в документе должно быть как минимум 20 символов.
Однострочные примеры редактирования и форматирования текста
Вставка дополнительного текста внутри имеющегося после заданной точки:
myDocument.Range(Start:=10, End:=10).InsertAfter "Вставляемый текст"
Новый абзац с красной строки (предыдущая строка должна заканчиваться символом возврата каретки или переноса строки):
myDocument.Range.InsertAfter vbTab & "Красная строка"
Присвоение шрифту заданного диапазона зеленого цвета:
myDocument.Range(Start:=10, End:=65).Font.ColorIndex = wdGreen
Меняем обычное начертание на курсив:
myDocument.Range(Start:=10, End:=65).Font.Italic = True
Указываем размер шрифта:
myDocument.Range(Start:=10, End:=65).Font.Size = 22
Применение стандартных стилей:
myDocument.Range(Start:=0, End:=16).Style = "Заголовок 1"
Если вас заинтересуют другие команды форматирования текста, запишите их макрорекордером в VBA Word и примените к объекту Range.
Пример 1
Добавление текста в новый документ без форматирования:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
Sub Primer1() On Error GoTo Instr Dim myWord As New Word.Application, _ myDocument As Word.Document Set myDocument = myWord.Documents.Add myWord.Visible = True With myDocument .Range.Text = «Заголовок по центру» & vbCr .Range(Start:=0, End:=19).ParagraphFormat.Alignment _ = wdAlignParagraphCenter .Range.InsertAfter _ vbTab & «Первый абзац с красной строки» & vbCr & _ «Второй абзац не с красной строки» & vbCr & _ vbTab & «Третий абзац с красной строки» End With Set myDocument = Nothing Set myWord = Nothing Exit Sub Instr: If Err.Description <> «» Then MsgBox «Произошла ошибка: « & Err.Description End If If Not myWord Is Nothing Then myWord.Quit Set myDocument = Nothing Set myWord = Nothing End If End Sub |
Пример 2
Добавление текста в новый документ с форматированием:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
Sub Primer2() On Error GoTo Instr Dim myWord As New Word.Application, _ myDocument As Word.Document Set myDocument = myWord.Documents.Add myWord.Visible = True With myDocument .Range.Text = «Заголовок по центру» & vbCr .Range(Start:=0, End:=19).Style = «Заголовок» .Range(Start:=0, End:=19).ParagraphFormat.Alignment _ = wdAlignParagraphCenter .Range.InsertAfter «Заголовок 1 не по центру» & vbCr .Range(Start:=20, End:=44).Style = «Заголовок 1» .Range.InsertAfter vbTab & «Шрифт по умолчанию « _ & «с красной строки» & vbCr .Range.InsertAfter «Зеленый курсив, размер 20» .Range(Start:=82, End:=107).Font.Italic = True .Range(Start:=82, End:=107).Font.Size = 20 .Range(Start:=82, End:=107).Font.ColorIndex = wdGreen End With Set myDocument = Nothing Set myWord = Nothing Exit Sub Instr: If Err.Description <> «» Then MsgBox «Произошла ошибка: « & Err.Description End If If Not myWord Is Nothing Then myWord.Quit Set myDocument = Nothing Set myWord = Nothing End If End Sub |
Вы можете запустить эти примеры в редакторе VBA Excel на своем компьютере и посмотреть результаты.
Let’s say your word document looks like this
Since I am not sure whether you are doing this from Word-VBA
or from some other application like say Excel-VBA
so I am including both methods.
Now if you are doing this from Word-VBA
then you do not need to LateBind with it. Use this simple code.
Option Explicit
Sub Sample()
Dim oDoc As Document
Dim MyAr() As String, strToFind As String
Dim i As Long
'~~> This holds your search words
strToFind = "deal,contract, sign, award"
'~~> Create an array of text to be found
MyAr = Split(strToFind, ",")
'~~> Open the relevant word document
Set oDoc = Documents.Open("C:Sample.docx")
'~~> Loop through the array to get the seacrh text
For i = LBound(MyAr) To UBound(MyAr)
With Selection.Find
.ClearFormatting
.Text = MyAr(i)
.Replacement.Text = ""
.Forward = True
.Wrap = wdFindContinue
.Execute
'~~> Change the attributes
Do Until .Found = False
With Selection.Font
.Name = "Times New Roman"
.Size = 20
.Bold = True
.Color = RGB(200, 200, 0)
End With
Selection.Find.Execute
Loop
End With
Next i
End Sub
However if you are doing from say Excel-VBA
then use this
Const wdFindContinue = 1
Sub FnFindAndFormat()
Dim objWord As Object, objDoc As Object, Rng As Object
Dim MyAr() As String, strToFind As String
Dim i As Long
'~~> This holds your search words
strToFind = "deal,contract, sign, award"
'~~> Create an array of text to be found
MyAr = Split(strToFind, ",")
Set objWord = CreateObject("Word.Application")
'~~> Open the relevant word document
Set objDoc = objWord.Documents.Open("C:Sample.docx")
objWord.Visible = True
Set Rng = objWord.Selection
'~~> Loop through the array to get the seacrh text
For i = LBound(MyAr) To UBound(MyAr)
With Rng.Find
.ClearFormatting
.Text = MyAr(i)
.Replacement.Text = ""
.Forward = True
.Wrap = wdFindContinue
.Execute
Set Rng = objWord.Selection
'~~> Change the attributes
Do Until .Found = False
With Rng.Font
.Name = "Times New Roman"
.Size = 20
.Bold = True
.Color = RGB(200, 200, 0)
End With
Rng.Find.Execute
Loop
End With
Next i
End Sub
OUTPUT
Use this simple Visual Basic for Applications (VBA) script to reformat any text string within Microsoft Word.
I work in science and often have to review documents with references in them. It’s not uncommon for citations to contain the text “et al.” which most journals insist should be italicised. Rather than manually check all of these, a VBA script can be employed to automate the process.
Using the following procedure, we’ll open a Microsoft Word document and scan it for instances of “et al”. The script will then italicise every instance that it finds.
Instructions
Step 1
Open the Microsoft Word document that needs to be edited.
Step 2
Press Alt + F11 or otherwise go to the Developer ribbon and choose the “Visual Basic” icon if the Developer Tab is enabled.
Step 3
In the Visual Basic for Applications toolbar, go to Insert > Module
Inserting a module in Visual Basic for Applications.
Step 4
Insert the following code into the module:
Sub ItaliciseText()
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
'Italicises the selected text
Selection.Find.Replacement.Font.Italic = True
With Selection.Find
'Insert the text string that needs to be italicised
.Text = "et al"
.Forward = True
.Wrap = wdFindContinue
.MatchCase = True
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
Selection.Find.Execute Replace:=wdReplaceAll
End Sub
Step 5
Customise the script by deleting the sample text (.Text = "et al"
) and replacing it with the text string that you want italicised.
Step 6
Press the play button at the top of the window (the green triangle) to run the script. The entire document will be updated.
Other customisations
This script can be customised by changing the instructions:
- To italicise:
Selection.Find.Replacement.Font.Italic = True
- To bold:
Selection.Find.Replacement.Font.Bold = True
- To underline:
Selection.Find.Replacement.Font.Underline = True
- To superscript:
Selection.Find.Replacement.Font.Superscript = True
- To subscript:
Selection.Find.Replacement.Font.Subscript = True
- To strikethrough:
Selection.Find.Replacement.Font.Strikethrough = True
- To double strikethrough:
Selection.Find.Replacement.Font.DoubleStrikethrough = True
- To shadow:
Selection.Find.Replacement.Font.Shadow = True
- To all caps:
Selection.Find.Replacement.Font.AllCaps = True
- To small caps:
Selection.Find.Replacement.Font.SmallCaps = True
- To hide:
Selection.Find.Replacement.Font.Hidden = True
Likewise, to remove a format the parameter can be switched to “false”. For instance, this will remove the bold format from the text string:
Selection.Find.Replacement.Font.Bold = False
Finally, multiple formats can be stacked in the script. For instance, to italicise and underline some text, the following code will work:
Selection.Find.Replacement.Font.Italic = True
Selection.Find.Replacement.Font.Underline = True
Have Your Say
Макрос для форматирование Word документа (VBA)
Макрос — это набор команд и инструкций, группируемых вместе в виде единой команды для автоматического выполнения задачи. Вы можете записать последовательность действий или создать макрос с нуля, введя код на языке Visual Basic для приложений в редактор Visual Basic.
Постановка задачи: Создать макрос, который будет форматировать текст в соответствии к стандартам Единой конструкторской документации: 14 шрифт Times New Roman, полуторный междустрочный интервал, выравнивание по ширине листа, поля со всех сторон по 2 см.
Чтобы создать и использовать макрос нам нужно настроить наш Word. Для этого нажмем Файл=>Параметры=>Настройка ленты и поставим галочку напротив надписи «Разработчик». Теперь мы можем использовать макросы.
Для создания собственного макроса нужно перейти на вкладку Разработчик и нажать «Макросы», ввести название нашего будущего макроса и нажать «Создать». Откроется окно Microsoft Visual Basic for Applicatios(дальше VBA) в котором можно наполнить макрос кодом.
Sub Marcos()
'
' Marcos Макрос
'
'
End Sub
Теперь перейдем к самому коду. Сначала выделим весь документ, для того чтобы редактировать его.
Sub Marco()
'Выделяем ведь документ
Selection.WholeStory
Изменяем стиль на «Без интервала», чтобы избавиться от междустрочных интервалов.
'Стиль "Без интервала"
Selection.Style = ActiveDocument.Styles("Без интервала")
Приступаем к функциям форматирования текста. Выравниваем данный нам текст по ширине листа
'Выравнивание по ширине
ActiveDocument.Range.ParagraphFormat.Alignment = wdAlignParagraphJustify
Редактируем шрифт и его размер.
'Изменение шрифта
ActiveDocument.Range.Font.Name = "Times New Roman"
'Изменение размера шрифта
Selection.Font.Size = "14"
Так как междустрочный интервал мы убрали, то теперь можем изменить его на полуторный.
'Изменение междустрочного интервала
ActiveDocument.Range.ParagraphFormat.LineSpacingRule = WdLineSpacing.wdLineSpace1pt5
Для полного выполнения задачи нам не хватает только полей. Делаем поля с каждой стороны по 2 см.
'Изменение полей
'Поле слева
ActiveDocument.Range.PageSetup.LeftMargin = Application.InchesToPoints(0.786)
'Поле справа
ActiveDocument.Range.PageSetup.RightMargin = Application.InchesToPoints(0.786)
'Поле сверху
ActiveDocument.Range.PageSetup.TopMargin = Application.InchesToPoints(0.786)
'Поле снизу
ActiveDocument.Range.PageSetup.BottomMargin = Application.InchesToPoints(0.786)
Завершая помещаем курсор в конец документа, чтобы снять выделение и выводим сообщение, что документ отредактирован.
'Курсор в конец документа
Selection.MoveDown Unit:=wdLine, Count:=1
'отчёт
MsgBox "Документ отредактирован"
End Sub
Наш макрос готов. Чтобы его запустить надо закрыть окно VBA и перейти Разработчик=>Макросы выбрать наш макрос и нажать «Выполнить». Если окно VBA не открылось, не указало вам на ошибку и сообщение об успешном форматировании текста вывелось на экран — значит макрос успешно создан. Теперь сохраните его. Для этого нажмите Файл=>Сохранит как, выберите «Документ Word с поддержкой макросов(*.docm)» и укажите директорию в которую хотите его сохранить.
Автор: Beznoschenko
Похожие публикации
2016-05-26 • Просмотров [ 12290 ]
Наиболее
важной особенностью работы на VBA в Word
является вставка текста в документ при
работе с приложениями. Для этого служат
объекты Range и Selection, которые являются
главными для практически любых операций,
которые можно выполнять с помощью Word
VBA. Некоторые из этих действий можно
применять к документам в целом, но в
общем случае вам необходим диапазон
или выделенная область, прежде чем
вносить изменения. Мы, однако, рассмотрим
действия с документом при его создании.
Открытый
документ Word уже содержит объекты Range,
соответствующие многим его элементам.
Каждый абзац, таблица, ячейка таблицы,
комментарий и т. д. определяют
диапазоны. Например, для того чтобы
вставить некоторый текст в уже существующий
документ, необходимо прописать код:
ActiveDocument.Paragraphs(1).Range.Text
= «Oxo-xo!!»
Причем
данная строка будет расположена в конце
существующего параграфа. С другой
стороны, используя объект Selection, можно
также вставить некоторый текст в
документ, используя метод Add и присвоение
свойства Text объекту Selection:
If
Documents.Count
= 0 TheNDocuments.Add
Selection.Text
= «Изучение работы с текстом в документе
Word является важной составной частью
умения программировать в VBA, « +
TextBox1.Text +», и отвечает запросам всех
программистов!»
В
результате выполнения данного программного
кода в документе Word будет выведена
строка:
Изучение
работы с текстом в документе Word является
важной составной частью умения
программировать в VBA, Светлана, и отвечает
запросам всех программистов!
Здесь
имя Светлана, например, считано с
текстового поля некоторой формы, имеющей
всего одно поле ввода для имени и кнопку
«Вывод текста» (рис. 64).
Рис.
64. Форма
ввода данных
При
работе с текстом на рабочем листе Word
необходимо знать следующие коды:
определение
цвета
Selection.Font.Color
=
wdColorRed
– красный
wdColorDarkRed
– бордовый
wdColorDarkTeal
– бирюзовый
wdColorBlue
– синий
wdColorGreeN–
зеленый
wdColorBlack
– черный
wdColorOrange
– оранжевый
определение
жирности
Selection.Font.Bold
=
wdToggle
– жирность
определение
начертания
Selection.Font.Italic=
wdToggle
– курсив
определение
выравнивания
Selection.ParagraphFormat.Alignment=
wdAlignParagraphRight
– выравнивание по правому краю
wdAlignParagraphCenter
– выравнивание по центру
wdAlignParagraphJustify
– выравнивание по левому краю
вставка
в текст конкретного предложения
Selection.TypeText
Text:=»Пример работы с текстом»
вставка
новой пустой строки
Selection.TypeParagraph
установка
размера букв
Selection.Font.Size
= 14
Примечание.
Для
правильного оформления кода пользуйтесь
возможностями создания макроса написания
программы.
Одним
из элементов оформления диалоговых
окон является элемент управления Image
(рисунок).
Его основные свойства:
Autosize
– изменяет размер рисунка на форме
(автоматически или нет);
Picture
– отображает графический файл, выводимый
на форму;
pictureSizeMode
– устанавливает масштабирование рисунка
(не весь рисунок, вся поверхность объекта,
целиком внутри объекта);
PictureAligment
– устанавливает расположение рисунка
внутри объекта (слева, справа, вверху,
внизу);
pictureTilling
– покрывает объект мозаикой из рисунка.
Данные
свойства либо устанавливаются в окне
свойств объекта, либо прописываются в
листинге.
Пример
30. Создать
программу, которая будет производить
подсчет количества теплоты, выделяемой
в проводнике при протекании в нем тока.
Формула для расчета количества теплоты
известна под именем закона Джоуля –
Ленца:
где
Q
–
количество теплоты в Джоулях;
U
–
напряжение в вольтах;
t
–
время в секундах;
S
–
площадь поперечного сечения проводника
в квадратных миллиметрах;
l
– длина проводника в метрах;
р
–
удельное сопротивление материала
проводника в Ом × мм2/м.
Все
исходные данные вводятся в текстовые
поля формы. По итогам вычисления результат
в виде объяснительной записки выводится
в документ, а численный результат – в
специальное окно формы.
Технология
выполнения
Создайте
форму по приведенному рис. 65.
Рис.
65. Разработанная
форма примера 30 в рабочем состоянии и
вывод результирующих сведений в документ
word
При
создании формы установите необходимые
свойства элементов. Установите свойство
Locked элемента TextBox6 как True, чтобы не
допустить случайного ввода пользователем
в него текста.
Описание
процедур
Private
Sub CommandButton1_Click()
If
Documents.Count = 0 TheNDocuments.Add
Selection.Text
= «При
прохождении
тока
напряжением
в
» + TextBox1.Text + «вольт
по
проводнику
длиной
» + TextBox4.Text + » метров,
сечением
» + TextBox3.Text + «кв.
мм
и
удельным
сопротивлением
» + TextBox5.Text + » Ом*мм2/м
за
» + TextBox2.Text + » секунд
выделится
» + TextBox6.Text + « джоулей
теплоты»
Selection.Collapse
direction:=wdCollapseEnd
End
Sub
Private
Sub CommandButton2_Click()
Unload
Me
End
Sub
Private
Sub TextBox1_Change()
scet
End
Sub
Private
Sub TextBox2_Change()
scet
End
Sub
Private
Sub TextBox3_Change()
scet
End
Sub
Private
Sub TextBox4_Change()
scet
End
Sub
Private
Sub TextBox5_Change()
scet
End
Sub
Private
Sub scet()
If
IsNumeric(TextBox1.Text) = True And
IsNumeric(TextBox2.Text)
= True And
IsNumeric(TextBox3.Text)
= True And
IsNumeric(TextBox4.Text)
= True And
IsNumeric(TextBox5.Text)
= True AndNot Val(TextBox4.Text)
=
0 AndNot Val(TextBox5.Text) = 0 Then
rez
= ((Val(TextBox1.Text) ^ 2) * Val(TextBox2.Text) *
Val(TextBox3.Text))
/ (Val(TextBox4.Text) *
Val(TextBox5.Text))
TextBox6.Text
= Str$(rez)
CommandButton1.Enabled
= True
Else
TextBox6.Text
= «»
CommandButton1.Enabled
= False
End
If
End
Sub
Примечание.
При
работе данного приложения все значения
полей ввода должны быть числовыми. В
VBA есть специальная функция для проверки
того, является или нет введенная строка
записью числа – IsNumeric. Для проверки
отличия от нуля значений в последних
двух полях ввода используется функция
Val, которая переводит строковое выражение
в числовое, если это строковое выражение
содержит в своем начале цифры (или все
состоит из них).
Функция
Str делает преобразование, обратное тому,
что производит Val, – конвертирует
числовое значение выражения в строковое,
что позволяет этому значению в дальнейшем
обрабатываться как строке.
Таким
образом, функции Val и Str преобразуют типы
данных обрабатываемых ими переменных,
соответственно, из строкового в числовой
и из числового в строковый (см. главу
3).
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #