Visual Basic for Applications is the language behind the Office apps that allows you to automate tasks. But using VBA in Word has its challenges. The first is moving around in a document because of all the different types of content: Text, pictures, tables and so on. In this tutorial, I’ll show you two simple VBA procedures for navigating. One identifies the beginning of a Word document, and the other identifies the document’s end.
I’m using Microsoft 365 on a Windows 10 64-bit system, but you can use an earlier version. You may access the demo files here. Word for the web doesn’t support VBA.
SEE: Google Workspace vs. Microsoft 365: A side-by-side analysis w/checklist (TechRepublic Premium)
About Microsoft Word VBA’s ActiveDocument
The main VBA component that we’ll rely on in both procedures is the ActiveDocument property, which returns a Document object that represents the active document. In other words, this opens the document, as a whole. You won’t need this for every VBA procedure in Word, but you will need it when you need to reference “parts” of the document.
If no Word document is open, this property returns an error. If you’re using this property from inside Excel or PowerPoint, you should include error-handling for this situation.
This property uses the following form:
expression.ActiveDocument
where expression
is a variable that represents the Application object (Word). Fortunately, in Word, this is implicitly implied.
The next piece of VBA we’ll use is the Range method, which uses the form
expression.Range(start, end)
to return a Range object. We’ll use this method to identify an area of the document.
There’s no method that says “go to the beginning,” or “go to the end,” so we’ll use the start and end arguments to identify both. Both arguments are optional, and as you might suspect, start
identifies the first character position and end
identifies the last character position.
Now, let’s move on to the actual VBA procedures.
How to use VBA to find the beginning of a Word document
Moving the cursor to the beginning of a Word document using VBA is amazingly simple. Listing A shows the procedure. First, the procedure declares and defines a range object, using 0s to identify the beginning of the document. Two 0s will place the cursor before any content in the active document. The second line adds a bit of text and the vbNewLine
constant adds a new line.
Listing A
Sub GoToStart()
'Move cursor to the beginning of the active document.
'Add a short text phrase to show it worked.
Dim rBegin As Range
Set rBegin = ActiveDocument.Range(0, 0)
rBegin.Text = "This is the beginning of this document." & vbNewLine
End Sub
Now let’s look at the second procedure that moves the cursor to the end of a document.
How to use VBA to find the end of a Word document
As mentioned, there is no method that says “go to the end,” so we need to force the issue by finding the last character. It is a bit more complex, but not difficult, as shown in Listing B. This procedure works similar to the first, but it enters the text at the end of the document, which it finds by using the Last property of the Characters object.
This time we positioned the vbNewLine
constant before the text.
Listing B
Sub GoToEnd()
'Move cursor to the end of the active document.
'Add a short text phrase to show it worked.
Dim rEnd As Range
Set rEnd = ActiveDocument.Range.Characters.Last
rEnd.Text = vbNewLine & "This is the end of this document."
End Sub
How to enter and run the VBA procedures into a Word document
Now it’s time to enter both procedures for use in a Word document. I’m using a short two-page Word document, shown in Figure A, with a variety of content saved as a macro-enabled Word file. If you are using a ribbon version, you must save the Word document as a macro-enabled file to run VBA. If you’re working in the menu version, you can skip this step.
Figure A
To enter the VBA procedures, press Alt + F11 to open the Visual Basic Editor (VBE). In the Project Explorer to the left, select ThisDocument. You can enter the code manually or import the downloadable .cls file. In addition, the procedure is in the downloadable .docm and .doc files. If you enter the code manually, don’t paste from this web page. Instead, copy the code into a text editor and then paste that code into the ThisDocument module. Doing so will remove any phantom web characters that might otherwise cause errors.
Now let’s run the procedures as follows:
- Click the Developer tab.
- Choose Macros in the Code group.
- In the resulting dialog, choose GoToStart (Figure B).
- Click Run.
As you can see in Figure C, the procedure inserts text and a line break at the beginning of the Word document. Now let’s repeat this process but choose GoToEnd (Figure B). This procedure inserts a line break and a bit of text to the end of the Word document, as you can see in Figure D.
Figure B
Figure C
Figure D
One thing you might notice is that both of the inserted sentences use different formats. These sentences, like any other, will use the format in place. This is worth remembering if you want inserted text to use a specific format instead.
Most likely, you won’t want to work through all those steps to run this macro. I recommend that you add it to the Quick Access Toolbar or a custom group. If you need help with that, read How to add Office macros to the QAT toolbar for quick access.
Stay tuned
Both VBA procedures are simple — both the procedures themselves and the tasks they complete. The goal is to show you how to navigate to both spots using VBA. Over the next few months, I’ll devote a few articles to more navigational VBA in Microsoft Word documents.
0 / 0 / 0 Регистрация: 29.12.2013 Сообщений: 5 |
|
1 |
|
02.07.2014, 14:07. Показов 19908. Ответов 6
Нужен макрос, вставляющий в конец документа строчку с информацией о документе (путь, имя, дата открытия). Используемые объекты, коллекции, свойства, методы, функции: Paragraphs, Add, Range, Path, Name.
0 |
5561 / 1367 / 150 Регистрация: 08.02.2009 Сообщений: 4,107 Записей в блоге: 30 |
|
02.07.2014, 14:38 |
2 |
Задача ясна. Но тут не отдел заказов. Развивайте тему.
1 |
ball 0 / 0 / 0 Регистрация: 29.12.2013 Сообщений: 5 |
||||||||
02.07.2014, 15:11 [ТС] |
3 |
|||||||
Вставить текст через
Дату через
Можно так?
0 |
5561 / 1367 / 150 Регистрация: 08.02.2009 Сообщений: 4,107 Записей в блоге: 30 |
|
02.07.2014, 20:49 |
4 |
Можно, и не только дату: Миниатюры
0 |
Sasha_Smirnov 5561 / 1367 / 150 Регистрация: 08.02.2009 Сообщений: 4,107 Записей в блоге: 30 |
||||
03.07.2014, 02:43 |
5 |
|||
Первую половину (а может, даже и вторую) можно сделать вставкой соответствующих полей:
А для помещения всей этой лабуды внизу страницы Вождь предложил метод Repaginate: Добавление подписи в конце страницы. Миниатюры
1 |
ball 0 / 0 / 0 Регистрация: 29.12.2013 Сообщений: 5 |
||||
03.07.2014, 18:49 [ТС] |
6 |
|||
Всем спасибо, вроде получилось! Только вот этот пункт не удается реализовать:по запросу пользователя – запрос о сравнении контрольной суммы с сохраненной.
0 |
Sasha_Smirnov 5561 / 1367 / 150 Регистрация: 08.02.2009 Сообщений: 4,107 Записей в блоге: 30 |
||||||||
04.07.2014, 02:08 |
7 |
|||||||
П́оля для контрольной суммы* не знаю; а то, что мы уже получили, можно сделать короче:
Попробуйте на закуску диалоговые окна Сведения (другой перевод: Свойства) и Статистика:
_______________
1 |
Доброго времени суток всем подписчикам и читателям блога scriptcoding.ru. В этой статье мы продолжим изучать класс Selection, который показывает, как выделить фрагмент текста в документе Word.
Для начала давайте вспомним, что выделение фрагмента текста осуществляется следующим образом: в большинстве случаев нужно выбрать несколько фрагментов, для этого сначала выбираем один нужный фрагмент, далее удерживаем клавишу «Ctrl« и выбираем остальные фрагменты. Теперь перейдем к теме публикации…
Объект Word Selection содержит довольно много методов, большая часть из которых практически не используется, да и превращать блог в энциклопедию просто нет смысла. Поэтому, я решил разбить описание методов на две статьи, выбрав только те, которые чаще всего используются. В этой первой части я рассмотрю примеры работы с двумя категориями – методы с префиксомInsert и Move. Со второй частью можете ознакомиться в статье «Объект Word Selection — выделение текста, методы #2«.
Содержание
- Методы Insert… – выделение фрагментов текста в Word
- Методы Insert… – выделение фрагментов текста в Word
- Методы Insert… – выделение фрагментов текста в Word
- Методы Insert… – выделение фрагментов текста в Word
Методы 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:
// ---------------------------------------------------------------------------- // Объект Word Selection - методы // Пример на языке JScript - выделение фрагмента в тексте // Selection-1.js // ---------------------------------------------------------------------------- // глобальные переменные var oWord, oDoc, oSel, i function Create_Doc(){ oWord = WScript.CreateObject("Word.Application"); oDoc = oWord.Documents; oDoc.Add(); oSel = oWord.Selection; oWord.Visible = true; } function Insert_After_Before(){ with(oSel){ Text = "как выделить в документе фрагмент текста "; InsertAfter(" ............Конец"); InsertBefore("Начало...... "); EndOf(); InsertBreak(6); } } Create_Doc(); Insert_After_Before();
Для 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, например:
Applicationd.CaptionLabels.Add Name:="Рисунок"
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«.
//JScript function Insert_Caption(){ oWord4.CaptionLabels.Add("Номер"); for (i = 0; i<=10; i++){ oSel4.InsertCaption("Номер", " выделение фрагмента текста " + i); oSel4.InsertBreak(6); } }
Тут тоже используется цикл 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, он позволяет не писать каждый раз имя класса.
//JScript function Insert_Date(){ with(oSel4){ Text = " выделение фрагментов Word текста "; EndOf(); InsertBreak(6); InsertDateTime(); InsertBreak(6); InsertDateTime("MMMM dd, yyyy"); InsertBreak(6); InsertDateTime("MMMM dd, yyyy - H:M:S"); } }
Тут логика работы аналогична.
' 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.
//JScript function Get_Move(){ with(oSel6){ for (i=0; i<=10; i++){ .Text = "Текстовая строка: выделение фрагментов текста "; .EndOf(); } for (i=0; i<= 300; i++){ .MoveLeft(); } for (i=0; i<= 100; i++){ .MoveRight(); } for (i=0; i<= 4; i++){ .MoveUp(); } .MoveStartUntil("Word"); for (i=0; i<= 15; i++){ .Move(2, 5); } } }
Обратите внимание на приведенные в самом начале статьи примеры кода для языков VBA и VBScript, в макросе мы можем использовать именованные константы объекта Word, но в теле Windows Script Host сценария нет, так как там они не доступны. Описание свойств класса Selection я рассмотрел в этой статье.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
1 05.02.2010 18:15:40
- Penniwise
- сержант
- Неактивен
- Зарегистрирован: 04.02.2010
- Сообщений: 23
Тема: Определение конца строки
Благодарю за грамотный, познавательный, интереснейший сайт. Наткнулся на него пару недель назад, с жадностью впитываю новую для себя информацию…
Дабы не обременять однотипными вопросами админов пытался найти ответ на интересующую меня тему, но не найдя, решил-таки обратиться с вопросом…
Увлёкся форматированием текста (использую замену, в т. ч. в необходимых случаях с использованием подстановочных знаков). Коснулся вопросов расстановки пробелов. Повсеместная расстановка неразрывных пробелов после предлогов, союзов и частиц (далее — ПСЧ) визуально портит текст ввиду особенности этого неразрывного пробела — он нерастягиваемый. Поэтому решил, что было бы неплохо расставлять их только в конце строки.
Вопрос:
Как определить конец строки, которую завершает ПСЧ, и проставить в этом случае неразрывный пробел перед этими ПСЧ? Если не трудно, приведите, пожалуйста, пример такового кода макроса.
2 Ответ от Вождь 05.02.2010 18:52:09
- Вождь
- Модератор
- Неактивен
- Зарегистрирован: 07.01.2010
- Сообщений: 745
- Поблагодарили: 181
Re: Определение конца строки
Поможет функция:
Она возвращает True в месте, где текст переходит на следующую строку. Не путать с концом строки! Например, если вставлен символ разрыва строки, то Selection.IPAtEndOfLine=False.
Для перемещения в конец строки к подойдет функция:
Selection.EndOf Unit:=Word.wdLine, Extend:=Word.wdMove
Как перейти на следующую строку думаю догадаетесь…
P.S. Я писал похожий макрос, но до концов строк не додумался. Зато реализовал прикрепление: номеров (Глава 1, 2 место и т.п.), союзов и частиц, крайних слов (в конце предложения, перед/после скобки, кавычки и т.п.)
Макросы под заказ и готовый пакет — mtdmacro.ru
3 Ответ от Penniwise 09.02.2010 16:16:52
- Penniwise
- сержант
- Неактивен
- Зарегистрирован: 04.02.2010
- Сообщений: 23
Re: Определение конца строки
К сожалению, мои познания в VBA пока ещё недостаточны для того, чтобы сделать это самому. Вынужден снова обращаться к Вам за помощью. Имеется вот такой нижеприведённый код. За основу взят код неизвестного мне разработчика.
Sub SimpleReplace(what, forwhat, checkCase)
exitPoint = False
With Selection
With .Find
.ClearFormatting
.Text = what
.Replacement.ClearFormatting
.Replacement.Text = forwhat
.Forward = True
.Wrap = wdFindContinue
.MatchCase = checkCase
.MatchWildcards = False 'NEW
.Execute Replace:=wdReplaceAll
If Not .Found Then
exitPoint = True
End If
End With
End With
End Sub
...
If MsgBox("Проставить неразрывный пробел после предлогов?", 308, "Шаг 5 из 6") = vbYes Then
SimpleReplace " в ", " в^s", True
SimpleReplace " о ", " о^s", True
SimpleReplace " к ", " к^s", True
SimpleReplace " от ", " от^s", True
SimpleReplace " с ", " с^s", True
' и так далее нужное мне количество вариантов букв
...
End If
Как я понял, в начале макроса определяется некая процедура SimpleReplace, которая в дальнейшем с успехом применяется в нужном количестве раз.
Ума не приложу, честно говоря, куда «всунуть» эту самую Selection.IAPtEndOfLine.
Можно ли её в саму процедуру SimpleReplace включить?
Задача состоит в том, чтобы после этих букв проставлять «неразрывный пробел» ТОЛЬКО, если они находятся в конце строки и после них стоит «пробел».
Буду благодарен, если подскажете, где могу подробнее про это почитать?
Отредактировано Penniwise (09.02.2010 16:22:48)
4 Ответ от Вождь 09.02.2010 18:50:58
- Вождь
- Модератор
- Неактивен
- Зарегистрирован: 07.01.2010
- Сообщений: 745
- Поблагодарили: 181
- За сообщение: 1
Re: Определение конца строки
Вот замена функции SimpleReplace, делающая замены только в конце строк:
Sub SimpleReplaceAtEndOfLine(what, forwhat, checkCase)
exitPoint = False
With Selection
With .Find
.ClearFormatting
.Text = what
.Replacement.ClearFormatting
.Replacement.Text = forwhat
.Forward = True
.Wrap = wdFindStop
.MatchCase = checkCase
.MatchWildcards = False
Do While .Execute(Replace:=wdReplaceNone)
exitPoint = True
Dim L&, N&
L = Selection.Characters.Count
N = Selection.EndOf(Unit:=Word.wdLine, Extend:=Word.wdMove)
If (N = 1) And Selection.IPAtEndOfLine Then
Selection.MoveEnd Unit:=Word.wdCharacter, Count:=1 - L - N
.Execute Replace:=wdReplaceOne
Else
Selection.MoveEnd Unit:=Word.wdCharacter, Count:=2 - L - N
End If
Loop
End With
End With
End Sub
Непонятно для чего у вас переменная exitPoint. Я ее воткнул приблизительно. В следующий раз выкладывайте весь код или компилируемый фрагмент.
Почитать могу посоветовать только Help по VBA встроенный в Word.
Макросы под заказ и готовый пакет — mtdmacro.ru
5 Ответ от Penniwise 09.02.2010 19:48:08
- Penniwise
- сержант
- Неактивен
- Зарегистрирован: 04.02.2010
- Сообщений: 23
Re: Определение конца строки
Не получилось.
Выкладываю весь макрос.
Изначальный код не мой, я просто разместил объяву, поэтому возможны переменные, смысл которых я пока не знаю. Главное, что я знаю, что они мне пока не мешают, а код я доработал и он функционирует, в принципе, как мне нужно. Исключение составляет лишь этот противный конец строки.
Искомая задача ставится в шаге 5, 6.
Post’s attachments
Tipografic.bas 20 Кб, 9 скачиваний с 2010-02-09
You don’t have the permssions to download the attachments of this post.
6 Ответ от Вождь 09.02.2010 20:08:34
- Вождь
- Модератор
- Неактивен
- Зарегистрирован: 07.01.2010
- Сообщений: 745
- Поблагодарили: 181
Re: Определение конца строки
Penniwise пишет:
Не получилось…
Да, работать не будет.
Подправьте начало моей процедуры:
Sub SimpleReplaceAtEndOfLine(what, forwhat, checkCase)
With Selection
.SetRange 0, 0
With .Find
...
Макросы под заказ и готовый пакет — mtdmacro.ru
7 Ответ от Penniwise 09.02.2010 23:18:04
- Penniwise
- сержант
- Неактивен
- Зарегистрирован: 04.02.2010
- Сообщений: 23
Re: Определение конца строки
Работает!!! (смайлик с выпученными глазами)
Огромное спасибо!!!
8 Ответ от Penniwise 05.03.2010 11:48:07
- Penniwise
- сержант
- Неактивен
- Зарегистрирован: 04.02.2010
- Сообщений: 23
Re: Определение конца строки
С момента внедрения данной функции в макрос работать стало приятнее.
Однако, выявлен баг — макрос, выполняя свои итерации, вешает процесс winword.exe, вынуждая жёстко его завершать. Происходит это в случае, когда в документе присутствуют перекрёстные ссылки, оглавление. Курсор «добегает» до какой-нибудь перекрестной ссылки (как правило текстовой и, предположительно, содержащей в себе буквосочетание, которое ищет макрос) и останавливается, продолжая очень часто моргать.
С чем это может быть связано? Как это ликвидировать?
Отредактировано Penniwise (05.03.2010 11:48:38)
9 Ответ от Вождь 05.03.2010 14:35:27
- Вождь
- Модератор
- Неактивен
- Зарегистрирован: 07.01.2010
- Сообщений: 745
- Поблагодарили: 181
- За сообщение: 1
Re: Определение конца строки
Penniwise пишет:
..выявлен баг … в случае, когда … присутствуют … ссылки…
Модификация под ссылки и т.п.:
Sub SimpleReplaceAtEndOfLine(what, forwhat , checkCase)
With Selection
.SetRange 0, 0
With .Find
.ClearFormatting
.Text = what
.Replacement.ClearFormatting
.Replacement.Text = forwhat
.Forward = True
.Wrap = wdFindStop
.MatchCase = checkCase False
.MatchWildcards = False
Do While .Execute(Replace:=wdReplaceNone)
Dim R As Word.Range
Dim EOL As Boolean
Dim N&
Set R = Selection.Range
N = Selection.EndOf(Unit:=Word.wdLine, Extend:=Word.wdMove)
EOL = Selection.IPAtEndOfLine
R.Select
If (N = 1) And EOL Then
Selection.Collapse Direction:=Word.wdCollapseStart
.Execute Replace:=wdReplaceOne
Else
Selection.Collapse Direction:=Word.wdCollapseEnd
End If
Loop
End With
End With
End Sub
Отредактировано Вождь (05.03.2010 14:37:38)
Макросы под заказ и готовый пакет — mtdmacro.ru
10 Ответ от Penniwise 12.03.2010 11:14:44
- Penniwise
- сержант
- Неактивен
- Зарегистрирован: 04.02.2010
- Сообщений: 23
Re: Определение конца строки
Благодарю. Теперь работает.
Теперь буду сам пытаться разобраться, как сделать, чтобы после отработки макросом этой его части, курсор и экран возвращался бы в то место, с которого он начал выполнение.
11 Ответ от andrkar 15.03.2010 19:34:18
- andrkar
- Модератор
- Неактивен
- Откуда: Томск
- Зарегистрирован: 10.03.2010
- Сообщений: 431
- Поблагодарили: 26
- За сообщение: 1
Re: Определение конца строки
может подойдет такое решение для возврата:
1. Добавление закладки
With CurrentDoc.Bookmarks
.Add Range:=Selection.Range, Name:=»Имя_закладки» ‘Добавление закладки
.DefaultSorting = wdSortByName
.ShowHidden = False
End With
2. Переход к нужной закладке
Selection.GoTo What:=wdGoToBookmark, Name:=»Имя_закладки»
Selection.Find.ClearFormatting
With Selection.Find
.Forward = True
.Wrap = wdFindContinue
End With
3. Удаление закладки
CurrentDoc.Bookmarks(«Имя_закладки»).Delete ‘ Удаление закладки
12 Ответ от viter.alex 15.03.2010 21:01:20
- viter.alex
- Модератор
- Неактивен
- Откуда: Харьков, Украина
- Зарегистрирован: 21.12.2009
- Сообщений: 884
- Поблагодарили: 140
Re: Определение конца строки
Поясню пример andrkar. Т.е. перед выполнением действий с документом, нужно поставить закладку в то место, где находится курсор, а затем, когда всё сделаем, перейти к этой закладке и удалить её.
Эта часть кода для перехода к закладке не нужна:
With Selection.Find
.Forward = True
.Wrap = wdFindContinue
End With
Лучше день потерять — потом за пять минут долететь!
13 Ответ от andrkar 15.03.2010 21:22:47
- andrkar
- Модератор
- Неактивен
- Откуда: Томск
- Зарегистрирован: 10.03.2010
- Сообщений: 431
- Поблагодарили: 26
Re: Определение конца строки
Вождь
.MatchCase = checkCase False
у меня vb на данную строку ругается…
14 Ответ от viter.alex 15.03.2010 21:32:05
- viter.alex
- Модератор
- Неактивен
- Откуда: Харьков, Украина
- Зарегистрирован: 21.12.2009
- Сообщений: 884
- Поблагодарили: 140
- За сообщение: 1
Re: Определение конца строки
False удали
Лучше день потерять — потом за пять минут долететь!
15 Ответ от Penniwise 25.03.2010 17:01:24
- Penniwise
- сержант
- Неактивен
- Зарегистрирован: 04.02.2010
- Сообщений: 23
Re: Определение конца строки
На сообщение от 15.03.2010 20:34:18:
По поводу CurrentDoc.Bookmarks у меня говорит, что Variable not defined.
А как что её определить я не знаю.
16 Ответ от andrkar 25.03.2010 19:01:13
- andrkar
- Модератор
- Неактивен
- Откуда: Томск
- Зарегистрирован: 10.03.2010
- Сообщений: 431
- Поблагодарили: 26
Re: Определение конца строки
Ну конечно будет выдавать.. Нужно еще вот что сделать:
Dim CurrentDoc As Document
Set CurrentDoc = ActiveDocument
17 Ответ от aequit 08.02.2017 10:53:16
- aequit
- сержант
- Неактивен
- Зарегистрирован: 31.03.2015
- Сообщений: 13
Re: Определение конца строки
Вождь пишет:
Модификация под ссылки и т.п.:
Столкнулся с необходимостью поиска и замены в конце строки с использованием Wildcards. Если изменяю код из 9 сообщения на
то макрос выполняется только до первого совпадения и потом завершается. Как заставить его продолжать работу?
И ещё, можно ли ограничить диапазон поиска и замены только выделением, так как
сразу переносит курсор в начало документа и начинается обработка всего текста документа
18 Ответ от Вождь 08.02.2017 12:04:26
- Вождь
- Модератор
- Неактивен
- Зарегистрирован: 07.01.2010
- Сообщений: 745
- Поблагодарили: 181
- За сообщение: 1
Re: Определение конца строки
aequit пишет:
…Если изменяю код из 9 сообщения…то макрос выполняется только до…Как заставить его продолжать работу?…
Откуда ж я знаю, не видя ВАШЕГО кода
Хотя бы ВАШИ значения what и forwhat сообщите.
Макросы под заказ и готовый пакет — mtdmacro.ru
19 Ответ от aequit 08.02.2017 12:48:16
- aequit
- сержант
- Неактивен
- Зарегистрирован: 31.03.2015
- Сообщений: 13
Re: Определение конца строки
Вождь пишет:
aequit пишет:
…Если изменяю код из 9 сообщения…то макрос выполняется только до…Как заставить его продолжать работу?…
Откуда ж я знаю, не видя ВАШЕГО кода
Хотя бы ВАШИ значения what и forwhat сообщите.
Sub test1()
SimpleReplaceAtEndOfLine1 "([Нн]а)( )", "1^s"
End Sub
Sub SimpleReplaceAtEndOfLine1(what, forwhat)
With Selection
.SetRange 0, 0
With .Find
.ClearFormatting
.Text = what
.Replacement.ClearFormatting
.Replacement.Text = forwhat
.Forward = True
.Wrap = wdFindStop
.MatchCase = False
.MatchWildcards = True
Do While .Execute(Replace:=wdReplaceNone)
Dim R As Word.Range
Dim EOL As Boolean
Dim N&
Set R = Selection.Range
N = Selection.EndOf(Unit:=Word.wdLine, Extend:=Word.wdMove)
EOL = Selection.IPAtEndOfLine
R.Select
If (N = 1) And EOL Then
Selection.Collapse Direction:=Word.wdCollapseStart
.Execute Replace:=wdReplaceOne
Else
Selection.Collapse Direction:=Word.wdCollapseEnd
End If
Loop
End With
End With
End Sub
Если «На» или «на» и после пробел стоят в конце строки, нужно пробел заменить на неразрывный пробел…
Доходит до первого совпадения и останавливается
Можно ли ограничить поиск конкретным диапазоном или выделением, чтобы по всему документу не отрабатывал?
20 Ответ от Вождь 08.02.2017 14:38:38
- Вождь
- Модератор
- Неактивен
- Зарегистрирован: 07.01.2010
- Сообщений: 745
- Поблагодарили: 181
- За сообщение: 3
Re: Определение конца строки
Для заданной области и подстановочных знаков, где-то так:
Sub test1()
ActiveDocument.ActiveWindow.View.Type = wdPrintView
'ActiveDocument.Range(0, 0).Select
SimpleReplaceAtEndOfLine1 Selection.Range, "(<[Нн]а)([ ]@<)", "1^s"
End Sub
Sub SimpleReplaceAtEndOfLine1(FindRange As Range, What As String, ForWhat As String)
Dim R As Word.Range
Dim EOL As Boolean
Dim N As Long
Set R = FindRange.Duplicate
R.Collapse Direction:=wdCollapseStart
With R.Find
.ClearFormatting
.Replacement.ClearFormatting
.Forward = True
.Wrap = wdFindStop
.MatchWildcards = True
.Text = What
.Replacement.Text = ForWhat
End With
Do While R.End < R.StoryLength - 1
R.Collapse Direction:=wdCollapseEnd
R.Find.Execute Replace:=wdReplaceNone
If R.Find.Found <> True Then Exit Do
If FindRange.Start < FindRange.End Then
If R.InRange(FindRange) <> True Then Exit Do
End If
' обработка
R.Select
N = Selection.EndOf(Unit:=Word.wdLine, Extend:=Word.wdMove)
EOL = Selection.IPAtEndOfLine
If (N = 1) And EOL Then
R.Collapse Direction:=wdCollapseStart
R.Find.Execute Replace:=wdReplaceOne
End If
Loop
End Sub
Учтите, что после вставки неразрывного, ваше НА перескочит на следующую строку. Значит, концом строки может стать другое «НА», что стояло перед этим НА. НАдеюсь понятно
Макросы под заказ и готовый пакет — mtdmacro.ru
21 Ответ от aequit 08.02.2017 15:54:57
- aequit
- сержант
- Неактивен
- Зарегистрирован: 31.03.2015
- Сообщений: 13
Re: Определение конца строки
Вот теперь работает с Wildcards и только вы нужном месте, не лезет по всему документу, спасибо!
22 Ответ от Forthwalker 21.01.2020 15:54:11
- Forthwalker
- рядовой
- Неактивен
- Зарегистрирован: 21.01.2020
- Сообщений: 3
Re: Определение конца строки
Вождь, спасибо большое!
Немножко переработал Ваш код, дополнив его справочником предлогов (в массиве arrWhat, однобуквенные слова там же, в конце) трёхкратным прогоном макроса и проверкой на выделение (останавливает, если обрабатываемый текст не выделен). Надеюсь пригодится народу.
Я — дилетант, потому код не эталонный, возможна критика за неэффективные или некрасивые решения.
Sub PerenosPredlogov() ActiveDocument.ActiveWindow.View.Type = wdPrintView 'ActiveDocument.Range(0, 0).Select SimpleReplaceAtEndOfLine1 Selection.Range, "", "1^s"
End Sub
Sub SimpleReplaceAtEndOfLine1(FindRange As Range, What As String, ForWhat As String)
If FindRange.Duplicate = "" Then
MsgBox "Выделите текст!", vbInformation, "Обработка невозможна!"
Exit Sub
End If
Dim R As Word.Range
Dim EOL As Boolean
Dim N As Long
Dim arrWhat
arrWhat = Array("(<[Нн]а)", "(<[Ии]ли)", "(<[Вв]о)", "(<[Вв]иду)", "(<[Вв]опреки)", "(<[Вв]след)", "(<[Вв]следствие)", "(<[Дд]ля)", "(<[Дд]о)", "(<[Ии]з)", "(<[Ии]з-за)", "(<[Зз]а)", "(<[Ии]сключая)", "(<[Кк]о)", "(<[Кк]роме)", "(<[Нн]а)", "(<[Мм]ежду)", "(<[Нн]ад)", "(<[Нн]е)", "(<[Оо]б)", "(<[Оо]бо)", "(<[Оо]коло)", "(<[Оо]т)", "(<[Пп]еред)", "(<[Пп]о)", "(<[Пп]од)", "(<[Пп]ред)", "(<[Пп]ри)", "(<[Пп]ро)", "(<[Пп]ротив)", "(<[Пп]ри)", "(<[а-яА-Яa-zA-Z]{1})")
Dim i As Integer
i = 1
For i = 1 To 3
For Each mark In arrWhat
Set R = FindRange.Duplicate
R.Collapse Direction:=wdCollapseStart
With R.Find
.ClearFormatting
.Replacement.ClearFormatting
.Forward = True
.Wrap = wdFindStop
.MatchWildcards = True
.Text = mark & "([ ]@<)"
.Replacement.Text = ForWhat
End With
Do While R.End < R.StoryLength - 1
R.Collapse Direction:=wdCollapseEnd
R.Find.Execute Replace:=wdReplaceNone
If R.Find.Found <> True Then Exit Do
If FindRange.Start < FindRange.End Then
If R.InRange(FindRange) <> True Then Exit Do
End If
' обработка
R.Select
N = Selection.EndOf(Unit:=Word.wdLine, Extend:=Word.wdMove)
EOL = Selection.IPAtEndOfLine
If (N = 1) And EOL Then
R.Collapse Direction:=wdCollapseStart
R.Find.Execute Replace:=wdReplaceOne
End If
Loop
Next
i = i + 1
Next
End Sub
23 Ответ от Forthwalker 21.01.2020 16:13:17
- Forthwalker
- рядовой
- Неактивен
- Зарегистрирован: 21.01.2020
- Сообщений: 3
Re: Определение конца строки
Может прошлое сообщение отправилось на модерацию, а я этого не понял (тогда прошу простить), потому повторю.
Немножко переделал код Вождя. Добавлен справочник предлогов + однобуквенные слова (массив arrWhat), трёхкратный прогон всего кода. Не профессионал, делал под свои нужды, надеюсь пригодится
Sub PerenosPredlogov()
ActiveDocument.ActiveWindow.View.Type = wdPrintView
'ActiveDocument.Range(0, 0).Select
SimpleReplaceAtEndOfLine1 Selection.Range, "", "1^s"
End Sub
Sub SimpleReplaceAtEndOfLine1(FindRange As Range, What As String, ForWhat As String)
If FindRange.Duplicate = "" Then
MsgBox "Выделите текст!", vbInformation, "Обработка невозможна!"
Exit Sub
End If
Dim R As Word.Range
Dim EOL As Boolean
Dim N As Long
Dim arrWhat
arrWhat = Array("(<[Нн]а)", "(<[Ии]ли)", "(<[Вв]о)", "(<[Вв]иду)", "(<[Вв]опреки)", "(<[Вв]след)", "(<[Вв]следствие)", "(<[Дд]ля)", "(<[Дд]о)", "(<[Ии]з)", "(<[Ии]з-за)", "(<[Зз]а)", "(<[Ии]сключая)", "(<[Кк]о)", "(<[Кк]роме)", "(<[Нн]а)", "(<[Мм]ежду)", "(<[Нн]ад)", "(<[Нн]е)", "(<[Оо]б)", "(<[Оо]бо)", "(<[Оо]коло)", "(<[Оо]т)", "(<[Пп]еред)", "(<[Пп]о)", "(<[Пп]од)", "(<[Пп]ред)", "(<[Пп]ри)", "(<[Пп]ро)", "(<[Пп]ротив)", "(<[Пп]ри)", "(<[а-яА-Яa-zA-Z]{1})")
Dim i As Integer
i = 1
For i = 1 To 3
For Each mark In arrWhat
Set R = FindRange.Duplicate
R.Collapse Direction:=wdCollapseStart
With R.Find
.ClearFormatting
.Replacement.ClearFormatting
.Forward = True
.Wrap = wdFindStop
.MatchWildcards = True
.Text = mark & "([ ]@<)"
.Replacement.Text = ForWhat
End With
Do While R.End < R.StoryLength - 1
R.Collapse Direction:=wdCollapseEnd
R.Find.Execute Replace:=wdReplaceNone
If R.Find.Found <> True Then Exit Do
If FindRange.Start < FindRange.End Then
If R.InRange(FindRange) <> True Then Exit Do
End If
' обработка
R.Select
N = Selection.EndOf(Unit:=Word.wdLine, Extend:=Word.wdMove)
EOL = Selection.IPAtEndOfLine
If (N = 1) And EOL Then
R.Collapse Direction:=wdCollapseStart
R.Find.Execute Replace:=wdReplaceOne
End If
Loop
Next
i = i + 1
Next
End Sub
24 Ответ от Forthwalker 10.02.2020 14:19:29
- Forthwalker
- рядовой
- Неактивен
- Зарегистрирован: 21.01.2020
- Сообщений: 3
Re: Определение конца строки
Переделал код. Теперь словарь на виду (можно редактировать), и код отрабатывает правильно. Добавил подсчёт переносов, отображение прогресса (в статус баре) и финальное сообщение.Советую добавлять код в шаблон Normal, чтобы был доступен во всех документах.
Dim RC As Integer
Sub PerenosPredlogov()
If VBA.Len(Selection.Range.Text) = 0 Then
MsgBox "Выделите текст!", vbInformation, "Обработка невозможна!"
Exit Sub
End If
ActiveDocument.ActiveWindow.View.Type = wdPrintView
Application.ScreenUpdating = False
Dim FRange As Word.Range
Set FRange = Selection.Range
Dim arrWhat
Dim What$, i As Byte, p%, h%, prog%
'список членов предложения для переноса
arrWhat = Array(0, "на", "во", "виду", "вопреки", "вслед", "для", "до", "из", "из-за", "за", "ко", "кроме", "на", "между", _
"над", "не", "об", "обо", "около", "от", "перед", "по", "под", "пред", "при", "про", "против", "со", "то", "да", "даже", _
"едва", "если", "затем", "либо", "когда", "как", "однако", "отчего", "перед", "пока", "после", "потому", "так", "также", "тем", _
"тоже", "тогда", "хотя", "чем", "что", "чтоб", "чтобы", "не", "ни", "это", "или") ', "поскольку", "исключая", "вследствие", "притом", "причем")
'переменные для отображения прогресса
p = 0
h = (UBound(arrWhat) + 1) * 3
prog = 0
RC = 0
Application.StatusBar = "Выполнено: 1 %" & ". Количество переносов: " & RC
i = 1
For i = 1 To 3
For Each mark In arrWhat
If mark <> 0 Then
What = "(<[" & UCase(Left(mark, 1)) & Left(mark, 1) & "]" & Mid(mark, 2) & ")([ ]@<)" 'обработка предлогов для regex
Else
What = "(<[а-яА-Яa-zA-Z]{1})([ ]@<)" 'одиночные символы
End If
SimpleReplaceAtEndOfLine1 FRange, What, "1^s"
'счёт прогресса
p = p + 1
prog = p / h * 100
Application.StatusBar = "Выполнено: " & prog & "%" & ". Количество переносов: " & RC
Next
DoEvents
Next i
MsgBox "Выполнено! " & " Количество переносов: " & RC
Application.ScreenUpdating = True
End Sub
Sub SimpleReplaceAtEndOfLine1(FindRange As Range, What As String, ForWhat As String)
Dim R As Word.Range
Dim EOL As Boolean
Dim N As Long
Set R = FindRange.Duplicate
R.Collapse Direction:=wdCollapseStart
With R.Find
.ClearFormatting
.Replacement.ClearFormatting
.Forward = True
.Wrap = wdFindStop
.MatchWildcards = True
.Text = What
.Replacement.Text = ForWhat
End With
' поиск
Do While R.End < R.StoryLength - 1
R.Collapse Direction:=wdCollapseEnd
R.Find.Execute Replace:=wdReplaceNone
If R.Find.Found <> True Then Exit Do
If FindRange.Start < FindRange.End Then
If R.InRange(FindRange) <> True Then Exit Do
End If
' обработка
R.Select
N = Selection.EndOf(Unit:=Word.wdLine, Extend:=Word.wdMove)
EOL = Selection.IPAtEndOfLine
If (N = 1) And EOL Then
R.Collapse Direction:=wdCollapseStart
R.Find.Execute Replace:=wdReplaceOne
RC = RC + 1
End If
DoEvents
Loop
End Sub
25 Ответ от aequit 21.01.2021 11:33:32
- aequit
- сержант
- Неактивен
- Зарегистрирован: 31.03.2015
- Сообщений: 13
Re: Определение конца строки
Столкнулся с неправильной работой процедуры SimpleReplaceAtEndOfLine1 в случае, если после предлога в конце строки стоит кавычка. Не срабатывает, если, например, в конце строки стоит предлог
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
������ � ������� � Word VBA
������ � ������� � Word VBA
������� Range � Selection �������� ���������� ������� ��� ����������� ����� ��������, ������� �� ������� ��������� � ������� � ������� Word VBA. ��������� �� ���� �������� ����� ��������� � ���������� � �����, �� � ����� ������ ��� ��������� �������� ��� ���������� �������, ������ ��� ������� ���������.
� �������� Range � Selection ���������� ����� ������, �� ���� � ��������� �������� �������. ��� ������� ������������ ����������� ������������������ ��������, ��� �������� �� ������� ��������� ��������� ��������. ��� ������� ����� ����� ����� ������� � �������. ������ ��������� �������� � ������ ��������� ��� ���������� ��������, � ������ — ��� ����������. ������������ �������� ������� � � ���, ��� ������ Selection ������������� ��������� � ������� ����: ������, ������������ ����������� ��� ������ ������� �������, � �� ����� ��� ������� Range ���������� ���������� �� ���������� ������� � ������ �������� �����.
����������� ������ Selection � ��� ������, ���� ���� ��������� ������� �� ������������, ��������, �� ������ ������� �����, � ������� ����� ��������� ������������ ��������, ��� � ��� ������, ���� ��� ���������� �������� ������������, ����� ������ ����� ����� �������. � ������ ��������� ������� ����� �������� ������� Range. ��� ������������ ������� �������� ���������� �������� � ������ ���������� ������������: Word ��������� ���������� ������ ��� ������ ��������� ����������� ���������� �������, � ��� ��������� ��������� ���������� ������ �� �����������. ����� ����, ��������� ���������� �� ���������� �� ���������� ��������, ��������� �������������.
�������� �� �� ��������, ������� Selection � Range ����� ��������� ���� �� �������. ��� ����������� ����������� ����������� ������, ��� ��� ������ ������� �������������� �������� ������ � �����������. � ����������������� �����, ������������ ������ ���������� ���������� ��������� ������������- �������� ���. ����������� ��������� ������� ������.
* ��� ��������� ��������� ������������ ��� ����� Select. ��������, ��� ������� RangeR ������� ����� ��� RangeR. Select.
* ��� ��������� ������� � ���������, ��������������� �� �� ����������, ��� � ���������� �������, ������������ �������� Range.
�������: ���� �����, ����������� � ��������� ������, ���������� ��� ���������, � �� ������ ��������� ��� � ���������� �������, ������ �������� � ���� ��� ���������� Selection . Range . ���������.
Word VBA ���������� ����� ��� ������� ��� ����������� � ��������� �������� ���������� � ���������� ��������. � ��������� ������� � ������������ ������ ����� ������ �� ���; ��� ���������� � ������� �������� ��� �������� ���������� � ���������� �������.
����� Expand ����������� ������������ �������� ��� ���������� �������, �������� ���� ������ � �� �����. ���� ����� ������������ ����� ������, �����, ����� ��� ���-������ ������. �� ������ �������� ������ ���� ������� ������������ ����; ����� ����, ���������� �������� ������ � ������ ��������� ��� ���������� ������� �� �����������.
��� ���������� � ���������� ������� �����, ������� ����� ��������� ����� �� ���, ����������� ����� ����������:
Selection.Expand(wdWord)
�� ������ ������������ ����� �� ��������� �������� ��� ���������� �������; wdCharct er, wdWord, wdSent ence, wdParagraph, wdSection, wdStory, wdCell, wdColumn, wdRow, wdTable � (������ ��� �������� Selection) wdLine. �� ��������� ������������ ��������� wdWord.
������ ��� ������� ������������ �� ����� ���������� �������: ������� Selection (�� �� ���������) ����� �������� ����� Expand. ���� ����� �������� ��������������� �������� Word, ������� ��������� ��������� ���������� ������� ��� ����������� ��������� ����. ������ ���, ����� ��������� �������� ����� Extend, ���������� ������� ������������� �� ���� ������, ������� ������� ����� �� ������ �������: ������� �����, �����������, �����, ���������� �������� ��� ����� ��������. ���� �� ������� �������� � ���� ������ �������, ��������, Selection.Expand ( «�» ). ���������� ������� ����� ��������� ������ �� ������� �������������� ���������� �������.
Word VBA ��������� ��� �������� ���������� ������ � ����� ��������� ��� ���������� �������. ������ ������ � ����, ��� ������, � ����� ������� ������������ ����� Move, �������� ������������ ��������� ��� ���������� �������: ��� �� ���������� �����, ������� ���������� � ��������� �������.
����� Move �������� �������� ��� ���������� �������, ������� � �� ������, ������� �� ������������, � � ��� ��� ��� �������� ������. ������������ ��������� � ������� ��������� �������. ����� ����� ����� Move ���������� «������» ������ � ������������ � ������ ������������. �� ��������� ����������� �� ������ ������������ ������ Expand � Mover,nd ��� ���������� ������� �������.
����������� ���� ������ ���������� ����������� �������� � ��������� �� ��� ������ �����. �������� �������� �� ��, ��� �� ����������� ����������� ��������� � �������� �������� ��������� Uni t (������ ���� ���������� ����������� �������� �������� � �������
«���������� ���������� � ���������� ��������» ������ � ���� �����). �������� Count ������������ ����� ����� ������������� �����, ���� �� ������ ���������� ������ ������ �� ��������� (�.�. � ��� �����), ��� �������������, ���� �� ������ ���������� ������ ����� �� ���������. � ����������� ���� ������� ��������� �� ��������� � ������, ��������� ������������ ������� �������� (���������� ������������ ���������) ����� �� ������������:
oTheRange .Move Unit : = waParagraph, Count, : = -2
������ MoveStart. � MoveEnd �������� ����������� ��� ��, ��� � ����� Move, ������ ��� �������� ��������� ��� �������� ����� ��������� ��� ���������� ������� ��������������. ����������� ���� ���������� ���������� ������ ���������� ������� �� ��� ����� ����� � ����� ���������:
Select-on.KoveStart Unit : = wdWord, Count := 3
�������� �������� �� ��, ��� ���� �� ����������� ��������� ����� ������� � �����, Word ������ �������� ��� ���������� ������� � ���������� �� � ������������ � ���������� ������������.
��� ���� ���� �������, Start Of ��� EndOf, ���������� ��� ��������� ������ ��� ����� ��������� ��� ���������� �������. ����� Start Of ���������� ������ ������� ������� � ������ �������� �����, � �� ����� ��� ����� EndOt ���������� ����� ������� ������ � ����� �������� �����.
�� ������ ������������ �������� Extend � ����� ������� ��� �������� ��� ���������� Word. ���� ������������ ������� ������� ��� ��������� � ���� ����, � �������� �� ��������� �� �����������, ����� �� ����������. ����������� ��������� wdMove ��� �������� ������� ��� ��������� wdExtend ��� ����������� ������ ��������� �������. ���� �������� ��������������� ������:
Selection. Start Of Unit := wdSentence, Extend := wdMove
����� ����� ��� ���������� ����� �������� ��� ���������� ������� � �����, ������� �� �������� �������� ������. � ����������� ����� ������ ��������� �������� ��� ���������� ������� — ��� ����� �������� ��� ���������� �������, ��������� � �������� ����� ������� ���������. ������ �������� �������� ����������� ������ � ��� ���������, ����� ��� ���������� �������� ����, ������� ��� ������ ������� �� ��� ����� ���������� ������� ��� ���������, �������� ��� ������ ������. (�� ������ �������� ������� �����, ����� ������, � ����� ��������� ������ �������� � «��������» �������� ��� ���������� �������).
����������� ����� Collapse ��� ������ ��������� ��� ���������� �������. �� ������ ����� ������ � ��� ��������� ��� �������� �����, ��������� �������������� �������� Direction. ����������� ���� ���������� ������� ���������� ������� � �� ��������� �����:
Selection.Collapse
� ���� ������ ������� ���������� ������� � �� �������� �����:
Selection.Collapse( Direction:=wdCollapseEnd)
���� �� ������� ��������, ������� ������������� ������ ������, � ��� �������� ����� (��������� ��������� wdCollapseEnd), Word ��������� ������ �������� ����� ����� ������ (��� ��������, ��� ������ �������� ����� ���������� � ��������� ������). ���� �� �� ������ ���������� ���-�� ����� ������ ������ ��������� ���������, �� ������ ������� ����������� �������� ������� � ������� ������ MoveEnd, ��������� ����������, �������� ����:
��������.MoveEnd Unit := wdCharacter, Count := -1
������� ���� ����� � ��������� ��� ���������� ������� ������ ��������: ������ ����������� ����� Delete ���������������� �������. �� ������ ������������ � ����� Cut, ���� ������ ������� ����� � ��������� ��� � ����� ������. ������� ��, ����� ���� �������� ����� � ����� ������, �� ������ ������� �� ����� � ��������� ��� ���������� �������.
�� ������ �������� �����, ������ ���������� � ����� ������, � ����� �������� ��� ���������� �������, ���������������� ������� Paste ����� �������. ���� ������ ���������� ��� �� ����, ����������� ����� ������ ������� �������� ����� � �������, ����� ��� �� ��� ��� ���������� ����� ���������� ������� �������� � Word.
���� ������������� ������ ������ ��� �������� ������ �� ������ ����� � ������ ������� ������ ���������, ���� ����� �� ������ ����������� ����� �����������. ������� ������� ������������ �������� Text ��� FormattedText ��������� ��� ���������� �������. ������� ��� �������� ������� ��������� ��� ���������� �������, ���������� �����, ������� �� ������ ��������, � ���. ������ ���������� ������ ���� ���� �� ��� ���, ���� ������������ ����� �� ������ ����� �������� ������������ ����� � �������.
����������� ���� �������� ���� �������� ����� �� ���������� ������� � ������ ��������, ����������� � �������� (�������� �������� ����������� ��������� ������ ����). � ����� ����� ������������ �������� ������ ��� �����; ����� �������������� ��� ���� ��������:
With ActiveDocument.Bookmarks("TheBookmark")
Set RangeY = _
ActiveDocument.Range(Start:=.Start, End=.Start)
End With
RangeY.Text = Selection.Text
��� �������� ������ � ������� � ��� �������������� ������ �������� �������� Text ��������� FormattedText.
���������� ��� ����������� ������� ���������� ������ �������� ������� �������� Text ��������� ��� ���������� ������� ������ ������, ������� �� ������ ��������. ��� ����������������� �� �������, ���������� ����:
Range2.Text = «��, ��! � ���� ����-�� ������ ���!»
������ ���������, ��� ������������� �������� Text �������� � ������ ������ ������������� � �������. �� ��������� ����� (���� ������ �� ������������� �� ������ �������� ������������ �����), ������� ������� ������.
����������� ������ Insert Before ��� Insert After �������� Range ��� Selection ��� ������� ������ � ������������ ����� ���������, �� ���������� ��� ���� ������������ �����. ��� ������ ��������� �������� ����� ����� ��������������� ����� ��� ����� ���������� ������� ��������������. Word �������� ����������� ����� � ���������� ������� ��� ��������.
��� ������������� ������ �� ������� ������������ ���������� �������� �����, ������� �� ������ ��������. ����������� ���� �������� ���� ��������� ����� �����, ���������� ����� Dairy Entry � ������ ���������� ������� (�������� �������� �� ������������� ����� ��������� VBA, ��� vbCr, ��� ���������� ����� ������). ����� ����� � ����� ����������� ����� �����, ������� ���������� � ������� ����. ���� �� �������� ����� ����� �� ���������� ����� ����, �����, ���������� ������� ����, �������� ����� ����� ������ � ���������� �������.
Dim strInsert Text As String
Selection.Insert Before "Dairy Entry" & vbCr
strInsert Text = "Today" & Chr(146) & "s date is"
strInsertText = _
strInsertTex't & Format (Now, "Long date") & ". "
Selection.InsertAfter strInsertText & vbCr
���� ������ ����������, ����� ������� ����������� ����� ����� ��������� ��������� ���������� ������� VBA, ������������ ��������� ��������, � ����� �������� � ��������� VBA. ��������� �������� � �������������� � ��������� ��������� �������� � ������� VBA �������� � ����� 11.
���������� ������ �������� ����� ������ ����� � �������� — �������� ���� ������ (�������������� ���������� vbCr) � ������� �������� Text ��� ������� Insert Before ��� Insert After. ����� Add, ����������� � ���������� Paragraphs, ��������, �� �� ����� ������ � ����������.
����������� ��� � ��� ������, ���� ��� ���������� ���������� ����� ����� � ��������� ��� ���������� �������, � �� � �� ������ ��� �����.
��������� ������� ��������� ��� ���������� ������� — ��� ��� ���� � ��������� �������� ���� ������. ��� ��� �������� ������������� �������� �� ���� ������ ��������� Word � ������������� ��������� �������.
��� �������� |
������������� ������ �… |
Font |
��������������� �������� ������� ������� �������������� ��������, ����� ��� Name, Size � Bold. �� ��������� �������� �� ������ �������� ���������������� ������ � ����� ������ ��������� �������������� �������� Range, �� ��������� � �������� Font, �� ������ �� ��� ������ � ����������� ��������� |
Paragrap |
��������������� �������� ������� ������� �������������� �������, ����� ��� hFormat LeftIndent ��� LineSpacing |
Style |
��� ����� ������� ��� ������, ������������ � ��������� ��� ���������� ������� |
Borders |
������� ������ ������ |
Tabstops |
���� � ������������ ����� ���������. �� ������ �������� ������ � ���� ��������� ������ � ������� �������� Paragraph, � �� ��������������� ����� ��������� ��� ���������� ������� |