Vba word копирование текста
Методы класса Word.Selection – выделение текста в Word
Я приведу по два примера программного кода на языках JScript, VBScript и VBA. Хотя по сути, код под макрос (VBA) и сценарий VBScript особо не отличается. Для тех, кто забыл: для создания макроса в документе Microsoft Office нужно вызвать редактор Visual Basic for Application (комбинация клавиш Alt + F11), далее, добавить в проект новый модуль (макрос).
Методы с префиксом Clear… позволяют очистить выделенный материал от форматирования (абзацы, стили, символы и так далее):
ClearCharacterAllFormatting () - Все форматирование.
ClearCharacterDirectFormatting () - Форматирование знаков.
ClearCharacterStyle () - Форматирование знаков, применяемых через стили.
ClearFormatting () – Все форматирования (параграфы, стили и так далее).
ClearParagraphAllFormatting () - Форматирование абзаца.
ClearParagraphDirectFormatting () - Форматирование абзацев, применяемых вручную.
ClearParagraphStyle () - Форматирование абзацев, применяемых через стили.
Collapse (Direction) – Позволяет убрать выделение текста Word и переместить указатель в начало или конец. VBA Selection. Если параметры отсутствуют, то просто убирается выделение. Параметр Direction содержит значение константы WdCollapseDirection :
- wdCollapseEnd - 0 – Указатель вконец
- wdCollapseStart - 1 – Указатель вначале
ConvertToTable (Separator, NumRows, NumColumns, InitialColumnWidth, Format, ApplyBorders, ApplyShading, ApplyFont, ApplyColor, ApplyHeadingRows, ApplyLastRow, ApplyFirstColumn, ApplyLastColumn, AutoFit, AutoFitBehavior, DefaultTableBehavior) – Довольно мощный метод, который позволяет преобразовать выделенный Word текст в таблицу.
Separator - Символ-разделитель, может быть знаком или значением константы WdTableFieldSeparator:
- wdSeparateByParagraphs - 0 - абзаца.
- wdSeparateByTabs - 1 - табуляции.
- wdSeparateByCommas - 2 - запятая.
- wdSeparateByDefaultListSeparator - 3 - разделитель списка по умолчанию.
NumRows - Количество строк.
NumColumns - Количество столбиков.
InitialColumnWidth - Начальная ширина каждого столбца, в пунктах.
Format – Определяет формат таблицы и содержит значение константы WdTableFormat.
ApplyBorders - TRUE - применять границы.
ApplyShading - TRUE - применить затенение.
ApplyFont - TRUE применять свойства шрифтов.
ApplyColor - TRUE применять цветовые свойства.
ApplyHeadingRows - TRUE - применить свойства заголовок-строка.
ApplyLastRow - TRUE - применить свойства последней строке.
ApplyFirstColumn - TRUE - применить свойства первого столбцов.
ApplyLastColumn - TRUE - применить свойства последнего столбца.
AutoFit - TRUE - уменьшить ширину столбцов таблицы как можно больше.
AutoFitBehavior - Устанавливает правила авто-подбора (если DefaultTableBehavior содержит значение wdWord8TableBehavior, то этот аргумент игнорируется, VBA Selection), содержит значения константы WdAutoFitBehavior:
- wdAutoFitContent - 1 - автоматически размер
- wdAutoFitFixed - 0 - фиксированный размер
- wdAutoFitWindow - 2 - автоматический размер по ширине активного окна
DefaultTableBehavior - Значение, указывающее, следует ли автоматически изменять размер ячеек таблицы по содержимому. Selection VBA. Содержит значение константы WdDefaultTableBehavior:
- wdWord8TableBehavior - 0 - отключает Авто-подбор (по умолчанию)
- wdWord9TableBehavior - 1 - включить Авто-подбор
Хорошо, с теоретической частью мы закончили, теперь можно приступить к программированию.
Примера на языке VBScript – выделение текста в редакторе Word
' ---------------------------------------------------------------------------- ' Объект Selection - выделение текста в Word ' Преобразование в таблицу - язык VBScript ' VBA_Selection_Table.vbs ' ---------------------------------------------------------------------------- Option Explicit dim oWord, oDoc, oSel, i Set oWord = CreateObject("Word.Application") Set oDoc = oWord.Documents oDoc.Add() Set oSel = oWord.Selection oWord.Visible = True For i = 0 To 10 With oSel .InsertBreak 6 .InsertBefore "один, два, три, четыре, пять, шесть, selection word vba" .EndOf .InsertBreak 6 End With Next oWord.Documents(1).Select() oSel.ConvertToTable ",", 31. 18
В данном примере в цикле For (смотрите статью "Урок 6 по VBScript: Циклы for…next и for each…next"), который выполняется шесть раз, происходит вставка перевода на новую строку, вставка текстовой фразы и перемещаем курсов к конец строки. С помощью оператора with мы можем экономить размер программного кода – не нужно лишний раз писать имя класса. Вконце происходит выделение текста Word и преобразование его в таблицу.
Примера на языке JScript – выделение текста в редакторе Word
// ---------------------------------------------------------------------------- // Объект Selection - выделение текста в Word // Преобразование в таблицу - язык JScript // VBA_Selection_Table.js // ---------------------------------------------------------------------------- var oWord1, oDoc1, oSel1, i; oWord1 = WScript.CreateObject("Word.Application"); oDoc1 = oWord1.Documents; oDoc1.Add(); oSel1 = oWord1.Selection; oWord1.Visible = true; for (i=0; i <=10;i++)< with(oSel1)< InsertBreak(6); InsertBefore("один, два, три, четыре, пять, шесть, selection word vba"); EndOf(); InsertBreak(6); >> oWord1.Documents(1).Select(); oSel1.ConvertToTable(",", 31,"","",18);
Логика работы данного программного кода аналогичны предыдущему примеру, тут мы уже использовали цикл for языка JS, читайте в статье "Урок 9 по JScript - оператор цикла for". Тут тоже использовался оператор with, обратите внимание, что имена переменных изменились, а в конце каждой строки кода прописана точка с запятой.
Примера на языке Visual Basic for Application – выделение текста в редакторе Word
'VBA Dim oWord2 As Object, oDoc2 As Object, oSel2 As Object, i Set oWord2 = CreateObject("Word.Application") Set oDoc2 = oWord2.Documents oDoc2.Add Set oSel2 = oWord2.Selection oWord2.Visible = True For i = 0 To 10 With oSel2 .InsertBreak 6: .InsertBefore "один, два, три, четыре, пять, шесть, selection word vba" .EndOf: .InsertBreak 6 End With Next oWord2.Documents(1).Select oSel2.ConvertToTable Separator:=",", NumRows:=31, Format:=18
Хорошо, давайте продолжим рассматривать методы класса Selection.
EndOf () – Перемещает курсор в конец выделения.
StartOf () – Перемещает курсор в начало выделения.
SetRange (start, end) – Позволяет задать начальное и конечное значение для выделения текста Word.
TypeText () – Выполняет ту же функцию, что и свойство Text – ввод информации.
TypeParagraph () - Метод вставляет параграф.
Copy (), Cut (), Paste (), Delete () – Копирует, вырезает, вставляет и удаляет выделенный текст в Word.
CopyAsPicture () – Копирует выбранный материал как изображение.
И так, теперь рассмотрим программный код с данными методами.
' ---------------------------------------------------------------------------- ' Класс Selection - выделение текста в Word ' Копирование и вставка - язык VBScript ' VBA_Selection_Copy_Paste.vbs ' ---------------------------------------------------------------------------- Option Explicit dim oWord3, oDoc3, oSel3, i Set oWord3 = CreateObject("Word.Application") Set oDoc3 = oWord3.Documents oDoc3.Add() Set oSel3 = oWord3.Selection oWord3.Visible = True ' Вводим информацию в документ сто раз For i=0 to 100 oSel3.TypeText "Пример ввода данных - selection word vba. " Next With oSel3 ' Выделяем, копируем и вставляем .SetRange 100, 300 .Copy .MoveDown .Paste ' Выбираем материал и копируем ее как изображение .SetRange 100, 300 .CopyAsPicture End With
По сути, данный программный код практически аналогичен предыдущим. Тут в цикле происходит вставка данных несколько раз, а далее следуют операции выделения текста в документе Word, его копирование и вставка.
Ну и в заключение, привожу программный код для макроса:
' VBA Dim oWord6 As Object, oDoc6 As Object, oSel6 As Object, i Set oWord6 = CreateObject("Word.Application") Set oDoc6 = oWord6.Documents oDoc6.Add Set oSel6 = oWord6.Selection oWord6.Visible = True For i = 0 To 100 oSel6.TypeText "Пример ввода информации - selection word vba. " Next With oSel6 .SetRange 100, 300: .Copy: .MoveDown: .Paste .SetRange 100, 300: .CopyAsPicture End With
Хорошо, на этом можно закончить данную статью. Параллельно, информацию по работе с классом Selection можете рассмотреть еще две публикации, в которых я рассмотрел остальные методы и свойства класса Selection.
Спасибо за внимание. Автор блога Владимир Баталий
Выборка из текста (файл ms word) предложений и копирование в новый файл (ms word) с определенным форматом
Добрый день. Очень нужна помощь в создании макроса. Есть файлы в которых содержатся вопросы и.
Копирование текста в Word
Всем привет, имеется некоторый текст в Word(первый текст). Мне нужно провести над ним некоторые.
Работать в Word, не открывая документы (работа с закрытыми документами Word)
Дайте ссылку, как работать с закрытыми документами Word. У меня есть 5 шаблонов. Я хочу во всех.
"Пусть надо скопировать текст из текущего файла в новый документ,
' с начала первой страницы, до 11 (включительно)".
> Вместо Range:=r пробуйте Range:=rng
Да, глупая ошибка - я корректировал код, чтобы громоздким не был, только основное, не исправил перед отсылкой. Всё равно та же ошибка в том же месте, т.е.:
' ЗДЕСЬ ВЫДАЁТ ОШИБКУ: Run-time error '13' Type mismath
tmpDoc.Content.InsertFile FileName:=SourceFile, Range:=rng, _
ConfirmConversions:=False, Link:=False, Attachment:=False
' "Пусть надо скопировать текст из текущего файла в новый документ,
' с начала первой страницы, до 11 (включительно)".
Dim rng As Range, s1 As Range, s2 As Range
Dim bm As Bookmarks
Dim tmpDoc As Document
Set bm = ActiveDocument.Bookmarks
' Устанавливаю текущее положение - первая страница
Set s1 = Selection.GoTo(What:=wdGoToPage, Which:=wdGoToFirst, Count:=1, Name:="")
' Создаю закладку
bm.Add ("bm1")
' Устанавливаю текущее положение - 12 страница
Set s2 = Selection.GoTo(What:=wdGoToPage, Which:=wdGoToNext, Count:=12, Name:="")
' Создаю закладку
bm.Add ("bm2")
' Выделяю область
Set rng = ActiveDocument.Range(Start:=bm("bm1").Start, End:=bm("bm2").Start - 1)
' Создаю новый документ
Set tmpDoc = Application.Documents.Add '(Visible:=False)
' Вставляю текст
' ЗДЕСЬ ВЫДАЁТ ОШИБКУ: Run-time error '13' Type mismath
tmpDoc.Content.InsertFile FileName:=SourceFile, Range:=rng, _
ConfirmConversions:=False, Link:=False, Attachment:=False
tmpDoc.Close
Вот так можно поместить содержимое определённых страниц из одного документа в другой (в данном случае помещается всё содержимое первой страницы одного документа в другой):
- вставленный вручную (Word 2003: Вставка - Разрыв. - новую страницу или новую колонку);
- устанавливаемый программой Word (его видно между страницами в режиме просмотра документа Обычный режим).
ActiveWindow - чтобы понять, что это такое, нужно сделать следующее:
Word 2003 - Окно - Новое. В результате на Панели задач Windows (в самом низу монитора) появится ещё одна кнопка документа: т.е. один и тот же документ может быть открыт несколько раз. Зачем это надо? Я этим никогда не пользовался за всё время работы с Word. Могу предположить, зачем это надо, - чтобы просматривать документ в разных местах одновременно: т.е. в одном окне можем смотреть начало документа, а в другом окне - конец документа и сравнивать что-то в них.
Panes - чтобы понять что такое Panes:
Word 2003 - вставьте сноску (Вставка - Ссылка - Сноска. - Вставить). В результате в документ будет вставлена сноска. Далее: Вид - Обычный - Вид - Сноски. В результате внизу появилось что-то - это и есть Pane: т.е. в данной ситуации у нас два Pane: первый Pane - это собственно документ, а второй Pane - это что-то, связанное со сносками.
У документа всегда есть один Pane - это собственно сам документ. И этот Pane имеет порядковый номер всегда 1 (Panes(1)).
Итак строку кода:
можно прочитать так:
Активный документ - Активное окно - первая Pane - первая страница - первый разрыв на странице (кроме разрыва страницы на странице может быть ещё разрыв раздела) - место в документе, занимаемое этим разрывом страницы (или порядковый номер символа, находящегося вначале страницы. Порядковый номер считается сначала документа) - Start - начало разрыва страницы (начало и конец у разрыва страницы равны).
Аннотация: Примеры работы с текстовыми документами: работа с буфером, трансляция символов, работа с текстовыми базами данных.
Программная работа с документами Word
Текстовый документ - один из основных видов документов, наиболее привычный для обычного пользователя. Стандартные возможности Word при работе с такими документами многогранны, тем не менее, в каждой конкретной ситуации возникает необходимость выполнять специфические операции над тем или иным документом. Программная работа с документами Word хотя и проста, но требует некоторых навыков. Приведу фразу из письма одного из читателей, обратившегося на днях ко мне с просьбой помочь ему в решении задачи, возникшей перед ним при работе с документом Word . Он пишет:
Ни по одной книжке по VBA я даже близко не могу понять, как писать макросы для обработки текстовых документов
Конечно, опытные программисты не примут эту фразу всерьез.
Примеры работы с текстовыми документами
Чтобы эффективно работать с текстовыми документами, необходимо хорошо знать объекты Word , описанные в предыдущей лекции. Без знания основных коллекций, задающих структуру документа, - абзацев, предложений, слов, символов, без знания объектов Range и Selection , не обойтись. С другой стороны необходимо владение встроенными функциями VBA для работы со строковыми переменными. Умение работы с объектами Word и функциями VBA позволяет достаточно просто решать самые разнообразные задачи, возникающие в ходе работы с текстовыми документами. В предыдущей лекции, где я рассматривал объекты Word , я приводил большое число примеров, иллюстрирующих работу с теми или иными объектами. Но там рассмотрение шло от "объектов", теперь же я хочу идти от "задач", которые могут возникать при работе с текстовыми документами. Давайте перейдем к рассмотрению некоторых примеров.
Вариации на тему "буфера"
Я начну с самой простой задачи - написания собственных макросов, реализующих известные функции Word "Copy" и "Paste". Пожалуй, при создании любого из документов Word кнопки, реализующие эти функции, нажимаются чаще всего. Всегда полезно понимать, как реализованы стандартные функции, а, кроме того, иногда желательно иметь собственную реализацию, отличающуюся от стандартной. В разумности такого подхода можно будет убедиться даже на этом простом примере.
Копирование текста
Вначале рассмотрим совсем простой случай и напишем два макроса, первый из которых запоминает выделенный текст в буфере, а второй - вставляет текст из буфера в точку вставки, заданную курсором. Для решения задачи необходимо понимать три вещи:
- как представить буфер,
- как запомнить в буфере выделенный текст,
- как текст из буфера переносится в точку вставки.
Каждая из этих задач решается в одну строчку. Поэтому давайте взглянем на программный текст, а затем я приведу краткий комментарий:
Как видите, буфер задается обычной текстовой переменной VBA . Выделенный текст задается свойством Text объекта Selection . Точка вставки, заданная курсором, также представляется объектом Selection .
Несмотря на простоту этих макросов, я часто использую их наряду со стандартными реализациями Copy - Paste . Дело в том, что при вставке скопированного текста в новое местоположение всегда возникает вопрос, как должен быть отформатирован вставляемый текст (шрифт, размер, курсив и другие свойства), - должно ли использоваться форматирование копируемого текста или форматирование, определяемое контекстом точки вставки. В стандартной реализации при вставке используется форматирование копируемого текста, но во многих случаях предпочтительным является контекст точки вставки. В тех ситуациях, когда необходимо вставлять только текст, сохраняя особенности стиля точки вставки, наши простые макросы предпочтительнее стандартной реализации.
Копирование текста и шрифта
Я рассмотрю сейчас, как можно копировать в буфер не только текст, но и его шрифт. Макросы, которые будут построены, вряд ли стоит использовать на практике, но с учебной точки зрения их рассмотрение представляется полезным. Если необходимо сохранить в буфере не только текст, но и характеристики шрифта, которым этот текст записан, то буфер уже не может быть представлен простой строковой переменной. В подобных случаях, когда необходимо запоминать разнообразные характеристики выделенной области текстового документа, зачастую полезно определить пользовательский тип, задающий требуемые характеристики. Эти общим приемом я и воспользуюсь в данной достаточно простой ситуации. Вот как выглядит теперь определение буфера:
Как видите, вначале дано определение пользовательского типа, содержащего два поля для хранения текста и объекта класса Font . Сам буфер описывается переменной введенного типа TextAndFont .
Чуть усложняются и тексты макросов, решающие задачу копирования и вставки:
Первый из этих макросов не нуждается в особых комментариях. Объект Selection имеет наряду со свойством Text и свойство Font , возвращающее объект данного класса. Эти свойства и передаются в поля переменной, определяющей наш буфер. Казалось бы, что второй макрос должен быть симметричным, поскольку необходимо выполнить такое же присваивание, но в другую сторону. Однако объекты Range и Selection обладают одной особенностью, - их свойству Font нельзя присвоить объект класса Font . Можно, однако, задать характеристики этого объекта, чем я и воспользовался.
Повторяю, этот пример интересен скорее, как программистский прием. Практического значения он не имеет, так как стандартная реализация Copy - Paste решает эту же задачу, обладая при этом дополнительными преимуществами. Заметьте, что эта пара макросов неявно предполагает, что выделенный текст записан одним шрифтом, параметры которого постоянны для всего текста. Если же это не так, то будут использованы параметры конечного участка текста. В то же время стандартная реализация при вставке текста будет сохранять все изменения шрифта выделенного участка текста, что, конечно, представляется более разумным.
Копирование объекта
До сих пор я говорил о копировании выделенного текста. И делал я это потому, что копирование текста это наиболее типичная задача, возникающая при работе с документом Word. Однако понятно, что реально в документе Word выделяется не текст, а некоторая область документа, - объект Range , если говорить в терминах объектов. Я напомню, что объект Range может быть устроен столь же сложно, как и сам документ, и, наряду с текстом, содержать самые разные компоненты, например, рисунки. Стандартная реализация Copy - Paste фактически работает именно с объектом Range . Давайте напишем и мы такую же реализацию. Вот как задается буфер и макросы в подобной реализации:
Реализация макросов в этом случае даже более проста, чем в предыдущем случае. Однако, заметьте, она построена на использовании возможностей стандартного буфера и таких мощных методов работы с ним, как методы Copy и PasteSpecial . Стоит обратить внимание на то, что побочным эффектом этой реализации является изменение содержимого буфера. Конечно, можно было бы запоминать и восстанавливать его содержимое, но вряд ли стоит этим заниматься, поскольку данная реализация вряд ли имеет преимущества по сравнению со стандартной реализацией. Так что из трех пар приведенных макросов, практическую пользу может иметь самая первая и самая простая пара макросов, работающих с простым текстом.
Для начала давайте вспомним, что выделение фрагмента текста осуществляется следующим образом: в большинстве случаев нужно выбрать несколько фрагментов, для этого сначала выбираем один нужный фрагмент, далее удерживаем клавишу " Ctrl " и выбираем остальные фрагменты. Теперь перейдем к теме публикации…
Методы Insert… – выделение фрагментов текста в Word
Примеры будут как для редактора VBA, так и для сценариев Windows Script Host, и так, начнем…
Методы с префиксом Insert. позволяют вставить текст в документ:
InsertAfter (text) и InsertBefore (text) – Вставка текста (text) в конец или в начало выделения. При отсутствии выделения вставка производится там, где находится курсор. Сам материал остается выделенным.
InsertBreak (type) - Вставляет страницу, колонку или секцию. Параметр type содержит значение константы WdBreakType:
- wdTextWrappingBreak - 11 - Конец текущей строки и продолжение вставки ниже изображения, таблицы или другого объекта. Материал продолжается на следующей пустой строке, которая не содержит таблицу, совмещенную с левой или правой границей.
- wdLineBreakClearRight - 10 - Перевод на новую строку.
- wdLineBreakClearLeft - 9 - Перевод на новую строку.
- wdColumnBreak - 8 - Разрыв колонки.
- wdPageBreak - 7 - Вставка новой страницы.
- wdLineBreak - 6 - Перевод на новую строку.
- wdSectionBreakOddPage - 5 - Начало нового раздела со следующей нечетной страницы.
- wdSectionBreakEvenPage - 4 - Начало нового раздела со следующей четной страницы.
- wdSectionBreakContinuous - 3 - Новый раздел без разрыва страницы.
- wdSectionBreakNextPage - 2 - Начало нового раздела со следующей страницы.
Прежде чем приступать к программированию, стоит сделать некоторое пояснение. По сути, ряд действий будут всегда одинаковыми – создание нового документа (за это будет отвечать функция или процедура Create_Doc). Изменяться будут только вызываемые методы.
Программный код на VBScript :
' ---------------------------------------------------------------------------- ' Объект Word Selection - методы ' Пример на языке VBScript - выделение фрагментов Word текста ' Selection-1.vbs ' ---------------------------------------------------------------------------- Option Explicit ' Глобальные переменные dim oWord, oDoc, oSel, i ' Процедура создания нового документа Sub Create_Doc() Set oWord = CreateObject("Word.Application") Set oDoc = oWord.Documents oDoc.Add() Set oSel = oWord.Selection oWord.Visible = True End Sub Sub Insert_After_Before() With oSel .Text = "как выделить фрагмент текста " .InsertAfter " . Конец" .InsertBefore "Начало. " .EndOf .InsertBreak 6 End With End Sub call Create_Doc call Insert_After_Before
Давайте посмотрим, что данный пример делает. При вызове процедуры Insert_After_Before происходит добавление в документ текстовой строки, далее в конец добавляется фраза " . Конец", а в начало - "Начало. ". Потом происходит перевод курсора в конец и добавление перевода строки.
Пример на JScript :
Для VBA мы просто запускаем редактор кода, добавляем новый модуль и прописываем код, в моем случае имя модуля - Module1:
Sub Module1() ' ---------------------------------------------------------------------------- ' выделение в Word фрагментов текста ' ---------------------------------------------------------------------------- Dim oWord1 As Object, oDoc1 As Object, oSel1 As Object, i Set oWord1 = CreateObject("Word.Application") Set oDoc1 = oWord1.Documents oDoc1.Add Set oSel1 = oWord1.Selection oWord1.Visible = True '*************************************** With oSel1 .Text = "как выделить фрагмент текста " .InsertAfter " . Конец" .InsertBefore "Начало. " .EndOf .InsertBreak wdLineBreak End With '*************************************** End Sub
И так, с одной теоретической частью мы закончили и написали программный код, теперь можно приступить к следующей части.
Методы Insert… – выделение фрагментов текста в Word
InsertCaption (Label, Title, TitleAutoText, Position, ExcludeLabel) - Вставляет заголовок сразу после или перед указанным выбором. Обязательным является только параметр Label.
Label – Нумерационный заголовок. Параметр может быть строкой или значением константы WdCaptionLabelID:
- wdCaptionEquation - Уравнение
- wdCaptionFigure - Рисунок
- wdCaptionTable – Таблица
Если метка (Label) не определена, то возникнет ошибка. Для определения метки надо использовать метод Add коллекции CaptionLabels , например:
Title – Заголовок, который будет отображаться справа от метки.
TitleAutoText – Авто-заголовок, перекрывает параметр Title.
Position - Указывает, будет ли вставлен заголовок выше или ниже. Может быть одной из констант WdCaptionPosition:
- wdCaptionPositionAbove - 0 - Метка название добавляется выше.
- wdCaptionPositionBelow - 1 - Метка название добавляется ниже.
ExcludeLabel - TRUE - отключить метку, заданную в параметре Label. FALSE - включить метку. Дополнительно.
Ниже я приведу примеры, что бы не дублировать программный код, я привел только содержимое процедуры Sub Insert_Caption.
' VBScript Sub Insert_Caption() oWord3.CaptionLabels.Add "Номер" For i = 0 To 10 oSel3.InsertCaption "Номер", " как выделять фрагменты текста " & i oSel3.InsertBreak 6 Next End Sub
Тут используется цикл for для вставки нескольких фрагментов - "Урок 6 по VBScript: Циклы for…next и for each…next".
Тут тоже используется цикл for, но уже для JS кода - "Урок 9 по JScript - оператор цикла for".
' VBA oWord5.CaptionLabels.Add "Номер" For i = 0 To 10 oSel5.InsertCaption Label:="Номер", Title:=" Фраза VBA Selection " & i oSel5.InsertBreak wdLineBreak Next
Обратите внимание, что имена переменных в примерах отличаются, это пришлось сделать с технических причин – в глазах поисковых систем статья становится заспамленой. Хорошо, давайте двигаться дальше.
Методы Insert… – выделение фрагментов текста в Word
InsertDateTime (DateTimeFormat) – Метод позволяет вставить дату или время в документ, или одновременно оба значения. Помимо параметра DateTimeFormat есть еще четыре, но они практически не используются.
DateTimeFormat – Необязательный параметр, позволяет указать формат даты и времени.
' VBScript Sub Insert_Date With oSel4 .Text = "как выделить фрагмент текста " .EndOf .InsertBreak 6 .InsertDateTime .InsertBreak 6 .InsertDateTime "MMMM dd, yyyy" .InsertBreak 6 .InsertDateTime "MMMM dd, yyyy - H:M:S" End With End Sub
Обратите внимание на оператор with, он позволяет не писать каждый раз имя класса.
Тут логика работы аналогична.
' VBA With oSel5 .Text = " как выделить в Word фрагмент текста " .EndOf .InsertBreak wdLineBreak .InsertDateTime .InsertBreak wdLineBreak .InsertDateTime "MMMM dd, yyyy" .InsertBreak wdLineBreak .InsertDateTime "MMMM dd, yyyy - H:M:S" End With
Хорошо, осталось рассмотреть последнюю третью часть статьи.
Методы Insert… – выделение фрагментов текста в Word
InsertFile (FileName) – Позволяет вставить содержимое указанного файла в документ, параметр FileName хранит имя или путь к файлу, если путь отсутствует, то будет подразумеваться текущий каталог.
InsertNewPage - Вставляет новую страницу в место, где находится указатель.
InsertParagraph - Заменяет выделение знаком абзаца.
InsertParagraphAfter - Вставляет знак абзаца после выделения .
InsertParagraphBefore - Вставляет новый абзац перед выделением.
Методы с префиксом Move. также встречаются едва ли не в любой программе, связанной с вводом текста в Word. Самые важные и удобные из этих методов:
MoveLeft (), MoveRight (), MoveUp (), MoveDown () – Методы дают возможность переместить курсор влево, вправо, вверх и вниз. Все четыре метода принимают следующие параметры (Unit, Count, Extend), являющиеся необязательными:
Unit - Блок, по которым выбор должен быть перемещен. Параметр Unit содержит значения константы wdUnits.
Count – Единица перемещения. Значение по умолчанию 1.
Extend - Может быть либо wdMove (по умолчанию) или wdExtend.
MoveEnd (), MoveStart () – Перемещение курсора в конец или начало выделения, параметры - Unit, Count.
MoveStartUntil (), MoveStartWhile (), MoveEndUntil (), MoveEndWhile () – Позволяют переместить курсор к заданному символу или последовательности символов. Параметры Cset (обязательный) и Count (дополнительный):
Cset - Один или несколько символов. Аргумент является чувствительным к регистру.
Count – Задает целое или отрицательное значение, на которое происходит перемещение курсора.
Move (Unit, Count) – Фактически, тут мы может указать направление (Count) и текстовую единицу (Unit).
Логика работы для следующих примеров остается та же – меняется только код вызываемой процедуры. Фактически, код для языка VBScript и VBA является идентичным.
' VBScript Sub Get_Move() With oSel6 ' вставляем в документ фразу сто раз For i = 0 To 10 .Text = "как выделить фрагменты нужного текста " ' Перемещаем курсор в конец .EndOf Next For i = 0 To 300 .MoveLeft Next For i = 0 To 100 .MoveRight Next For i = 0 To 4 .MoveUp Next .MoveStartUntil "Word" For i = 0 To 15 .Move 2, 5 Next End With End Sub
Видим, что в данном коде мы использовали несколько операторов for.
Обратите внимание на приведенные в самом начале статьи примеры кода для языков VBA и VBScript, в макросе мы можем использовать именованные константы объекта Word, но в теле Windows Script Host сценария нет, так как там они не доступны. Описание свойств класса Selection я рассмотрел в этой статье.
Спасибо за внимание. Автор блога Владимир Баталий
Помним, что бы вручную выделить весть текст в Ворд , достаточно нажать комбинацию клавиш "Ctr + A". Мы рассмотрим некоторые свойства объекта Word.Selection. Говорю "некоторые", так как большинство используются редко, в случае чего – документация MSDN всегда под рукой. И так, сам объект Selection выполняет двойную функцию – с одной стороны он позволяет вставлять фразу в только что созданный документ, с другой стороны – позволяет обрабатывать выделение всего текста в ворде. Описание методов класса Selection можно просмотреть тут и тут.
Свойства класса Word.Selection – выделить весь текст в Ворде
В конце статьи я приведу три примера программного кода – два под Windows Script Host (язык VBScript и JScript) и один под Visual Basic for Application.
И так, сначала давайте познакомимся со свойствами:
Start и End – Если текст уже выделен, то Start и End будут содержать начальную и конечную позиции выделения. Так как они доступны и для записи, то можно задать диапазон для выделения всего текста в ворде.
Flags – Позволяет установить или получить параметры выбора. Flags может быть установлено в одной из следующих констант wdSelectionFlags:
- wdSelActive - 8 - активное выделение.
- wdSelAtEOL - 2 – конец строки.
- wdSelOvertype - 4 – замена символов.
- wdSelReplace - 16 - выбор был заменен.
- wdSelStartActive - 1 - начало активного документа.
Само свойство возвращает сумму констант wdSelectionFlags.
Information (Type) - Получить информацию относительно выделения или заданного диапазона. Только чтение. Параметр Type содержит значения константы wdInformation (я указал только основные значения):
- wdActiveEndAdjustedPageNumber – 1 - Номер страницы.
- wdActiveEndSectionNumber – 2 - Количество разделов.
- wdActiveEndPageNumber – 3 – Номер страницы начиная с начала.
- wdNumberOfPagesInDocument – 4 – Количество страниц в документе
- wdHorizontalPositionRelativeToPage – 5 - Горизонтальная позиция от левого края выделения к левому краю страницы в пунктах.
- wdVerticalPositionRelativeToPage – 6 – Вертикальная позиция от верхнего края выделения к верхнему краю страницы в пунктах.
- wdFirstCharacterColumnNumber – 9- Позиция первого слова в выделении начиная с начала документа.
- wdFirstCharacterLineNumber – 10 – Позиция строки, с которой начинается выделение, начиная с начала.
- wdFrameIsSelected – 11 – TRUE, если выделен весть текст в ворде.
- wdZoomPercentage - 19 – Масштаб в процентах
- wdCapsLock – 21 – TRUE если включен CapsLock.
- wdNumLock - 22 – TRUE если включен NumLock.
- wdRevisionMarking – 24 - Возвращает True, если отслеживание изменений в силу.
Все константы будут содержать значение -1, если информация выходит за пределы допустимой области.
IPAtEndOfLine —True - указатель ввода расположен в конце строки (в крайнем правом положении при выравнивании).
NoProofing — Отменяет (значение TRUE) для выбранного фрагмента проверку орфографии и грамматики.
StoryType – Возвращает тип истории для указанного выбора (только чтение). Константа WdStoryType:
- wdCommentsStory - 4 – Комментарии.
- wdEndnoteContinuationNoticeStory - 17 - Сноска продолжения уведомления.
- wdEndnoteContinuationSeparatorStory - 16 – Сноска продолжения разделителя.
- wdEndnoteSeparatorStory - 15 - Сноска разделитель.
- wdEndnotesStory - 3 – Примечания.
- wdEvenPagesFooterStory - 8 - Четные страницы футера.
- wdEvenPagesHeaderStory - 6 - Четные страницы заголовка.
- wdFirstPageFooterStory - 11 –Первый футер страницы.
- wdFirstPageHeaderStory - 10 – Первый заголовок страницы.
- wdFootnoteContinuationNoticeStory - 14 - Сноска продолжения уведомления.
- wdFootnoteContinuationSeparatorStory - 13 - Сноска продолжения разделителя.
- wdFootnoteSeparatorStory - 12 - Сноска разделитель.
- wdFootnotesStory - 2 – Сноски.
- wdMainTextStory - 1 - Основной текст.
- wdPrimaryFooterStory - 9 - Первичный футер.
- wdPrimaryHeaderStory - 7 - Первичный заголовок.
- wdTextFrameStory - 5 - Текст рамки.
Text – Получить или указать материал, который будет вставлен на месте выделения, или просто там, где расположен курсор. Чтение/Запись
Type – Возвращает тип выделения, константа WdSelectionType:
- wdNoSelection - 0 – Отсутствует.
- wdSelectionBlock - 6 – Блок.
- wdSelectionColumn - 4 – Столбец.
- wdSelectionFrame - 3 – Рамка.
- wdSelectionInlineShape - 7 – Рядовая форма.
- wdSelectionIP - 1 – Пункт.
- wdSelectionNormal - 2 – Нормальный.
- wdSelectionRow - 5 – Строка.
- wdSelectionShape - 8 – Форма.
Начинаем программировать – выделить весь текст в ворде
Ниже, как обещал, привожу примеры кода. По сути, все заключается в создании нового документа, в который сто раз вставляется заданная фраза, далее, мы указываем, что надо выделить весь текст в ворде. Потом происходит выбор фрагмента и вывод значений некоторых свойств.
Пример на языке VBScript:
' ---------------------------------------------------------------------------- ' Класс Word Selection ' Создание, ввод и выбор ' выделение текста в ворде ' Selection.vbs ' ---------------------------------------------------------------------------- Option Explicit dim oWord, oDoc, oSel, SelText, MyText, i, SEnd, SStart Set oWord = CreateObject("Word.Application") Set oDoc = oWord.Documents oDoc.Add() Set oSel = oWord.Selection oWord.Visible = True MyText="Пример работы с объектом Word Selection в VBScript, выделение всего текста в ворде " ' вставляем в документ фразу сто раз For i = 0 To 100 oSel.Text = MyText ' Перемещаем курсор в конец содержимого oSel.EndOf Next ' Выделяем весь текст в ворде oWord.Documents(1).Select ' задержка в пять секунд WScript.Sleep 5000 With oSel ' Определяем позиции SStart = oSel.Start SEnd = oSel.End ' Перемещаем курсор в конец .EndOf .Text = SStart & " " & SEnd .EndOf ' Выделяем заданный диапазон .Start= SStart +400 .End= SEnd -400 ' задержка в пять секунд WScript.Sleep 5000 ' Отменяем проверку .NoProofing = true ' Выводим значения выделить весь текст в документе ворд MsgBox "Information - " & .Information(19) & vbCrLf &_ "StoryType - " & .StoryType & vbCrLf &_ "Type - " & .Type & vbCrLf &_ "IPAtEndOfLine - " & .IPAtEndOfLine End With
Пример на языке JScript:
Пример под Visual Basic for Application:
Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Sub Module2() Dim oWord2 As Object Dim oDocument As Object Dim oSel As Object Set oWord2 = CreateObject("Word.Application") oWord2.Visible = True Set oDocument = oWord2.Documents.Add Set oSel = oWord2.Selection MyText = "Пример работы с объектом Word Selection в Visual Basic for Application - выделить весь текст в ворде " With oSel For i = 0 To 100 .Text = MyText .EndOf Next oWord2.Documents(1).Select Sleep 3000 SStart = .Start SEnd = .End .EndOf .Text = SStart & " " & SEnd .EndOf .Start = SStart + 400 .End = SEnd - 400 ' выделить весь текст в документе ворд Sleep 3000 .NoProofing = True End With End Sub
И так, с теоретической частью мы разобрались, и даже немного попрограммировали, теперь стоит дать некоторые пояснения к программному коду. В последнем примере для VBA в самом начале есть такая строка:
Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Дело в том, что функция Sleep (смотрите статью "Объект WScript - методы sleep, quit и echo и 8 свойств") доступна только в сценариях VBS и JS, что бы сделать задержку для макроса, мне пришлось обратиться к системной функции Windows. Для вставки материала в документ используется цикл for, его смотрите описание синтаксиса для JScript - "Урок 9 по JScript - оператор цикла for" и для VBScript - "Урок 6 по VBScript: Циклы for…next и for each…next". В остальном коде я думаю, разобраться несложно, если есть вопросы, задавайте, буду рад ответить.
Спасибо за внимание. Автор блога Владимир Баталий
Читайте также: