Vba word конец текста

word-vba-tutorial-susan
Image: Sai/Adobe Stock

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

WordVBA_A

Image: Susan Harkins/TechRepublic. The VBA procedures will add a bit of content to the beginning and the end of this Word document.

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:

  1. Click the Developer tab.
  2. Choose Macros in the Code group.
  3. In the resulting dialog, choose GoToStart (Figure B).
  4. 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

WordVBA_B

Image: Susan Harkins/TechRepublic. Choose the procedure.

Figure C

WordVBA_C

Image: Susan Harkins/TechRepublic. GoToStart() added a sentence to the beginning of the Word document.

Figure D

WordVBA_D

Image: Susan Harkins/TechRepublic. GoToEnd() added a sentence to the end of the Word document.

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

Вставить текст через

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Sub InsertAfterMethod()
  Dim MyText As String
  Dim MyRange As Object
  Set MyRange = ActiveDocument.Range
  MyText = "<Replace this with your text>"
  ' Selection Example:
  Selection.InsertAfter (MyText)
  ' Range Example:
  ' (Inserts text at the current position of the insertion point.)
  MyRange.Collapse
  MyRange.InsertAfter (MyText)
End Sub

Дату через

Visual Basic
1
2
3
4
5
6
7
8
9
10
Sub InsertDateTimeMethod()
   Dim MyRange As Object
   Set MyRange = Selection.Range
   ' Selection Example:
   Selection.InsertDateTime DateTimeFormat:="MMMM dd, yyyy", _
   InsertAsField:=True
   ' Range Example:
   MyRange.InsertDateTime DateTimeFormat:="MMM dd, yyyy", _
   InsertAsField:=True
End Sub

Можно так?



0



5561 / 1367 / 150

Регистрация: 08.02.2009

Сообщений: 4,107

Записей в блоге: 30

02.07.2014, 20:49

4

Можно, и не только дату:

Миниатюры

Макрос Word: вставить в конец документа строчку с информацией о документе
 



0



Sasha_Smirnov

5561 / 1367 / 150

Регистрация: 08.02.2009

Сообщений: 4,107

Записей в блоге: 30

03.07.2014, 02:43

5

Первую половину (а может, даже и вторую) можно сделать вставкой соответствующих полей:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
Sub InsertWhatYouNeed()
    With Selection
       .EndKey wdStory          'переход в конец документа
       .TypeParagraph           'ввод нового абзаца
       .Fields.Add .Range, Type:=wdFieldFileName    'имя
       .TypeParagraph           'ввод нового абзаца
       .Fields.Add .Range, Type:=wdFieldDate        'дата
       .TypeParagraph           'ввод нового абзаца
       .Fields.Add .Range, Type:=wdFieldTime        'время
    End With
ActiveDocument.Fields.Update    'обновление полей
'Здесь мы ввели поля Word с данными об имени и текущей дате.
End Sub

А для помещения всей этой лабуды внизу страницы Вождь предложил метод Repaginate: Добавление подписи в конце страницы.

Миниатюры

Макрос Word: вставить в конец документа строчку с информацией о документе
 



1



ball

0 / 0 / 0

Регистрация: 29.12.2013

Сообщений: 5

03.07.2014, 18:49

 [ТС]

6

Всем спасибо, вроде получилось! Только вот этот пункт не удается реализовать:по запросу пользователя – запрос о сравнении контрольной суммы с сохраненной.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Sub InsertWhatYouNeed()
    With Selection
       .EndKey wdStory
       .TypeParagraph
       .Fields.Add .Range, Type:=wdFieldFileName
       .TypeParagraph
       .Fields.Add .Range, Type:=wdFieldDate
       .TypeParagraph
       .Fields.Add .Range, Type:=wdFieldTime
        .TypeParagraph
       Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, Text:= _
        "FILESIZE  k ", PreserveFormatting:=True
    End With
ActiveDocument.Fields.Update



0



Sasha_Smirnov

5561 / 1367 / 150

Регистрация: 08.02.2009

Сообщений: 4,107

Записей в блоге: 30

04.07.2014, 02:08

7

П́оля для контрольной суммы* не знаю; а то, что мы уже получили, можно сделать короче:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Sub FieldInsertion()
    Selection.EndKey wdStory          'переход в конец документа
    
    With Selection
       .TypeText vbCr & "Путь к файлу и его имя: "
       
       .Fields.Add .Range, Text:="FileName p"          'путь к файлу и имя
       
       .TypeText vbCr & "Время и дата создания: "
       
       .Fields.Add .Range, Text:="createdate @ H:nn "  'время создания
       .Fields.Add .Range, Text:="createdate @ "", dddd D MMMM yyyy""" 'дата создания
    End With
End Sub

Попробуйте на закуску диалоговые окна Сведения (другой перевод: Свойства) и Статистика:

Visual Basic
1
2
3
4
5
Sub Макрос1()
    Dialogs(wdDialogFileSummaryInfo).Display
'    Stop
    Dialogs(wdDialogDocumentStatistics).Show
End Sub

_______________
* поищите эту сумму в свойствах документа (Word 2003) — на форуме было, но пока не нашёл



1



Доброго времени суток всем подписчикам и читателям блога scriptcoding.ru. В этой статье мы продолжим изучать класс Selection, который показывает, как выделить фрагмент текста в документе Word.

Для начала давайте вспомним, что выделение фрагмента текста осуществляется следующим образом: в большинстве случаев нужно выбрать несколько фрагментов, для этого сначала выбираем один нужный фрагмент, далее удерживаем клавишу «Ctrl« и выбираем остальные фрагменты. Теперь перейдем к теме публикации…

Объект Word Selection содержит довольно много методов, большая часть из которых практически не используется, да и превращать блог в энциклопедию просто нет смысла. Поэтому, я решил разбить описание методов на две статьи, выбрав только те, которые чаще всего используются. В этой первой части я рассмотрю примеры работы с двумя категориями – методы с префиксомInsert и Move. Со второй частью можете ознакомиться в статье «Объект Word Selection — выделение текста, методы #2«.

Содержание

  1. Методы Insert… – выделение фрагментов текста в Word
  2. Методы Insert… – выделение фрагментов текста в Word
  3. Методы Insert… – выделение фрагментов текста в Word
  4. Методы 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 сообщения на

то макрос выполняется только до первого совпадения и потом завершается. Как заставить его продолжать работу?
И ещё, можно ли ограничить диапазон поиска и замены только выделением, так как

сразу переносит курсор в начало документа и начинается обработка всего текста документа sad

18 Ответ от Вождь 08.02.2017 12:04:26

  • Определение конца строки
  • Вождь
  • Модератор
  • Неактивен
  • Зарегистрирован: 07.01.2010
  • Сообщений: 745
  • Поблагодарили: 181
  • За сообщение: 1

Re: Определение конца строки

aequit пишет:

…Если изменяю код из 9 сообщения…то макрос выполняется только до…Как заставить его продолжать работу?…

Откуда ж я знаю, не видя ВАШЕГО кода smile
Хотя бы ВАШИ значения what и forwhat сообщите.

Макросы под заказ и готовый пакет — mtdmacro.ru

19 Ответ от aequit 08.02.2017 12:48:16

  • aequit
  • сержант
  • Неактивен
  • Зарегистрирован: 31.03.2015
  • Сообщений: 13

Re: Определение конца строки

Вождь пишет:

aequit пишет:

…Если изменяю код из 9 сообщения…то макрос выполняется только до…Как заставить его продолжать работу?…

Откуда ж я знаю, не видя ВАШЕГО кода smile
Хотя бы ВАШИ значения 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

Если «На» или «на» и после пробел стоят в конце строки, нужно пробел заменить на неразрывный пробел…
Доходит до первого совпадения и останавливается sad
Можно ли ограничить поиск конкретным диапазоном или выделением, чтобы по всему документу не отрабатывал?

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

Учтите, что после вставки неразрывного, ваше НА перескочит на следующую строку. Значит, концом строки может стать другое «НА», что стояло перед этим НА. НАдеюсь понятно smile

Макросы под заказ и готовый пакет — 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, � �� ��������������� ����� ��������� ��� ���������� �������

Like this post? Please share to your friends:
  • Vba word количество страницам
  • Vba word количество страниц в документе
  • Vba word количество столбцов
  • Vba word количество слов
  • Vba word количество абзацев