Word selection find
VBA: cоздание первой программы
В первой части статьи мы приступили к работе по исследованию языка Visual Basic for Applications, записали первую макрокоманду и начали изучение ее текста, а здесь оно будет продолжено.
Для выравнивания абзацев по ширине при записи макроса была вызвана функция замены Word. Ее вызов и был записан на языке VBA. Строка Selection.Find.ClearFormatting, видимо, предназначена для снятия параметров форматирования в окне замены — эквивалент нажатию кнопки «Снять форматирование», а строки Selection.Find. ParagraphFormat.Alignment = wdAlignParagraphLeft и Selection. Find.Replacement.ParagraphFormat. Alignment = wdAlignParagraphJustify определены для установки параметров того, что надо искать (выравнивание Left, т. е. «По левому краю»), и того, на что следует заменить (выравнивание Justify, т. е. «По ширине»). Команды впрямую соответствуют переводу слов с английского языка на русский: Selection — выделение, Find.Replacement — найти и заменить, ParagraphFormat — формат абзаца, Alignment — выравнивание, AlignParagraphJustify — равнять абзац по ширине. С оператором With мы уже знакомы, поэтому в следующем фрагменте речь пойдет об окне «Найти и заменить».
Легко догадаться, что параметры объекта Selection.Find (т. е. поиск по всему тексту или по его выделенной части) соответствуют параметрам окна «Найти и заменить»: .MatchWholeWord — искать целое слово; .MatchCase — учитывать регистр; .Text — заменяемый текст, а .Replacement.Text — сообщить, на что заменить. В рассматриваемом примере заменяется не текст, а форматирование, поэтому строки с этими параметрами заполнять не нужно.
Заметив в первых четырех строках повторение слов Selection.Find, можно счесть, что и их содержимое допускается включить в блок оператора With. Проверим, так ли это. Ниже последнего записанного макроса введем строку Sub experience1() — имя после Sub может быть любым, важно лишь, чтобы оно не совпадало с какой-либо командой VBA. Нажмем «Ввод» — через две строки редактор VBA поставит End Sub. С помощью команд «Копировать» и «Вставить» скопируем из нашей программы в текст нового макроса блок With Selection.Find, а затем переместим все строки, отражающие в макросе «работу» окна «Найти и заменить», в блок With Selection.Find, убрав при этом слова Selection.Find.
Теперь испытаем программу: откроем из общего набора еще один документ и, нажав клавишу , запустим новый макрос (курсор должен стоять внутри текста запускаемого макроса). Замена произошла так, как требуется, значит, можно сокращать текст программы описанным выше способом.
Раскроем значение еще нескольких интересных строк, смысл которых может вызвать вопросы: .Forward = True, .Wrap = wdFindContinue, .Execute Replace:=wdReplaceAll. В первой строке указывается направление поиска — вперед или назад (в последнем случае стояло бы значение False). Но что же скрывает вторая? Чтобы выяснить это, напишем еще один макрос с такой же заменой выравнивания, но с разными параметрами направления поиска (табл. 1).
Вполне очевидно, что наличие или отсутствие согласия на продолжение поиска не влияет на записываемый текст. Тогда как же отказаться от запроса на продолжение? Откроем текст макроса и поставим еще один знак «=» после команды .Wrap.
Теперь все ясно: чтобы отказаться от замены в конце документа, нужно обозначить параметр .Wrap как wdFindStop (табл. 2).
Осталось разобраться со строкой .Execute Replace:=wdReplace All. Поскольку слово Execute переводится как «исполнить», оно должно означать команду запуска поиска. Обратимся к справочной системе.
Из четырех предложенных ссылок — Dialog, Find, KeyBinding, MailMerge — нас интересует Find, поскольку мы работаем именно с этим объектом.
Так и есть, Execute запускает команду поиска и замены на выполнение: Runs the specified find operation. Returns True if the find operation is successful. Из текста справки выясняется, что все параметры поиска и замены можно задать также в скобках, а кроме того, записать в переменную результат выполнения команды — успешно ли прошел поиск (т. е. были ли найдены в данном сеансе работы команды «Найти и заменить» искомые элементы). В данном случае этого не требуется, однако запомнить ее все же стоит.
Продолжим изучение записанной макрокоманды.
Вопросов не вызывает — это команда сохранения активного документа.
А вот здесь уже потребуется редактирование. Это команда «Сохранить как. » — поскольку соответствующая опция Word задается в диалоговом окне, то в текст макроса помещаются все возможные параметры, как соответствующие установленным по умолчанию, так и нет: AddToRecentFiles — добавлять ли ярлык в папку Recent, EmbedTrueTypeFonts — внедрять ли шрифты TrueType. Наиболее интересны элементы FileName:=?Доклад1.rtf? и FileFormat:=wdFormatRTF — имя сохраняемого активного документа и его формат соответственно. Последний, Rtf, нас устраивает. А вот как быть с именем? Ведь у каждого файла оно должно быть свое, уникальное. Сначала попробуем из текста данной команды просто исключить строку с указанием имени. Создадим еще один модуль, скопируем туда полную команду ActiveDocument.SaveAs со всеми параметрами и удалим строку FileName:=?Доклад1.rtf?. После запуска программы ничего не произошло, однако она все же что-то делала, ведь и жесткий диск работал, и в течение нескольких секунд система была недоступна, да и сообщений об ошибках не появилось. Проверим, что делалось. Откроем в Блокноте или другом текстовом редакторе файл, который сохранялся, — в данном случае это файл «Доклад2.doc», — предварительно выгрузив его из Word.
Так вот в чем дело — файл был сохранен в формате Rtf, но под прежним именем и с расширением .doc. Но нас это не устраивает, поэтому имя пусть останется то же, а вот расширение должно быть .rtf.
А что произойдет, если запустить программу при активном и ни разу не сохранявшемся документе? Проделаем это. Активный документ получит имя Doc1.doc (или Doc2.doc, Doc3.doc — у кого как) и окажется либо в папке, где имело место последнее сохранение вручную какого-либо файла, либо в папке «Мои документы», предназначенной по умолчанию для файлов Word, либо в любой другой заданной вами (путь «по умолчанию» можно посмотреть, выбрав пункты «Сервис?Параметры?Расположение».
Таким образом, если программно сохранять ранее не сохранявшийся документ, не задавая ему имя и место расположения (впрочем, последнее можно указать, включив в пункт FileName полный путь к нему), то активный файл сохранится в папке и с именем по умолчанию (либо там, где был последний раз сохранен вручную какой-нибудь документ).
Но как же быть с нашей программой? Ведь требуется, чтобы все обрабатываемые файлы сохранялись со своими именами и с расширением .rtf. Попробуем получить имя активного документа программно. Создадим еще один макрос, введем в него параметр ActiveDocument, поставим точку и увидим, что среди возможных продолжений команды есть свойство Name.
Проверим работу. Модифицируем экспериментальную процедуру следующим образом.
Word selection find
1.Объекты Range и Selection .Работа с текстом.
Работа с текстом осуществляется с помощью ряда объектов. Весь текст документа можно представить в виде пирамиды, основой которой являются символы, а вершиной – собственно документ. В иерархическом порядке объектов VBA документ Word можно представить как:
Символы ( Characters ) ® Слова ( Words ) ® Предложения ( Sentences ) ® ® Абзацы ( Paragraphs ) ® Разделы ( Sections ) ® Документ ( Document )
Кроме этих объектов, явно указывающих на тот или иной элемент документа, в VBA имеется два объекта, которые позволяют работать с текстом как с целым, без явного структурного разделения: объект Rahge ассоциируется с любым фрагментом документа, а объект Selection – с любым выделенным фрагментом текста. Оба эти объекта похожи по своему действию, однако они различаются по своим функциональным возможностям.
Объект Selection является одним из базовых объектов. Это глобальный объект и предварительного объявления для него не требуется . в целом этот объект любое выделение в документе, а в случае если выделение вырождено, т.е. ничего не выделено, то объект описывает текущее положение указателя.
Эта особенность часто используется для получения ссылки на объект, описывающий текущий элемент документа.
Пример: получить ссылку на объект типа Paragraphs , являющегося семейством всех выделенных или затронутых выделением абзацев.
Dim e As Paragraphs
Set e = Selection.Paragraphs
Свойством по умолчанию для объекта типа Selection является свойство Text , возвращающее выделенный текст.
Selection .[. Text ][ =Text ]
Для замены текущего выделенного текста используется метод TypeText .
Пример: вставляем в документ текст «ХХХ» и начинаем новый абзац.
. TypeText Text := «XXX»
Для управления параметрами вставки текста можно использовать свойство ReplaceSelection .
Если true – текущее выделение замещается, если False – то вставлять перед выделением.
3.Текстовый диапазон. Объект Range предназначен для выделения и обработки фрагментов текста. Этот объект является семейством многих объектов.
Например для выделения абзаца, в котором сейчас находится указатель достаточно использовать код
Область текста, связанная с объектом типа Range , характеризуется начальными и конечными символами. Для получения информации о них нужно использовать свойства Start и End .
параметр Position (типа Long ) позволяет задать индекс символа, с которого должен начаться или которым должен закончится фрагмент текста, связанного с данным объектом objRange .
Для получения ссылки на текстовый диапазон можно использовать метод Range .
ObjDocumet.Range ( Start , End )
Параметр Start указывает на индекс символа, с которого должен начаться диапазон, а параметр End – на индекс последнего символа. Индексы символов соответствуют их порядковым номерам в семействе Words , ссылку на которое возвращает свойство Words объекта Document .
4. Выделение текста.
Формально объект Range связан только с диапазоном текста. Этот диапазон может быть никак не связан с текущим положением курсора или выделением. Однако диапазон, связанный с объектом Range , можно выделить в любой момент времени с помощью метода Select .
Пример: выделить второй абзац текущего документа.
ThisDocument.Paragraphs (2). Range.Select
Для создания вырожденного диапазона можно использовать метод Collapse .
Параметр Direction позволяет задать направление, в котором будет выполнено вырождение. Если параметр имеет значение wdCollapseStart , то вырождение выполняется в направлении начала диапазона, т.е. End:=Start . Если параметр имеет значение wdCollapseEnd , то Start:=End
Пример: снятия выделения в документе, курсор помещен в конец выделеного диапазона.
Объект Range чаще используется как инструмент для форматирования выделенного текстового диапазона. Для этого, кроме свойства объекта Font объект Range имеет целый ряд свойств, позволяющих настроить параметры шрифта данного диапазона.
Свойство Bold – позволяет установить параметры жирного начертания символов.
Если свойство имеет значение True , то начертание жирное , если False – нежирное. Свойство также может возвращать значение wdUnderfined , указывающее на смешанное начертание. Для установления стиля начертания можно использовать следующие значения True , False или wdToggle , позволяющие переключить текущее написание шрифта.
objRange . Bold [= Boolean ]
Свойство позволяет сжать все символы выделенного диапазона. Если свойство имеет значение true , то выполняется сжатие.
Свойство позволяет указать ширин у( в текущих единицах измерения, в которых должен быть размещен данный диапазон). Размер шрифта и ширину межсимвольного пространства Word подбирает автоматически
В приведенном ниже примере показан код, позволяющий уместить текущее выделение на отрезке документа , ширина которого эквивалентна пяти сантиметрам.
Selection.Range.FilTextWidth = CentimetersToPoints ( 5)
Свойство возвращает ссылку на объект типа Range , который ассоциируется с текстом в пределах данного диапазона objRange , имеющего специфическое форматирование.
C войство Italic – позволяет установить параметры курсивного начертания символов.
Свойство ListFormat – возвращает ссылку на объект типа Listformat , содержащего нумерованные или маркированные списки, используемые в данном диапазоне.
Свойство возвращает ссылку на объект типа ListParagraph , содержащего нумерованные абзацы, имеющиеся в данном диапазоне.
Свойство Shading – возвращает ссылку на объект типа Shading , позволяющего указать цвет и формат заливки для данного диапазона.
Свойство возвращает ссылку на объект типа Revisions , который связан с исправлениями , находящимися в данном диапазоне.
Свойство позволяет указать на отображение непечатаемых символов: табуляций, пробелов, символов абзаца, скрытого текста. True -символы отображаются.
Свойство позволяет задать стиль для данного абзаца. Параметр Stile (тип Stile ) позволяет указать один из существующих типов.
Свойство Underline [= Underline ]
Свойство позволяет указать , как должен быть подчеркнут текст в данном диапазоне. Параметр Underline ( тип Underline ) позволяет указать тип линии подчеркивания
Метод 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 и перейдите к записанному макросу.
Выполните ручное редактирование макроса
В приведенном ниже примере показан код, позволяющий заменить четыре идущих подряд символов пробела одним символом табуляции
Selection.Find.Execute Replace := wdReplaceall
В ситуации , когда нужно найти фрагмент документа , а в нем еще один фрагмент – задача становится неоднозначной. В этом случае можно создать два макроса , один из которых будет вызываться и другого.
В приведенном ниже примере реализован одкратно вложенный поиск и замена , однако число вложений может быть и больше.
Переменная strText (тип string ) содержит текст, вкотром осуществляется поиск . Если заданный текст будет найден (метод Execute возвращает True ), то осуществляется вызов процедуры ReplaceSpace 4, показанной в предыдущем примере .
If .Execute Then ReplaceSpace4
Таблица представляет собой упорядоченную структуру, предназначенную для хранения организованных в виде строк и столбцов наборов данных. Элемент таблицы, находящийся на пересечении строки и столбца, называется ячейкой.
Таблица 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 позволяют указать на число строк и столбцов таблицы.
Пример: создадим таблицу в выделенном месте или там где стоит курсор.
Word selection find
Answered by:
Question
I am trying to search for a string in Word Document using C#. My problem is the string I’m trying to find is not a series of characters one after the other. It has a start condition that I need to check and end condition. Anything in between is just read as it is.
eg: I will accept the following string:
(Check note: see section below)
the startwith condition is (Check note:
endwith condition is )
there can be any no of characters in between. it depends on the word doc under consideration.
I’m pasting my code, please let me know what I should do. The code below works well if I have a particular search say just the starting string. But for both matches, I can’t come up with anything.
I have also tried foreach(Word.range rng in doc4.storyranges) but i know this is wrong
object File1 = SourceFile3;
object File2 = TargetFile1;
object objTrue = true ;
object objFalse= false ;
Word. ApplicationClass WordApp = new Microsoft.Office.Interop.Word. ApplicationClass ();
Word. Document doc4 = WordApp.Documents.Open( ref File1, ref objMissing, ref objTrue, ref objMissing,
ref objMissing, ref objMissing, ref objMissing, ref objMissing, ref objMissing, ref objMissing,
ref objMissing, ref objMissing, ref objMissing, ref objMissing, ref objMissing, ref objMissing);
rng.Find.Text = «(Programming Note:» ;
rng.Find.Replacement.Text = «got it» ;
rng.Find.Wrap = Microsoft.Office.Interop.Word. WdFindWrap .wdFindContinue;
rng.Find.Execute( ref objMissing, ref objMissing, ref objMissing,
ref objMissing, ref objMissing, ref objMissing, ref objMissing, ref objMissing,
ref objMissing, ref objMissing, ref objMissing, ref objMissing, ref objMissing,
ref objMissing, ref objMissing);
doc4.SaveAs( ref File2, ref objSaveFormat, ref objMissing, ref objMissing, ref objMissing,
ref objMissing, ref objMissing, ref objMissing, ref objMissing, ref objMissing, ref objMissing,
ref objMissing, ref objMissing, ref objMissing, ref objMissing, ref objMissing);
Answers
Here’s a code snippet that demonstrates using a wildcard search that specifies and beginning and end string, with any number of characters between. For information about the use of special characters, please consult the sources I’ve mentioned previously.
- Marked as answer by Tim Li Friday, March 20, 2009 6:15 AM
- Unmarked as answer by May1006 Friday, March 20, 2009 7:38 PM
- Marked as answer by May1006 Friday, March 20, 2009 7:38 PM
- Unmarked as answer by May1006 Friday, March 20, 2009 7:39 PM
- Marked as answer by Cindy Meister MVP Moderator Tuesday, March 24, 2009 3:09 PM
All replies
Thanks for your reply. But what I’m looking for is something that can be done through a program and without clicking the ctrl+F button. Also by using the Find property from Range, you can set for what words you are looking for is what I think. I want to check only the first few words and last character in one search. Since I need to replace that with an image. I was thinking tht counting the string and then checking occurrence would be an option though it sounds tedious. Anyways let me know if there is something you think easier than this.
Thanks once again
Thanks for your reply. But what I’m looking for is something that can be done through a program and without clicking the ctrl+F button. Also by using the Find property from Range, you can set for what words you are looking for is what I think. I want to check only the first few words and last character in one search. Since I need to replace that with an image. I was thinking tht counting the string and then checking occurrence would be an option though it sounds tedious. Anyways let me know if there is something you think easier than this.
Thanks once again
Thanks again. Could you please give some sample code that I can go through?
Here’s a code snippet that demonstrates using a wildcard search that specifies and beginning and end string, with any number of characters between. For information about the use of special characters, please consult the sources I’ve mentioned previously.
- Marked as answer by Tim Li Friday, March 20, 2009 6:15 AM
- Unmarked as answer by May1006 Friday, March 20, 2009 7:38 PM
- Marked as answer by May1006 Friday, March 20, 2009 7:38 PM
- Unmarked as answer by May1006 Friday, March 20, 2009 7:39 PM
- Marked as answer by Cindy Meister MVP Moderator Tuesday, March 24, 2009 3:09 PM
thanks for the information. I tried the code snippet you suggested but its replacing the part with just (Prg Note even if it doesn’t consist of a closing bracket.
Also it is finding just the first occurrence. Even though the property of find.forward is set true, its not working. Could you suggest me something?
Here is the code I’ve developed.
Word. ApplicationClass WordApp = new Microsoft.Office.Interop.Word. ApplicationClass ();
Word. Document doc4 = WordApp.Documents.Open( ref File1, ref objMissing, ref objTrue, ref objMissing,
ref objMissing, ref objMissing, ref objMissing, ref objMissing, ref objMissing, ref objMissing,
ref objMissing, ref objMissing, ref objMissing, ref objMissing, ref objMissing, ref objMissing);
Word. Range rng = doc4.Content;
object ofindstop = Word. WdFindWrap .wdFindStop;
object oReplace = «got it» ;
rng.Application.Selection.Find.Forward = true ; //even if i keep this n the next 2 lines commented, there is no change
rng.Application.Selection.Find.Wrap = Microsoft.Office.Interop.Word. WdFindWrap .wdFindContinue;
rng.Application.Selection.Find.Execute( ref findtext, ref objTrue, ref objFalse,
ref objTrue, ref objFalse, ref objFalse, ref objTrue, ref ofindstop,
ref objFalse, ref oReplace, ref objMissing, ref objMissing, ref objMissing,
ref objMissing, ref objMissing);
doc4.SaveAs( ref File2, ref objSaveFormat, ref objMissing, ref objMissing, ref objMissing,
ref objMissing, ref objMissing, ref objMissing, ref objMissing, ref objMissing, ref objMissing,
ref objMissing, ref objMissing, ref objMissing, ref objMissing, ref objMissing);
rng.Application.Selection.Find.Execute returns a boolean value,which you could use it to control a While loop to search over again.
Thanks We have published a VSTO FAQ recently, you can view them from the entry thread http://social.msdn.microsoft.com/Forums/en/vsto/thread/31b1ffbf-117b-4e8f-ad38-71614437df59. If you have any feedbacks or suggestions on this FAQ, please feel free to write us emails to colbertz@microsoft.com.
Thank you all for the help.
I’m sorry Cindi to unmark that answer. I wanted some more information. So just to keep it in loop, I thought would be better.
I found the solution to find the 2 searches. But I did that using the indexing method. I did 2 searches and then I’m finally replacing it with a tag. But now my problem is I don’t know how to find multiple occurrences of the search though. When I try to use foreach for any for loop, it doesn’t search for anything. Only the first search is highlighted. In short, the code is of no use. So can anyone help me out with it?
this is why I suggested you test in the Word UI, as an end-user and ask for assitance in the end-user oriented newsgroups. Figuring out the exact wildcard combination required is often a task for a specialist.
Объект Word Selection — выделить весь текст в ворде, свойства
Здравствуйте дорогие читатели блога scriptcoding.ru. Сегодня мы рассмотрим свойства объекта Selection, который позволяет программно выделить весть текст в Ворде.
Помним, что бы вручную выделить весть текст в Ворд , достаточно нажать комбинацию клавиш «Ctr + A«. Мы рассмотрим некоторые свойства объекта Word.Selection. Говорю «некоторые«, так как большинство используются редко, в случае чего – документация MSDN всегда под рукой. И так, сам объект Selection выполняет двойную функцию – с одной стороны он позволяет вставлять фразу в только что созданный документ, с другой стороны – позволяет обрабатывать выделение всего текста в ворде. Описание методов класса Selection можно просмотреть тут и тут.
Свойства класса Word.Selection – выделить весь текст в Ворде
В конце статьи я приведу три примера программного кода – два под Windows Script Host (язык VBScript и JScript) и один под Visual Basic for Application.
И так, сначала давайте познакомимся со свойствами:
Start и End – Если текст уже выделен, то Start и End будут содержать начальную и конечную позиции выделения. Так как они доступны и для записи, то можно задать диапазон для выделения всего текста в ворде.
Flags – Позволяет установить или получить параметры выбора. Flags может быть установлено в одной из следующих констант wdSelectionFlags:
- wdSelActive — 8 — активное выделение.
- wdSelAtEOL — 2 – конец строки.
- wdSelOvertype — 4 – замена символов.
- wdSelReplace — 16 — выбор был заменен.
- wdSelStartActive — 1 — начало активного документа.
Само свойство возвращает сумму констант wdSelectionFlags.
Information (Type) — Получить информацию относительно выделения или заданного диапазона. Только чтение. Параметр Type содержит значения константы wdInformation (я указал только основные значения):
- wdActiveEndAdjustedPageNumber – 1 — Номер страницы.
- wdActiveEndSectionNumber – 2 — Количество разделов.
- wdActiveEndPageNumber – 3 – Номер страницы начиная с начала.
- wdNumberOfPagesInDocument – 4 – Количество страниц в документе
- wdHorizontalPositionRelativeToPage – 5 — Горизонтальная позиция от левого края выделения к левому краю страницы в пунктах.
- wdVerticalPositionRelativeToPage – 6 – Вертикальная позиция от верхнего края выделения к верхнему краю страницы в пунктах.
- wdFirstCharacterColumnNumber – 9- Позиция первого слова в выделении начиная с начала документа.
- wdFirstCharacterLineNumber – 10 – Позиция строки, с которой начинается выделение, начиная с начала.
- wdFrameIsSelected – 11 – TRUE, если выделен весть текст в ворде.
- wdZoomPercentage — 19 – Масштаб в процентах
- wdCapsLock – 21 – TRUE если включен CapsLock.
- wdNumLock — 22 – TRUE если включен NumLock.
- wdRevisionMarking – 24 — Возвращает True, если отслеживание изменений в силу.
Все константы будут содержать значение -1, если информация выходит за пределы допустимой области.
IPAtEndOfLine —True — указатель ввода расположен в конце строки (в крайнем правом положении при выравнивании).
NoProofing — Отменяет (значение TRUE) для выбранного фрагмента проверку орфографии и грамматики.
StoryType – Возвращает тип истории для указанного выбора (только чтение). Константа WdStoryType:
- wdCommentsStory — 4 – Комментарии.
- wdEndnoteContinuationNoticeStory — 17 — Сноска продолжения уведомления.
- wdEndnoteContinuationSeparatorStory — 16 – Сноска продолжения разделителя.
- wdEndnoteSeparatorStory — 15 — Сноска разделитель.
- wdEndnotesStory — 3 – Примечания.
- wdEvenPagesFooterStory — 8 — Четные страницы футера.
- wdEvenPagesHeaderStory — 6 — Четные страницы заголовка.
- wdFirstPageFooterStory — 11 –Первый футер страницы.
- wdFirstPageHeaderStory — 10 – Первый заголовок страницы.
- wdFootnoteContinuationNoticeStory — 14 — Сноска продолжения уведомления.
- wdFootnoteContinuationSeparatorStory — 13 — Сноска продолжения разделителя.
- wdFootnoteSeparatorStory — 12 — Сноска разделитель.
- wdFootnotesStory — 2 – Сноски.
- wdMainTextStory — 1 — Основной текст.
- wdPrimaryFooterStory — 9 — Первичный футер.
- wdPrimaryHeaderStory — 7 — Первичный заголовок.
- wdTextFrameStory — 5 — Текст рамки.
Text – Получить или указать материал, который будет вставлен на месте выделения, или просто там, где расположен курсор. Чтение/Запись
Type – Возвращает тип выделения, константа WdSelectionType:
- wdNoSelection — 0 – Отсутствует.
- wdSelectionBlock — 6 – Блок.
- wdSelectionColumn — 4 – Столбец.
- wdSelectionFrame — 3 – Рамка.
- wdSelectionInlineShape — 7 – Рядовая форма.
- wdSelectionIP — 1 – Пункт.
- wdSelectionNormal — 2 – Нормальный.
- wdSelectionRow — 5 – Строка.
- wdSelectionShape — 8 – Форма.
Начинаем программировать – выделить весь текст в ворде
Ниже, как обещал, привожу примеры кода. По сути, все заключается в создании нового документа, в который сто раз вставляется заданная фраза, далее, мы указываем, что надо выделить весь текст в ворде. Потом происходит выбор фрагмента и вывод значений некоторых свойств.
Поиск текста с заданным начертанием (жирный, курсив и т.д.), выделенного определенным шрифтом. VBA.
Преамбула
Да, мне нравится 2003 MS Word, и на мой взгляд, текстового редактора лучше пока еще никто не написал. Я делал все нижеследующее для себя, но возможно, материал будет полезен изучающим VBA. Особенно если у них возникают вопросы, как найти текст, выделенный жирным, курсивом, или там определенным шрифтом.
Так вот. Написал я в Word’е заметку про какой-нибудь скрипт, красиво оформил, код выделен Курьером, заголовки отцентрованы, важные места выделены жирным, пункты меню указаны курсивом, ну и так далее. Теперь нужно текст переложить в уютненький бложег, да так, чтобы сохранить форматирование вставить куда надо нужные теги.
Встроенное сохранение в формате HTML вставляет много лишних тегов, добавлять нужные теги руками – лишняя работа, а я ленивый. Что же делать? У нас есть VBA, который все сам за нас сделает.
Поиск нужной информации в тексте
VBA умеет обращаться к внутренней функции поиска Office, а функция эта умеет искать текст не только по ключевому слову, шаблону, но и находить текст с определенным форматированием.
Найдем, например, первое вхождение текста, который выделен жирным:
Этот фрагмент кода, будучи вставлен в исполнимый макрос найдет первое вхождение текста выделенного жирным
Найдем текст, выделенный определенным шрифтом, например Courier New
Или текст, который расположен по центру:
Ищем нужное
Нашли, и вроде бы все просто – бери Selecton.Text и присваивай ему значение «открывающий_тег»+Selection.Text+»закрыв ающий_тег» , да не тут-то было. Во-первых, Selection.Find.Execute имеет дурацкое свойство искать не кусок текста от и до, а искать по абзацам, т.е.
Если этот параграф выделен Курьером
И следующий тоже
Find.Excecute выделит нам только первый абзац, для поиска остальных операцию придется повторять в цикле, но и это еще не все. Если мы сразу будем вставлять теги, то получится много лишних. Несмотря на то, что абзацы с одинаковым оформлением пусть даже и идут друг за другом, функция поиска будет рассматривать каждый абзац, как отдельный случай. Посему, все найденные данные стоит сначала собрать в массив(ы):
Но, как я уже говорил, find ищет по абзацам, в результате в наших массивах окажется несколько идущих друг за другом подряд абзацев с одинаковым шрифтом. Конечное значение таких интервалов будет совпадать с началом следующего.
Чтобы не вставлять лишние теги, проанализируем это условие, и сдвинем массив на нужное количество элементов.
Процедура сдвига
Оформим отдельную процедуру, которая будет сдвигать массив на указанное количество элементов с указанного элемента массива:
Удаление лишнего
Теперь, с помощью этой процедуры объединим следующие друг за другом интервалы . Напоминаю условие: конечное значение таких интервалов будет совпадать с началом следующего
Теперь переопределим размерность массивов, обрезав ненужные элементы (для того мы и сохраняли счетчик сдвигов в переменной shiftctr )
Примечание: Функция UBound (массив) возвращает количество его элементов, его размерность.
Все это я объединил в отдельную процедуру, куда передаю только сами теги, а параметры поиска устанавливаю перед ее выполнением.
Вставка тегов
Осталось только вставить теги. Но необходимо помнить, если мы в процессе работы что-нибудь добавим в текст, то нужно будет пересчитать «координаты» следующих символов. Если символы расположены после добавленных, то к их позиции приплюсуется длина добавленного текста.
В переменной TagLen будет содержаться длина открывающего и закрывающего тега, а переменная AllTagLen – накапливать суммарные длины всех вставленных тегов.
Конечно, макрос можно еще долго дорабатывать – например, сделать так, чтоб перед многострочным кодом вставлялись теги pre, для сохранения форматирования, сделать автоматическую вставку тегов a href (брать для них информацию из ссылок, заключенных в квадратные скобки), заменять специальные символы на последовательности HTML, и т.д. Но все это, во-первых, уж совсем специфично, а во-вторых, меня пока и так устраивает. Кое-что не влом и вручную подправить. Но может быть еще вернусь к теме.
Макрос целиком на pastebin