Vba word копирование текста

Обновлено: 01.07.2024

Методы класса Word.Selection – выделение текста в Word

Я приведу по два примера программного кода на языках JScript, VBScript и VBA. Хотя по сути, код под макрос (VBA) и сценарий VBScript особо не отличается. Для тех, кто забыл: для создания макроса в документе Microsoft Office нужно вызвать редактор Visual Basic for Application (комбинация клавиш Alt + F11), далее, добавить в проект новый модуль (макрос).

Методы с префиксом Clear… позволяют очистить выделенный материал от форматирования (абзацы, стили, символы и так далее):

ClearCharacterAllFormatting () - Все форматирование.

ClearCharacterDirectFormatting () - Форматирование знаков.

ClearCharacterStyle () - Форматирование знаков, применяемых через стили.

ClearFormatting () – Все форматирования (параграфы, стили и так далее).

ClearParagraphAllFormatting () - Форматирование абзаца.

ClearParagraphDirectFormatting () - Форматирование абзацев, применяемых вручную.

ClearParagraphStyle () - Форматирование абзацев, применяемых через стили.

Collapse (Direction) – Позволяет убрать выделение текста Word и переместить указатель в начало или конец. VBA Selection. Если параметры отсутствуют, то просто убирается выделение. Параметр Direction содержит значение константы WdCollapseDirection :

  • wdCollapseEnd - 0 – Указатель вконец
  • wdCollapseStart - 1 – Указатель вначале

ConvertToTable (Separator, NumRows, NumColumns, InitialColumnWidth, Format, ApplyBorders, ApplyShading, ApplyFont, ApplyColor, ApplyHeadingRows, ApplyLastRow, ApplyFirstColumn, ApplyLastColumn, AutoFit, AutoFitBehavior, DefaultTableBehavior) – Довольно мощный метод, который позволяет преобразовать выделенный Word текст в таблицу.

Separator - Символ-разделитель, может быть знаком или значением константы WdTableFieldSeparator:

  • wdSeparateByParagraphs - 0 - абзаца.
  • wdSeparateByTabs - 1 - табуляции.
  • wdSeparateByCommas - 2 - запятая.
  • wdSeparateByDefaultListSeparator - 3 - разделитель списка по умолчанию.

NumRows - Количество строк.

NumColumns - Количество столбиков.

InitialColumnWidth - Начальная ширина каждого столбца, в пунктах.

Format – Определяет формат таблицы и содержит значение константы WdTableFormat.

ApplyBorders - TRUE - применять границы.

ApplyShading - TRUE - применить затенение.

ApplyFont - TRUE применять свойства шрифтов.

ApplyColor - TRUE применять цветовые свойства.

ApplyHeadingRows - TRUE - применить свойства заголовок-строка.

ApplyLastRow - TRUE - применить свойства последней строке.

ApplyFirstColumn - TRUE - применить свойства первого столбцов.

ApplyLastColumn - TRUE - применить свойства последнего столбца.

AutoFit - TRUE - уменьшить ширину столбцов таблицы как можно больше.

AutoFitBehavior - Устанавливает правила авто-подбора (если DefaultTableBehavior содержит значение wdWord8TableBehavior, то этот аргумент игнорируется, VBA Selection), содержит значения константы WdAutoFitBehavior:

  • wdAutoFitContent - 1 - автоматически размер
  • wdAutoFitFixed - 0 - фиксированный размер
  • wdAutoFitWindow - 2 - автоматический размер по ширине активного окна

DefaultTableBehavior - Значение, указывающее, следует ли автоматически изменять размер ячеек таблицы по содержимому. Selection VBA. Содержит значение константы WdDefaultTableBehavior:

  • wdWord8TableBehavior - 0 - отключает Авто-подбор (по умолчанию)
  • wdWord9TableBehavior - 1 - включить Авто-подбор

Выделение блока текста в Word, VBA Selection

Хорошо, с теоретической частью мы закончили, теперь можно приступить к программированию.

Примера на языке VBScript – выделение текста в редакторе Word

В данном примере в цикле For (смотрите статью "Урок 6 по VBScript: Циклы for…next и for each…next"), который выполняется шесть раз, происходит вставка перевода на новую строку, вставка текстовой фразы и перемещаем курсов к конец строки. С помощью оператора with мы можем экономить размер программного кода – не нужно лишний раз писать имя класса. Вконце происходит выделение текста Word и преобразование его в таблицу.

Примера на языке JScript – выделение текста в редакторе Word

Логика работы данного программного кода аналогичны предыдущему примеру, тут мы уже использовали цикл for языка JS, читайте в статье "Урок 9 по JScript - оператор цикла for". Тут тоже использовался оператор with, обратите внимание, что имена переменных изменились, а в конце каждой строки кода прописана точка с запятой.

Примера на языке Visual Basic for Application – выделение текста в редакторе Word

Хорошо, давайте продолжим рассматривать методы класса Selection.

выделение текста в редакторе Word, Selection VBA

EndOf () – Перемещает курсор в конец выделения.

StartOf () – Перемещает курсор в начало выделения.

SetRange (start, end) – Позволяет задать начальное и конечное значение для выделения текста Word.

TypeText () – Выполняет ту же функцию, что и свойство Text – ввод информации.

TypeParagraph () - Метод вставляет параграф.

Copy (), Cut (), Paste (), Delete () – Копирует, вырезает, вставляет и удаляет выделенный текст в Word.

CopyAsPicture () – Копирует выбранный материал как изображение.

И так, теперь рассмотрим программный код с данными методами.

По сути, данный программный код практически аналогичен предыдущим. Тут в цикле происходит вставка данных несколько раз, а далее следуют операции выделения текста в документе Word, его копирование и вставка.

Ну и в заключение, привожу программный код для макроса:

Хорошо, на этом можно закончить данную статью. Параллельно, информацию по работе с классом Selection можете рассмотреть еще две публикации, в которых я рассмотрел остальные методы и свойства класса Selection.

Спасибо за внимание. Автор блога Владимир Баталий

Выборка из текста (файл ms word) предложений и копирование в новый файл (ms word) с определенным форматом
Добрый день. Очень нужна помощь в создании макроса. Есть файлы в которых содержатся вопросы и.


Копирование текста в Word
Всем привет, имеется некоторый текст в Word(первый текст). Мне нужно провести над ним некоторые.

Работать в Word, не открывая документы (работа с закрытыми документами Word)
Дайте ссылку, как работать с закрытыми документами Word. У меня есть 5 шаблонов. Я хочу во всех.

"Пусть надо скопировать текст из текущего файла в новый документ,
' с начала первой страницы, до 11 (включительно)".

> Вместо Range:=r пробуйте Range:=rng

Да, глупая ошибка - я корректировал код, чтобы громоздким не был, только основное, не исправил перед отсылкой. Всё равно та же ошибка в том же месте, т.е.:

' ЗДЕСЬ ВЫДАЁТ ОШИБКУ: Run-time error '13' Type mismath
tmpDoc.Content.InsertFile FileName:=SourceFile, Range:=rng, _
ConfirmConversions:=False, Link:=False, Attachment:=False

' "Пусть надо скопировать текст из текущего файла в новый документ,
' с начала первой страницы, до 11 (включительно)".

Dim rng As Range, s1 As Range, s2 As Range
Dim bm As Bookmarks
Dim tmpDoc As Document
Set bm = ActiveDocument.Bookmarks
' Устанавливаю текущее положение - первая страница
Set s1 = Selection.GoTo(What:=wdGoToPage, Which:=wdGoToFirst, Count:=1, Name:="")
' Создаю закладку
bm.Add ("bm1")
' Устанавливаю текущее положение - 12 страница
Set s2 = Selection.GoTo(What:=wdGoToPage, Which:=wdGoToNext, Count:=12, Name:="")
' Создаю закладку
bm.Add ("bm2")
' Выделяю область
Set rng = ActiveDocument.Range(Start:=bm("bm1").Start, End:=bm("bm2").Start - 1)
' Создаю новый документ
Set tmpDoc = Application.Documents.Add '(Visible:=False)
' Вставляю текст
' ЗДЕСЬ ВЫДАЁТ ОШИБКУ: Run-time error '13' Type mismath
tmpDoc.Content.InsertFile FileName:=SourceFile, Range:=rng, _
ConfirmConversions:=False, Link:=False, Attachment:=False
tmpDoc.Close

Вот так можно поместить содержимое определённых страниц из одного документа в другой (в данном случае помещается всё содержимое первой страницы одного документа в другой):
  1. вставленный вручную (Word 2003: Вставка - Разрыв. - новую страницу или новую колонку);
  2. устанавливаемый программой Word (его видно между страницами в режиме просмотра документа Обычный режим).

ActiveWindow - чтобы понять, что это такое, нужно сделать следующее:
Word 2003 - Окно - Новое. В результате на Панели задач Windows (в самом низу монитора) появится ещё одна кнопка документа: т.е. один и тот же документ может быть открыт несколько раз. Зачем это надо? Я этим никогда не пользовался за всё время работы с Word. Могу предположить, зачем это надо, - чтобы просматривать документ в разных местах одновременно: т.е. в одном окне можем смотреть начало документа, а в другом окне - конец документа и сравнивать что-то в них.

Panes - чтобы понять что такое Panes:
Word 2003 - вставьте сноску (Вставка - Ссылка - Сноска. - Вставить). В результате в документ будет вставлена сноска. Далее: Вид - Обычный - Вид - Сноски. В результате внизу появилось что-то - это и есть Pane: т.е. в данной ситуации у нас два Pane: первый Pane - это собственно документ, а второй Pane - это что-то, связанное со сносками.
У документа всегда есть один Pane - это собственно сам документ. И этот Pane имеет порядковый номер всегда 1 (Panes(1)).

Итак строку кода:

можно прочитать так:
Активный документ - Активное окно - первая Pane - первая страница - первый разрыв на странице (кроме разрыва страницы на странице может быть ещё разрыв раздела) - место в документе, занимаемое этим разрывом страницы (или порядковый номер символа, находящегося вначале страницы. Порядковый номер считается сначала документа) - Start - начало разрыва страницы (начало и конец у разрыва страницы равны).

Подскажите, кто знает: как "буквально", как это происходит в Word-е, копируется ЧАСТЬ ДОКУМЕНТА (не только текст) и вставляется в другой документ. Из того что знаю: используется буфер обмена (мне это не мешает, а бы работало автоматически), но я не знаю как им пользоваться программно.

abc,
методы Copy и Paste. Больше ничем нельзя сохранить форматирование текста.

Мне не нравится использовать буфер обмена в программировании: я считаю, должно быть что-нибудь более развитое и цивилизованное.

Чтобы проверить работу кода: в активном документе должно быть как минимум 2 страницы; документ, в который копируем, должен быть открыт и должен называться Документ2 или Документ2.doc.

Спасибо огромное - вроде как работает, сейчас всё переделаю, и выложу код. Я пока искал решение, часто наталкивался на подобную задачу.
Мне самому не нравится не динам. программирование и через разного рода посредников (типа буфера).
Сейчас важно чтобы знакомый это не вручную делал, пусть из-за буфера будет не оптимально, немного дольше, но НА МНОГО быстрее, чем в ручную.

Ещё такой вопрос (раз так пошло):
А если документ основан на другом шаблоне (не Normal.dot), как ещё и форматирование с шаблона прикрепить.

Привет.
Моя программа сохраняет название стилей, а сами настройки стилей берёт из шаблона по умолчанию (Normal.dot) - такой вывод я сделал на основании того, что форматирование осталось, но стало другим (изменились даже параметры страницы).
А если документ основан на другом шаблоне, то всё форматирование будет описанное по шаблону Normal.dot. Вот я и хочу определить на основе какого шаблона был написан документ из которого идёт копирование (или можно указать в новом документе в качестве шаблона исходный документ) и сделать скопированный документ на этом шаблоне.
Или можно как-то при создании документа указать на основании кого документа или шаблона его создавать.

Добавлено через 15 минут
Там при создании нового документа Application.Documents.Add Можно указать шаблон, на сонове которого надо создать документ. Свойство Template:=srcDoc.FullName.
Всё огромное спасибо за помощь. Сейчас исправлю и выложу что получилось.

Добавлено через 31 минуту
В общем задача состояло в том, чтобы разбить один большой документ на несколько, через определённое количество страниц (в документе должно быть больше одной страницы).

Замечание:
1. код работает правильно только как документ полностью загрузится (все страницы).
2. я писал и проверял код только под OFFICE WORD 2003.
3. Мой макрос называется: SplitFile

Последний вопрос (уже не по теме. лень искать). Как можно создать кнопку на панели для моего макроса и упростить его установку.

Я не использовал VB в течение многих лет, поэтому, пожалуйста, простите меня, если это окажется очевидным. Я пытаюсь написать макрос Word vba для использования в шаблоне, который будет отображать пользовательскую форму, а затем импортировать содержимое fileA.docx, fileB.docx или fileC.docx в зависимости от пользовательской формы. (После этого я собираюсь использовать закладки для заполнения некоторых данных формы, не знаю, насколько это актуально). Файлы A, B и C будут содержать текст с некоторым базовым форматированием, таким как списки, но ничего особенного.

Решения, которые я видел в Интернете, могут копировать содержимое файла в новый файл, но в идеале я хотел бы импортировать весь один из этих файлов в новый, в настоящее время безымянный файл, который я получаю из шаблона. Я думаю, что у меня возникают проблемы с переключением выделения на один из этих файлов, а затем обратно на новый безымянный документ, хотя я мог бы использовать руку, чтобы убедиться, что я тоже правильно копирую.

Обновление: я делал вещи слишком сложно, хотя ответы здесь заставили меня указать правильное направление (спасибо!). В конце концов я просто сделал

что дает мне сырой дамп всего, что я хотел.

Используя такие команды, вы можете переключаться между тем, какой документ вы используете, и копировать и вставлять элементы:

Вы можете вставлять, копировать и вставлять вещи в и из документов, используя команды копирования.

Затем вы можете пойти и отформатировать такие, или скопировать и вставить их с оригинальным форматированием из ранее.

  1. начать в исходном документе
  2. нажмите Ctrl-A, чтобы выбрать все
  3. нажмите Ctrl-C, чтобы скопировать его в буфер обмена
  4. переключиться на целевой документ
  5. нажмите Ctrl-V, чтобы вставить в документ
  6. остановить запись

или (при условии, что Word 2007 или более поздняя версия)

  1. начать в целевом документе с закрытым исходным документом
  2. на ленте нажмите вставить> объект> текст из файла .
  3. перейти к исходному документу
  4. нажмите кнопку вставки
  5. остановить запись

Я предпочитаю вторую версию, поэтому я должен был поставить ее первой

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

  1. не использует буфер обмена и, следовательно, не делает ваш макрос уязвимым для пользователя, изменяющего содержимое буфера обмена во время работы макроса
  2. не использует файл и, таким образом, значительно повышает скорость за счет исключения операций ввода-вывода и исключает возможность необходимости иметь дело с безопасностью/разрешениями файловой системы и т. д. Пожалуйста, не используйте .InsertFile (), если вы просматриваете документы, вы замедляете работу себя вниз. Используйте его один раз, в конце - только если вам нужно. В приведенном ниже примере показано, как добиться того же результата без использования .InsertFile ()

Идея состоит в том, чтобы перенести некоторую часть текста, найденного в 1 исходном документе, в конечный документ, отличный от исходного, и сохранить исходное форматирование.

Для этого (пропустить код для открытия документов):

Я делал то же самое, пытался выбрать другой документ, скопировать и вставить. Но это не сработало (я получил ошибку, вероятно, из-за того, что какое-то другое приложение использовало буфер обмена, но я не уверен.). Поэтому я немного поискал и нашел идеальное решение для Microsoft Dev Center.

Объект Word Selection - как выделить фрагмент текста

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

Методы 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 :

Давайте посмотрим, что данный пример делает. При вызове процедуры Insert_After_Before происходит добавление в документ текстовой строки, далее в конец добавляется фраза " . Конец", а в начало - "Начало. ". Потом происходит перевод курсора в конец и добавление перевода строки.

Пример на JScript :

Для VBA мы просто запускаем редактор кода, добавляем новый модуль и прописываем код, в моем случае имя модуля - Module1:

И так, с одной теоретической частью мы закончили и написали программный код, теперь можно приступить к следующей части.

Методы Insert… – выделение фрагментов текста в Word

InsertCaption (Label, Title, TitleAutoText, Position, ExcludeLabel) - Вставляет заголовок сразу после или перед указанным выбором. Обязательным является только параметр Label.

Label – Нумерационный заголовок. Параметр может быть строкой или значением константы WdCaptionLabelID:

  • wdCaptionEquation - Уравнение
  • wdCaptionFigure - Рисунок
  • wdCaptionTable – Таблица

Если метка (Label) не определена, то возникнет ошибка. Для определения метки надо использовать метод Add коллекции CaptionLabels , например:

Title – Заголовок, который будет отображаться справа от метки.

TitleAutoText – Авто-заголовок, перекрывает параметр Title.

Position - Указывает, будет ли вставлен заголовок выше или ниже. Может быть одной из констант WdCaptionPosition:

  • wdCaptionPositionAbove - 0 - Метка название добавляется выше.
  • wdCaptionPositionBelow - 1 - Метка название добавляется ниже.

ExcludeLabel - TRUE - отключить метку, заданную в параметре Label. FALSE - включить метку. Дополнительно.

Ниже я приведу примеры, что бы не дублировать программный код, я привел только содержимое процедуры Sub Insert_Caption.

Тут используется цикл for для вставки нескольких фрагментов - "Урок 6 по VBScript: Циклы for…next и for each…next".

Тут тоже используется цикл for, но уже для JS кода - "Урок 9 по JScript - оператор цикла for".

Обратите внимание, что имена переменных в примерах отличаются, это пришлось сделать с технических причин – в глазах поисковых систем статья становится заспамленой. Хорошо, давайте двигаться дальше.

Методы Insert… – выделение фрагментов текста в Word

как можно выделить фрагмент текста

InsertDateTime (DateTimeFormat) – Метод позволяет вставить дату или время в документ, или одновременно оба значения. Помимо параметра DateTimeFormat есть еще четыре, но они практически не используются.

DateTimeFormat – Необязательный параметр, позволяет указать формат даты и времени.

Обратите внимание на оператор 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 является идентичным.

Видим, что в данном коде мы использовали несколько операторов for.

Обратите внимание на приведенные в самом начале статьи примеры кода для языков VBA и VBScript, в макросе мы можем использовать именованные константы объекта Word, но в теле Windows Script Host сценария нет, так как там они не доступны. Описание свойств класса Selection я рассмотрел в этой статье.

Спасибо за внимание. Автор блога Владимир Баталий

Читайте также: