Vba word переместить курсор

Студворк — интернет-сервис помощи студентам

Пишу макрос, который будет шерстить текстовый документ и из разных мест вытаскивать нужные данные (текстовые). При этом положение данных заранее неизвестно. Для данной процедуры решил использовать функцию InStr, но для её работы надо знать номер строки, из которой будем брать данные. Функцию для поиска номера строки я нашёл на этом форуме:

Visual Basic
1
ActiveDocument.Range(ActiveDocument.Range.start, Selection.start).ComputeStatistics(wdStatisticLines)

Данная функция определяет номер строки, на которой стоит курсор.
Теперь вопрос — как поставить курсор в нужное мне место (например, заголовок)?

Или же нужные сведения можно каким-то другим способом вытащить?

Добавлено через 2 часа 57 минут
Основной вопрос снят. Код следующий:

Visual Basic
1
2
3
4
5
6
7
8
9
Selection.Find.ClearFormatting
  With Selection.Find
    .text = "искомый текст"
    .Replacement.text = ""
    .Forward = True
    .Wrap = wdFindContinue
  End With
  Selection.Find.Execute
  Selection.MoveLeft Unit:=wdCharacter, Count:=1

Попробовал сделать следующим образом, чтобы текст в искомой строке заменялся на дату (например):

Visual Basic
1
2
myline = ActiveDocument.Range(ActiveDocument.Range.start, Selection.start).ComputeStatistics(wdStatisticLines) + 1
ActiveDocument.Paragraphs(myline).Range.text = Date & vbCr

+1 добавлены, так как та функция ведет счет с 0. Также нашёл косяк в работе этой функции:

Visual Basic
1
ActiveDocument.Range(ActiveDocument.Range.start, Selection.start).ComputeStatistics(wdStatisticLines)

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

Есть ли какой-то способ применить функцию InStr к строке, на которой стоит курсор?

Добавлено через 23 часа 46 минут
короче, спасибо всем большое за помощь! Если бы не вы, я бы реально не знал, что делать.

решил проблему выделением строки, на которой стоит курсор, и добавлением её через буфер обмена в переменную

Visual Basic
1
2
3
4
Selection.EndKey Unit:=wdLine, Extend:=wdExtend
 Selection.Copy
 MyData.GetFromClipboard
 stroka = MyData.GetText

а дальше уже работаю тупо с переменной.
Всем спасибо, все свободны.

12345qwesdfasdf22232 & 021930

Like the string above, I want to move the cursor to the position after the character & by searching the character in the string. How can I achieve it when I using visual basic to control the word?

Option Explicit

Dim WordApp As Word.Application   

Private Sub Command2_Click()
    Set WordApp = New Word.Application

    WordApp.Documents.Open CommonDialog1.FileName     
    WordApp.Visible = True 
    WordApp.DisplayAlerts = False
    ...
End Sub

GSerg's user avatar

GSerg

75.3k17 gold badges160 silver badges340 bronze badges

asked Apr 20, 2016 at 8:11

vern's user avatar

1

If you are outputting using Selection.TypeText, you can use

Selection.MoveStartUntil "&", wdBackward
Selection.MoveLeft 1

which will move you backwards until the first occurrence of the ampersand.

You can also do as Cindy Meister mentioned, do a Selection.Find similar to…

With Selection.Find
    .MatchWildCards = false
    .Text = "&"
    .Execute
End With

answered Apr 21, 2016 at 18:07

interesting-name-here's user avatar

Автор Nanobot, 27 февраля 2018, 17:00

Добрый день! Подскажите пожалуйста, как с помощью VBA переместить курсор после определенного слова. Пробовал делать так, но ничего не выходит:

ActiveDocument.Content.MoveEndUntil Cset:=»Слово», Count:=wdForward



Администратор

  • Administrator
  • Сообщения: 2,252
  • Записан

Замечания по вашему коду.

Замечание 1

Здесь:
ActiveDocument.Content.MoveEndUntil Cset:=»Слово», Count:=wdForward

Cset — это один или несколько символов, которые не имеют между собой никакой связи.
Метод «MoveEndUntil» делает так, используя параметр «Cset». Метод «MoveEndUntil» берёт символ, который находится справа от конца и смотрит, есть ли этот символ в параметре «Cset». То есть смотрит не всё слово в параметре «Cset», а каждый символ отдельно. Если справа есть буква «С», то остановка. Если справа есть символ «л», то остановка и т.д. до последней буквы «о».

Замечание 2

ActiveDocument.Content — это весь текст файла. Вы хотите двигать конец файла вперёд (Count:=wdForward), но двигать некуда: уже упёрлись в конец.



Администратор

  • Administrator
  • Сообщения: 2,252
  • Записан

Вот так можно поставить курсор после заданного слова:

Sub макрос()

    With ActiveDocument.Range.find
        .Text = «Слово»
        If .Execute = True Then
            .Parent.Collapse Direction:=wdCollapseEnd
            .Parent.Select
        End If
    End With

End Sub


Спасибо большое! Все работает!


  • Форум по VBA, Excel и Word

  • Word

  • Макросы в Word

  • Word VBA: Установка курсора после искомого слова с помощью макроса

  • Remove From My Forums
  • Вопрос

  • Hello and thanks for your help.

    I am writing a procedure that enters the time on a line in a task diary.  I want to leave the cursor at the end of the line for the user to enter the task.  Here is the code, with my two feeble attempts to move the cursor as comments:

    Public Sub subNewTask()
        Dim dteNewTime As Date
        Dim strNewTime As String

        dteNewTime = Time
        strNewTime = Format(dteNewTime, «hh:mm:ss») + » «
        ActiveDocument.Content.InsertAfter Text:=strNewTime
        ActiveDocument.Paragraphs.Last.Range.Font.ColorIndex = wdBlack
        ‘Selection.Collapse Direction:=wdCollapsEnd
        ‘ActiveDocument.Paragraphs.Last.Range.GoTo What:=wdGoToLine, Which:=wdGoToLast
    End Sub

    Please show me how to move the cursor to the end of the line.

    Thanks a million

Доброго времени суток всем подписчикам и читателям блога 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 я рассмотрел в этой статье.

Понравилась статья? Поделить с друзьями:
  • Vba word номер абзаца
  • Vba word нет календаря
  • Vba word неразрывный пробел
  • Vba word найти таблицу с текстом
  • Vba word найти строку