0 / 0 / 0 Регистрация: 07.11.2010 Сообщений: 23 |
|
1 |
|
07.11.2010, 16:14. Показов 21243. Ответов 22
Помогите разобраться пожалуйста и написать макрос. Еще хотелось бы, чтобы курсор при выделении оставался всегда в центре экрана как бы в поле зрения, а не сдвигался, убегая вниз. Для наглядности такая фишка есть в программе Far, если кто не понял, что я имею ввиду. В итоге мне нужно, чтобы было 2 макроса по аналогии: Вот пример моей неудачной попытки: Sub Мак1() Точно также интересует создать 2 макроса, но уже для перехода внутри документа по тексту сразу как по абзацам, так и по разрывам строк, как в предыдущем вопросе. Т.е. по аналогии Ctrl+Стрелка вниз(Стрелка вверх).
0 |
Заблокирован |
|
07.11.2010, 16:22 |
2 |
natawka,
0 |
0 / 0 / 0 Регистрация: 07.11.2010 Сообщений: 23 |
|
07.11.2010, 16:36 [ТС] |
3 |
вот фрагмент документа.
0 |
Заблокирован |
||||
07.11.2010, 16:40 |
4 |
|||
natawka,
0 |
0 / 0 / 0 Регистрация: 07.11.2010 Сообщений: 23 |
|
07.11.2010, 17:05 [ТС] |
5 |
Busine2009, Selection.MoveEndUntil Cset:=Chr(11) посзволяет выделять непосредственно до знака разрыв строки «Chr(11)» или же знака абзаца «Chr(13)» а почему надо, чтобы курсор не убегал? Тогда вы не сможете отследить то ли выделено или не то. как раз для этого и надо, потому что выделенный текст будет перед глазами, а не будет мелькать где то внизу какждый раз, когда я буду производить выделение текста дальше и дальше по абзацам и разрывам строк.
0 |
Заблокирован |
|
07.11.2010, 17:10 |
6 |
потому что выделенный текст будет перед глазами, а не будет мелькать где то внизу какждый раз про это не понятно, вставьте скриншот. Т.е. знак абзаца не должен быть выделен? Должен быть выделен текст именно до знака абзаца? Т.е. при нажатии на кнопку текст выделяется до следующего абзаца, затем нажимаем ещё раз — снова выделяется до следующего абзаца, но если в абзаце есть разрыв строки, то выделение будет осуществлено до разрыва строки? Разрывы строк в данном случае (на мой взгляд) не нужны. Нужно их заменить на знаки абзаца. Тогда проблема уйдёт. Когда делаются списки, то разрывы строк не ставят — ставят знаки абзаца.
0 |
0 / 0 / 0 Регистрация: 07.11.2010 Сообщений: 23 |
|
07.11.2010, 18:45 [ТС] |
7 |
про это не понятно, вставьте скриншот. Т.е. знак абзаца не должен быть выделен? Должен быть выделен текст именно до знака абзаца? Т.е. при нажатии на кнопку текст выделяется до следующего абзаца, затем нажимаем ещё раз — снова выделяется до следующего абзаца, но если в абзаце есть разрыв строки, то выделение будет осуществлено до разрыва строки? Варианты 1 и 2 — это то как мне нужно. Текст выделяется до знака абзаца или же знака разрыв строки, при этом текст выделенный только до середины экрана. Невыделенная часть текста остается внизу, я ее могу наблюдать (видеть). Если же мне нужно выделять текст дальше по каким то необходимым причинам, то текст должен двигаться, при этом выделенная часть текста должна быть относительно курсора. На рисунках как видите это середина экрана, потому что курсор мой находился по середине экрана в тексте: В 3 варианте вордовское стандартное выделение текста по абзацам до самого низа экрана, если продолжать выделять текст, то ворд выделяет их в нижней части экрана. Я практически текста не вижу не фига, а если учесть, тот факт что следующий абзац может быть разбит по разрывам строк, и их может оказаться очень много, я в конце концов выделяю лишний текст. Когда такое происходит мне приходится выборочно снимать выделение с текста сначала построчно, затем по словесно. Я слишком много на это трачу времени.: Разрывы строк в данном случае (на мой взгляд) не нужны. Нужно их заменить на знаки абзаца. Тогда проблема уйдёт. Когда делаются списки, то разрывы строк не ставят — ставят знаки абзаца. А вот здесь не Вам решать и даже не мне, где в каком случае разрывы строк нужны, а в каком случае нет. Это зависит не от меня. Я не имею права самостоятельно редактировать (форматировать) текст исполненный в том оригинале, в котором мне его передают. Моя бы воля я бы вообще разрывы строк (как и лишние пустые абзацы, кстати сказать) не использовала, т.к. не вижу в них смысла и до определенного момента даже с ними и не сталкивалась.
0 |
Заблокирован |
|
07.11.2010, 18:55 |
8 |
natawka,
0 |
0 / 0 / 0 Регистрация: 07.11.2010 Сообщений: 23 |
|
07.11.2010, 19:30 [ТС] |
9 |
и выделять нужно именно до самого знака абзаца (разрыва строки), т.е. сам знак абзаца (разрыв строки) не должны быть выделены? А зачем это? В качестве перестраховки, чтобы не захватить лишних символов по ошибке, ведь если все будет хорошо работать, я макрос имею ввиду, то я не буду тратить время на вглядывание того, что мной было выделено. Мне нужно знать наверняка, что если я выделяю какой-либо кусок текста, то диапазон у него должен быть строго от начала курсора и до знака либо chr(11), либо chr(13). Этот макрос я не только для себя хочу сделать имеется и другой контингент людей, который не настолько внимателен к тому, как и что обрабатывает. На этой почве возникает слишком много ошибок, которые допускаются уже в конце самой работы. А за всеми уследить я в последнее время уже не успеваю, именно поэтому мне и пришлось заняться своего рода «автоматизированной оптимизацией» оформления, а в некоторых местах и форматирования текста для моих коллег.
0 |
Заблокирован |
||||
07.11.2010, 20:15 |
10 |
|||
natawka,
0 |
kukuruku310 306 / 187 / 26 Регистрация: 14.02.2010 Сообщений: 540 |
||||
07.11.2010, 20:56 |
11 |
|||
P.S. для текста в таблицах, надо, конечно учитывать еще и знак конца ячейки
0 |
Заблокирован |
||||
07.11.2010, 21:21 |
12 |
|||
Мой вариант, как продвигаться вниз, правда я логики так и не понял (я про «And»), но работает:
0 |
natawka 0 / 0 / 0 Регистрация: 07.11.2010 Сообщений: 23 |
||||
07.11.2010, 21:30 [ТС] |
13 |
|||
natawka,
Спасибо, но не во всех местах это срабатывает, в таблице так не получается, если ячейки объединенные. Дальше выделяет следующую ячейку уже в 1 столбце игнорируя выделения текста всех ячеек во 2 столбце Ну дальше он выделяет как полную строку, но уже захватывает следующую строку. И еще, у меня вопрос, а как сделать тогда наоборот? Т.е. снимать выделение по тому же принципу.
0 |
Заблокирован |
||||
07.11.2010, 21:47 |
14 |
|||
natawka,
Добавлено через 1 минуту
снимать выделение по тому же принципу. т.е. вверх что ли подниматься? Добавлено через 1 минуту
в таблице так не получается а вручную получается так?
0 |
natawka 0 / 0 / 0 Регистрация: 07.11.2010 Сообщений: 23 |
||||||||
07.11.2010, 22:19 [ТС] |
15 |
|||||||
Busine2009, kukuruku310, Здесь есть минусы :
Ребят, если сделать про chr(11) и chr(13) не получается, то фиг с ним, хотя бы так. НО вот как сделать чтобы после таблицы дальше продолжал выделение как ни в чем не бывало???? Добавлено через 16 минут
natawka,
Добавлено через 1 минуту т.е. вверх что ли подниматься? Добавлено через 1 минуту а вручную получается так? Да текст поднимается, здорово, только вопрос, а почему нельзя сделать так чтобы текст поднимался при каждом выделении. Т.е. здесь в макросе получается что сначала он выделяет поочередности все до низа экрана, а потом поднимает вверх. А с каждым разом при выделении так не получается сделать?
0 |
Заблокирован |
||||
07.11.2010, 22:54 |
16 |
|||
в таблице так не получается а вручную получается? Добавлено через 1 минуту
пустые абзацы не выделяет а зачем их выделять? Добавлено через 29 секунд
и в таблице глючит. я в таблице не тестировал. Добавлено через 20 минут
Добавлено через 55 секунд
а почему нельзя сделать так чтобы текст поднимался при каждом выделении я только часа 2 назад узнал о поднятии текста, к тому же справка на английском языке, а я английский не знаю. Добавлено через 2 минуты
НО вот как сделать чтобы после таблицы дальше продолжал выделение как ни в чем не бывало???? т.е. пропустить таблицу и дальше двигаться?
1 |
natawka 0 / 0 / 0 Регистрация: 07.11.2010 Сообщений: 23 |
||||
07.11.2010, 23:00 [ТС] |
17 |
|||
а вручную получается? Добавлено через 1 минуту а зачем их выделять? Добавлено через 29 секунд я в таблице не тестировал. Добавлено через 20 минут
Добавлено через 55 секунд я только часа 2 назад узнал о поднятии текста, к тому же справка на английском языке, а я английский не знаю. Добавлено через 2 минуты т.е. пропустить таблицу и дальше двигаться? О, ура, оно самое, именно это с поднятием экрана мне и нужно было
0 |
306 / 187 / 26 Регистрация: 14.02.2010 Сообщений: 540 |
|
07.11.2010, 23:13 |
18 |
пустые абзацы не выделяет, стопорится и в таблице глючит. чтобы не останавливалось на пустых абзацах напишите вместо «If условие Then» «Do While условие»
0 |
0 / 0 / 0 Регистрация: 07.11.2010 Сообщений: 23 |
|
07.11.2010, 23:27 [ТС] |
19 |
т.е. пропустить таблицу и дальше двигаться? Я имею ввиду чтобы он не стопорился, когда я выделяю текст в таблице, а затем продолжаю дальше выделять уже текст после таблицы. Добавлено через 10 минут
чтобы не останавливалось на пустых абзацах напишите вместо «If условие Then» «Do While условие» Спасибо, приму к сведению.
0 |
Заблокирован |
||||
07.11.2010, 23:34 |
20 |
|||
natawka,
Добавлено через 1 минуту
0 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
07.11.2010, 23:34 |
Помогаю со студенческими работами здесь Выделить красным нежирный текст (MS Word) Есть… Выделить текст между двумя пустыми строками в документе Word
Считать текст из текстового файла, вставить в Word, выделить цветом слова по критерию Задание. С помощью программных средств VBA разработать…
Как выделить текст жирным (не ключевое слово, а простой текст)? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: 20 |
I’ve modified your code sample and this works for me. Since you already declare and assign a Range to BIOCell you can use that throughout your macro to identify the cell contents. There’s no need to use the «Like» test since Range.Find.Execute
returns True if successful, otherwise False. When Find is successful, the Range will change to what has been found (in other words it’s no longer the entire cell).
Trying to replace with a paragraph mark isn’t working as you wish. Since you need to do something that can’t be done with Find/Replace anyway (the bullets) simply add the paragraph mark if Find is successful, put the Range focus at the end of the cell, than apply the Bullets formatting. (Note that there’s no need to use Selection if you have the Range object.)
Sub FindInCellAppendBullets()
Dim BIOCell As Range
Dim found As Boolean
With ActiveDocument
Set BIOCell = .Range(Start:=.Tables(1).Cell(13, 2).Range.Start, _
End:=.Tables(1).Cell(13, 2).Range.End)
BIOCell.Select
End With
With BIOCell.Find
.Text = "as follows: "
found = .Execute
If found Then
BIOCell.InsertParagraphAfter
BIOCell.Collapse wdCollapseEnd
BIOCell.ListFormat.ApplyListTemplateWithLevel ListTemplate:= _
ListGalleries(wdBulletGallery).ListTemplates(1), ContinuePreviousList:= _
False, ApplyTo:=wdListApplyToWholeList, DefaultListBehavior:= _
wdWord10ListBehavior
Else
MsgBox "couldn't find it"
End If
End With
End Sub
If the table cell already has paragraphs of text and you want everything after the Find term to be bulleted, then the code could look like the example that follows.
In this case, a second Range object is used to perform the Find, while BIOCell remains assigned to the entire cell. (Always use the Duplicate
property to make a «copy» of a Range that can be used independently. Range is an anamoly in the Office object models: Range
=Range
makes both Ranges identical — if you change the position of one, the position of the other changes, as well.)
Once Find is successful, the findRange is collapsed to the end of the Find term and moved one paragraph further (to the first paragraph following the found text). The end of the Range is then extended to the end of the cell (end of BIOCell), then moved back a couple of characters so that it doesn’t include the end-of-cell markers. (Otherwise the bullets would be applied to the entire cell instead of up through the last paragraph of the cell.)
Sub FindInCellFormatWithBullets()
Dim BIOCell As Range
Dim findRange As Range
Dim found As Boolean
With ActiveDocument
Set BIOCell = .Range(Start:=.Tables(1).Cell(13, 2).Range.Start, _
End:=.Tables(1).Cell(13, 2).Range.End)
Set findRange = BIOCell.Duplicate
BIOCell.Select
End With
With findRange.Find
.Text = "as follows: "
found = .Execute
If found Then
findRange.MoveStart wdParagraph, 1
findRange.End = BIOCell.End - 2
findRange.ListFormat.ApplyListTemplateWithLevel ListTemplate:= _
ListGalleries(wdBulletGallery).ListTemplates(1), ContinuePreviousList:= _
False, ApplyTo:=wdListApplyToWholeList, DefaultListBehavior:= _
wdWord10ListBehavior
Else
MsgBox "couldn't find it"
End If
End With
End Sub
Доброго времени суток всем подписчикам и читателям блога 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 я рассмотрел в этой статье.
- Объекты
Range и Selection.
Работа с текстом. - Выделенный
текст. - Текстовый
диапазон. - Выделение
текста. - Вырождение
диапазона. - Форматирование
текста. - Поиск
и замена - Коллекция
Tables.
1.Объекты Range и Selection.Работа с текстом.
Работа с текстом осуществляется с помощью ряда объектов.
Весь текст документа можно представить в виде пирамиды, основой которой
являются символы, а вершиной – собственно документ. В иерархическом порядке
объектов VBA документ Word можно представить как:
Символы (Characters) ® Слова (Words) ®
Предложения (Sentences) ® ®Абзацы
(Paragraphs) ®Разделы
(Sections) ®Документ
(Document)
Кроме этих объектов, явно указывающих на тот или иной
элемент документа, в VBA имеется два объекта, которые позволяют работать с
текстом как с целым, без явного структурного разделения: объект Rahge ассоциируется с любым фрагментом документа, а объект Selection – с любым выделенным фрагментом текста. Оба эти
объекта похожи по своему действию, однако они различаются по своим
функциональным возможностям.
2.Выделенный текст.
Объект Selection является одним из
базовых объектов. Это глобальный объект и предварительного объявления для него
не требуется. в целом этот
объект любое выделение в документе, а в случае если выделение вырождено, т.е.
ничего не выделено, то объект описывает текущее положение указателя.
Эта особенность часто используется для получения ссылки на
объект, описывающий текущий элемент документа.
Пример: получить ссылку на объект типа Paragraphs,
являющегося семейством всех выделенных или затронутых выделением абзацев.
Dim e As Paragraphs
Set e = Selection.Paragraphs
MsgBox e.Count
Свойством по умолчанию для объекта типа Selection
является свойство Text, возвращающее выделенный
текст.
Selection.[.Text][=Text]
Для замены текущего выделенного текста используется метод
TypeText.
Selection.TypeText(Text)
Пример: вставляем в документ текст «ХХХ» и начинаем новый
абзац.
With
Selection
.TypeText Text:=«XXX»
.TypeParagraph
End With
Для управления параметрами вставки текста можно использовать
свойство ReplaceSelection.
Selection.ReplaceSelection [=Boolean]
Если true – текущее выделение
замещается, если False – то вставлять перед
выделением.
3.Текстовый диапазон. Объект Range
предназначен для выделения и обработки фрагментов текста. Этот объект является
семейством многих объектов.
Например для выделения
абзаца, в котором сейчас находится указатель достаточно использовать код
Selection.Paragraphs(1).Range.Select
Область текста,
связанная с объектом типа Range, характеризуется
начальными и конечными символами. Для получения информации о них нужно
использовать свойства Start и End.
objrange.Start [=Position]
objrange.End [=Position]
параметр Position (типа Long) позволяет задать индекс символа, с которого должен
начаться или которым должен закончится фрагмент
текста, связанного с данным объектом objRange.
Для получения ссылки на текстовый диапазон можно
использовать метод Range.
ObjDocumet.Range(Start, End)
Параметр Start указывает на индекс
символа, с которого должен начаться диапазон, а параметр End
– на индекс последнего символа. Индексы символов соответствуют их порядковым
номерам в семействе Words, ссылку на которое
возвращает свойство Words объекта Document.
4. Выделение текста.
Формально объект Range связан
только с диапазоном текста. Этот диапазон может быть никак не связан с текущим
положением курсора или выделением. Однако диапазон, связанный с объектом Range, можно выделить в любой момент времени с помощью метода
Select.
ObjRange.Select
Пример: выделить второй абзац текущего документа.
ThisDocument.Paragraphs(2).Range.Select
5.Вырождение диапазона.
Для создания вырожденного диапазона можно использовать метод
Collapse.
objRange.Collapse [(Direction)]
Параметр Direction позволяет задать направление, в котором будет
выполнено вырождение. Если параметр имеет значение wdCollapseStart,
то вырождение выполняется в направлении начала диапазона, т.е. End:=Start. Если параметр имеет значение wdCollapseEnd, то Start:=End
Пример: снятия выделения в документе, курсор помещен в конец
выделеного диапазона.
Selection.Collapse wdCollapseEnd
6.Форматирование текста.
Объект Range чаще используется как
инструмент для форматирования выделенного текстового диапазона. Для этого, кроме
свойства объекта Font объект Range имеет
целый ряд свойств, позволяющих настроить параметры шрифта данного диапазона.
Свойство Bold – позволяет установить параметры
жирного начертания символов.
Если свойство имеет значение True, то начертание жирное , если False–
нежирное. Свойство также может возвращать значение wdUnderfined,
указывающее на смешанное начертание. Для установления стиля начертания можно
использовать следующие значения True,
False или wdToggle,
позволяющие переключить текущее написание шрифта.
objRange.Bold
[=Boolean]
Свойство CombineCharacters
Свойство позволяет сжать все символы выделенного диапазона. Если свойство имеет значение true, то выполняется сжатие.
Свойство FilTextWidth
Свойство позволяет указать ширину(в
текущих единицах измерения, в которых должен быть размещен данный диапазон).
Размер шрифта и ширину межсимвольного пространства Word подбирает автоматически
В приведенном ниже примере показан код, позволяющий уместить
текущее выделение на отрезке документа , ширина
которого эквивалентна пяти сантиметрам.
Selection.Range.FilTextWidth=CentimetersToPoints(5)
Свойство objRange.FormattedText
Свойство возвращает ссылку на объект типа Range ,
который ассоциируется с текстом в пределах данного диапазона objRange,
имеющего специфическое форматирование.
Cвойство
Italic –
позволяет установить параметры курсивного начертания символов.
Свойство ListFormat –
возвращает ссылку на объект типа Listformat, содержащего
нумерованные или маркированные списки, используемые в данном диапазоне.
Свойство ListParagraph
Свойство возвращает ссылку на объект типа ListParagraph,
содержащего нумерованные абзацы, имеющиеся в данном диапазоне.
Свойство Shading – возвращает ссылку на объект типа Shading, позволяющего указать цвет и
формат заливки для данного диапазона.
Свойство Revisions
Свойство возвращает ссылку на объект типа Revisions , который
связан с исправлениями , находящимися в данном диапазоне.
Свойство Showall[=Boolean]
Свойство позволяет указать на отображение непечатаемых
символов: табуляций, пробелов, символов абзаца, скрытого текста. True -символы
отображаются.
Свойство Style[=Style]
Свойство позволяет задать стиль для данного абзаца. Параметр
Stile(тип Stile) позволяет указать один
из существующих типов.
Свойство Underline[=Underline]
Свойство позволяет указать , как
должен быть подчеркнут текст в данном диапазоне. Параметр Underline( тип Underline) позволяет указать тип
линии подчеркивания
Метод InsertAfter вставляет
заданный текст в конце диапазона или выделения.
Синтаксис:
objRange.InsertAfter(Text)
Пример:
ActiveDocument.Range.InsertAfter
«пример»
Метод InsertParagraph
позволяет заменить заданный диапазон символов или выделения на новый абзац.
После его использования объект Range отождествляется
с новым абзацем.
Метод InsertSymbol
предназначен для вставки символа в заданное место диапазона или выделения. При
использовании данного метода содержимое диапазона или выделения удаляется. Если
этого не требуется, то перед вызовом этого метода следует использовать метод Collapse.
Синтаксис:
ObjRange.InsertSimbol (CharacterNumber, Font, Unicode)
Параметр CharacterNumber
определяет код символа. Параметр Font
определяет имя шрифта, используемого в качестве источника символов. Параметр Unicode если значение True,
то вставляется юникодовый символ, заданный аргументом
CharacterNumbe. В противном случае (по умолчанию False) будет вставлен символ ANSI, заданный аргументом CharacterNumbe.
Пример:
Selection.Collapse direction:=wdCollapseStart
Selection.InsertSymbol characterNumber:=171, Font:=»Symbol», unicode:=False «
Метод Paste позволяет
вставить содержимое буфера обмена в заданный диапазон или выделение. При его
использовании содержимое диапазона или выделения заменяется содержимым буфера
обмена. В случае если требуется вставить абзац из буфера обмена без замены
текущего абзаца, перед вызовом этого метода следует использовать метод Collapse.
7.Поиск и замена
Поиск и замена- это
стандартные инструменты любого приложенияMicrosoft Office .Как правило, команды
вызова соответствующих диалоговых окон располагаются в меню Правка(Edit). Инструменты поиска и
замены в VBAреализуются
с помощью объектов Find и Replacement.
Задачи по поиску и замене требуют своей реализации в VBA в
редких случаях, например при частом поиске и замене одного и того же сочетания , вложенном поиске или при контекстном поиске.
Стандартный инструмент поиска и замены работает следующим образом
: вы открываете окно диалога Поиск и замена(Find and Replace) , вводите в соответствующие поля необходимые значения , определяете дополнительные параметры поиска и нажимаете
кнопку Поиск(Find) или
Заменить(RepleceОднако
при частом поиске или замене одних и тех же значений для этой операции удобно
назначить кнопку на панели инструментов , комбинацию клавиш или разместить ее в
контекстном меню. Для реализации этой задачи нужно сначала создать
соответствующий макрос.
Для упрощения (ускорения) создания соответствующего
программного кода можно автоматизировать процесс написания макроса.
- Подготовить
документ к поиску - Выбрать
команду Сервис +Макрос +Начать запись - В
поле Имя макроса введите имя макроса , в поле
Описание добавьте описание макроса - Нажмите
кнопку Ok – откроется панель инструментов Остановит запись , содержащая кнопки управления записью макроса:
Остановить запись и Пауза. - Выберите
команду Правка +Найти
Укажите необходимые параметры
поиска и нажмите кнопку Найти
На панели инструментов Остановить запись нажмите кнопку Остановить
запись
Откройте окно редактирования Visual Basic for Application и
перейдите к записанному макросу.
Выполните ручное редактирование
макроса
В приведенном ниже примере
показан код, позволяющий заменить четыре идущих подряд символов пробела одним
символом табуляции
Пример:
Sub ReplaceSpace4()
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text=space(4)
.Replacement.text=”^t”
.forward=true
.Wrap=WdfindWrap.wdfindall
End With
Selection.Find.Execute Replace:=wdReplaceall
End Sub
В ситуации ,
когда нужно найти фрагмент документа , а в нем еще один фрагмент – задача
становится неоднозначной. В этом случае можно создать два макроса , один из которых будет вызываться и другого.
В приведенном ниже примере
реализован одкратно вложенный поиск и замена , однако число вложений может быть и больше.
Переменная strText(тип string) содержит текст, вкотром осуществляется поиск .
Если заданный текст будет найден (метод Execute возвращает True), то осуществляется вызов процедуры
ReplaceSpace4,
показанной в предыдущем примере .
Пример:
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text= strText
If .Execute Then ReplaceSpace4
End With
8.Коллекция Tables.
Таблица представляет собой
упорядоченную структуру, предназначенную для хранения организованных в виде
строк и столбцов наборов данных. Элемент таблицы, находящийся на пересечении
строки и столбца, называется ячейкой.
Таблица Word
имеет такую же структуру, как и электронная таблица Excel
– элемент таблицы, находящийся на пересечении строки и столбца, называется
ячейкой и идентифицируется по имени столбца и номеру строки.
В VBA для доступа к таблицам
используется объект Tables, являющийся семейством
объектов Table, каждый из которых связан с конкретной
таблицей. Для получения ссылки на семейство Tables
можно использовать свойство Tables объекта Document.
Общее число таблиц, имеющихся в
документе, содержится в свойстве Count. Для
получения доступа к конкретной таблице можно использовать метод Item, который является методом по
умолчанию.
Синтаксис:
Set oblTable=objDocument.Tables.Item(Key)
Параметр Key,
является уникальным идентификатором каждой таблицы, хранящейся в объекте Tables.
Для создания новой таблицы
используется метод Add объекта Tables. Этот метод возвращает ссылку на созданную таблицу(Table).
objTables.Add
(Range, NumRows, NumColums)
Параметр Range
позволяет указать область документа, куда будет вставлена таблица. Если
параметр не пустой, т.е. имеется выделенная область, то она будет заменена
вставляемой таблицей.
Параметры NumRows,
NumColums позволяют указать на число строк и
столбцов таблицы.
Пример: создадим таблицу в выделенном
месте или там где стоит курсор.
Set instable = ActiveDocument.Tables.Add(Selection.Range, 4, 10)
Sub макрос()
‘ Макрос ищет в основном тексте (в колонтитулах и другом не ищет).
Dim phrases, sbornik()
Dim pars As Collection, ub2 As Long
Dim counter As Long, max As Long
Dim i As Long, j As Long
‘1. Юзер указывает, какие фразы надо искать.
phrases = InputBox(«Введите искомые фразы через запятую:»)
‘ Если юзер щёлкнул «Cancel».
If phrases = «» Then
Exit Sub
End If
‘2. Откл. монитора (может это ускорит макрос и чтобы не мерцало).
Application.ScreenUpdating = False
‘3. Разбивка введённого текста на части по запятой.
phrases = Split(phrases, «,»)
‘4. Создание ячеек в массиве «sbornik». В нём создаётся столько строк,
‘ сколько абзацев. И столько столбцов, сколько искомых фраз.
‘ То есть в массиве для каждого абзаца будет своя строка.
ReDim sbornik(1 To ActiveDocument.Paragraphs.Count, 1 To UBound(phrases) + 1)
‘5. Поиск.
For i = 0 To UBound(phrases)
find phrases(i), sbornik(), i + 1
Next i
‘6. Определение, в каком абзаце находится больше всего разных искомых слов.
‘1) Определение, сколько максимально было найдено в одном любом абзаце.
ub2 = UBound(sbornik, 2)
For i = 1 To UBound(sbornik, 1)
counter = 0
For j = 1 To ub2
If sbornik(i, j) = True Then
counter = counter + 1
End If
Next j
sbornik(i, 1) = counter
If counter > max Then
max = counter
End If
Next i
‘2) Если вообще не было найдено искомых фраз.
If max = 0 Then
Application.ScreenUpdating = True
MsgBox «Искомые фразы не найдены.», vbExclamation
Exit Sub
End If
‘3) Определение, в каком абзаце находится больше всего разных искомых слов.
Set pars = New Collection
For i = 1 To UBound(sbornik, 1)
If sbornik(i, 1) = max Then
pars.Add Item:=i
End If
Next i
‘4) Закраска абзацев с максимальным кол-вом.
For i = 1 To pars.Count
ActiveDocument.Paragraphs(pars(i)).Shading.BackgroundPatternColor = -654246042
Next i
‘7. Вкл. монитора.
Application.ScreenUpdating = True
‘8. Сообщение.
MsgBox «Готово.», vbInformation
End Sub
Private Sub find(phrase, sbornik(), PhraseIndex As Long)
Dim find_rng As Range, find As find
Dim index As Long
‘1. Создание объектов, которые будут искать.
Set find_rng = ActiveDocument.Range(0, 0)
Set find = find_rng.find
‘2. Настройка поиска.
find.Text = phrase
find.Wrap = wdFindStop
‘3. Поиск.
Do While find.Execute = True
‘1) Закраска найденной фразы.
find_rng.Font.ColorIndex = wdRed
‘2) Запись порядкового номера абзаца в переменную «index».
‘ В ворде нет готового инструмента для определения порядкового номера абзаца,
‘ поэтому используется обходной способ — подсчёт кол-ва абзацев от
‘ начала файла до заданного фрагмента. В нашем случае до найденного фрагмента,
‘ включая сам найденный фрагмент.
index = ActiveDocument.Range(0, find_rng.End).Paragraphs.Count
‘3) Запись в массив «sbornik» в соответствующую строку и столбец слова «True».
sbornik(index, PhraseIndex) = True
Loop
End Sub
[свернуть]