Vba word вставить текст после таблицы
После того, как мы запустили приложение, нашли и активизировали нужный нам файл, следующее действие, которые выполняется чаще всего — ввод или редактирование текста в нужном месте. Для этого используются объекты Selection, Range и Bookmark. Каждое из них используется в своих ситуациях и для своих задач.
Первый объект, который мы рассмотрим — это объект Selection. Что это такое?
Обычно перед тем, как что-либо сделать в окне документа Word, пользователь либо выделяет нужный участок текста, либо переставляет указатель вставки текста в нужное место. Объект Selection представляет именно такой выделенный участок текста (а если ничего не выделено, то место, где находится указатель вставки). Именно этот объект обычно использует макрорекордер.
Создавать объект Selection и получать на него ссылку в переменную не обязательно (а обычно и просто невозможно). Дело в том, что объект Selection в документе может быть только один. Он создается автоматически при запуске Word и всегда доступен. Обращаться к нему можно так:
Application.Selection.Text = "Вставляемый текст"
Selection.Text = "Вставляемый текст"
Обычно нам нужно правильно определить то место, на которое указывает объект Selection, чтобы выделить нужный нам участок текста или точку для ввода.
Как настроить выделение в документе Word:
- самый простой способ — просто положиться на выделение нужного текста пользователем. Обычно такой способ применяется для сложного редактирования/форматирования участков текста и для ввода информации в указанное пользователем место документа, когда в автоматическом режиме нужное место не найти;
- воспользоваться методом Select(), который предусмотрен для огромного числа объектов (Document, Range, Bookmark, Table со всеми подобъектами типа столбцов и строк, PageNumber, Field и т.п.). Этот метод просто выделяет весь документ, закладку, таблицу и т.п.
- воспользоваться многочисленными методами объекта Selection, чтобы преобразовать уже существующее выделение;
- воспользоваться объектом Find для поиска нужного участка текста. Подробнее об этом объекте — в специальном разделе.
- если вам нужно вводить информацию в самое начало документа, можно вообще ничего не делать. По умолчанию указатель вставки устанавливается на начало документа. Только не забудьте сделать этот документ активным.
Если вы полагаетесь на выделение нужного места пользователем, то помните, что пользователь может ухитриться выделить одновременно несмежные участки текста (при помощи клавиши <Ctrl>), или выделить не текст, а часть таблицы, рисунок или другой нестандартный объект в документе. Чаще всего поведение программы, работающей с объектом Selection, в этом случае становится совершенно непредсказуемым, поэтому рекомендуется всегда использовать дополнительные проверки при помощи свойств Type и Information объекта Selection.
Несмотря на то, что применение объекта Selection — самый простой и наглядный метод редактирования текста, и чаще всего именно он используется макрорекордером, на практике программисты используют его редко. Объясняется это очень просто: при использовании этого объекта мы слишком зависим от действий пользователя. Если во время выполнения нашего кода пользователь проявит инициативу и начнет щелкать по документу мышью, результат может быть совершенно непредсказуемым. Защититься от вмешательства пользователя можно двумя способами:
Коллеги, прошу прощения, только осваиваю особенности программного управления документом Word. Тривиальная, казалось бы, задача: вставить в закладку текст, добавить новый абзац и в него впечатать новый текст, но.
Текст в закладку вставляется на-ура, а вот дальше:
выделяю закладку, но новый абзац не создается, текст тоже вставляться не хочет (завершение выполнения с ошибкой). В чем причина?
Код работает из-под Excel, библиотека Word подключена
Помощь в написании контрольных, курсовых и дипломных работ здесь
Как добавить текст в абзац?
<div </div> Здравствуйте, подскажите как добавить текст в абзац.
Создать файл и добавить в него текст
как и в прошлой теме. дописываю свою программу. теперь она должна создать фаил под названием.
Как открыть созданный файл и добавить в него текст?
Программа по нажатию кнопки создается папка а в ней файл, имя файла с поля edit1, имя папки с поля.
Как создать архив и добавить в него файлы (ZipForge)?
пытаюсь разобраться с ZipForge, нужно заархивировать несколько файлов и папок. не могу даже.
zics, если работаешь с вордом извне, то следует отказаться от использования Selection и везде использовать Range . В 95% случаев этого достаточно.
Ну и помнить, что в Excel тоже есть Range , поэтому обращаться через пространство имён.
Добавлено через 3 минуты
Ну и кроме того, закладка у тебя будет удаляться, если просто присвоить ей новый текст.
Все попытки использовать TypeParagraph и TypeText ни к чему не привели.
Если не сложно, подскажите вариант кода, как реализовать простую, казалось бы, задачу:
1. Вставить в закладку документа Word текст (это удается без проблем)
2. Добавить новый пустой абзац после введенного текста на шаге 1
3. Добавить в этот абзац текст.
Как это сделать без Selection, а используя только Range?
Макрос запускается из Экселя.
Реализовал предложенную ViterAlex идею, сработало! Вероятно, реализация не самая оптимальная. Буду рад, если кто-нибудь предложит альтернативу
Спасибо за предложенные варианты! А если усложнить задачу и после "Hello Planet" в новый абзац вставить таблицу, а после неё уже "Hello World", сработает? А если усложнить задачу и после "Hello Planet" в новый абзац вставить таблицу, а после неё уже "Hello World", сработает? Немного сложнее будет, но сработает. Запоминай вставляемую таблицу в переменную и потом обращайся к Range этой таблицы, чтобы вставить после неё абзац:А если мне нужно не новую пустую таблицу создать, а вставить её, например, методом PasteExcelTable, и после её вставки добавлять новые абзацы и наполнять их текстом? zics, если таблица вставляется в конец документа, то после вставки нужно перейти в конец документа и дальше как обычно.
Если это не конец документа, то нужно запомнить сколько таблиц вставлено до места вставки, вставить, взять таблицу по номеру в коллекции Tables и дальше как обычно.
Пока так и не смог реализовать задачу, даже при активной помощи (спасибо им большое) знатоков.
Задача: Макрос, который запускается из Excel, должен в закладку имеющегося файла Word впечатать несколько строк текста, подгружать рисунок, вставлять таблицу (всё с нового абзаца), и так в цикле несколько раз. Все данные (текст, таблица) берутся из Excel, рисунок - из папки.
Проблема в том, что вставленная таблица выходит за пределы MyRange, что не позволяет после таблицы добавлять новые строки текста.
Добавлено через 6 минут
т
То есть надо таблицу вставить именно в MyRange, чтобы потом можно было к ней потом обратиться, и добавлять новый текст дальше
Добавлено через 2 минуты
А если кто-нибудь посоветует источник, где расписаны основные моменты работы с VBA Word, буду признателен
всё верно, угадали. Хочу научить Excel самостоятельно создавать отчеты в Word. Споткнулся на таблицах, прошу помощь зала
Добавлено через 3 минуты
а я как-то приладилась формировать НТМ-отчеты программно формировать(90-95%) ото всюду(ексель,аксесс, фохпро. ), обычно использую стандартные теги(30-40), без наворотов
со временем накопились стандартные куски кода для формирования СОГЛАСОВАНО/УТВЕРЖДАЮ, подписей.
удобно
--можно просто смотреть в броузере
--хорошо открывается в ворде для печати(автоподбор таблиц по ширине окна, альбомная/книжная), при необходимости пересохраняю в ДОС/ДОСХ-формат
--да и ексель с небольшой руганью открывает
каждый подстраивается под свой уровень ЛЕНИ
лично мне лень форматировать ворд-шаблон, расставлять закладки в нем
потом в аксесс/ексель писать код для заполнения сих закладок, при этом ломая голову над вставкой таблиц/рисунков
мне легче прописать все в одном месте, последовательным кодом, благо обычно требования основного заказчика по форматированию достаточно стандартны
закладки(вернее замены через найти /заменить) применяю в более художественных шаблонах, слияние применила видимо 1 -2 раза в самом начале работы с ворд-шаблонами, затем перешла на замены
Таблицы в VBA Word принадлежат коллекции Tables, которая предусмотрена для объектов Document, Selection и Range. Новая таблица создается с помощью метода Tables.Add.
Синтаксис метода Tables.Add
Expression . Add ( Range , Rows , Columns , DefaultTableBehavior , AutoFitBehavior )Expression – выражение, возвращающее коллекцию Tables.
Параметры метода Tables.Add
- Range – диапазон, в котором будет создана таблица (обязательный параметр).
- Rows – количество строк в создаваемой таблице (обязательный параметр).
- Columns – количество столбцов в создаваемой таблице (обязательный параметр).
- DefaultTableBehavior – включает и отключает автоподбор ширины ячеек в соответствии с их содержимым (необязательный параметр).
- AutoFitBehavior – определяет правила автоподбора размера таблицы в документе Word (необязательный параметр).
Создание таблицы в документе
Создание таблицы из 3 строк и 4 столбцов в документе myDocument без содержимого и присвоение ссылки на нее переменной myTable:
Set myTable = . Tables . Add ( . Range ( Start : = 0 , End : = 0 ) , 3 , 4 )Создание таблицы из 5 строк и 4 столбцов в документе Word с содержимым:
Set myTable = . Tables . Add ( . Range ( Start : = myInt , End : = myInt ) , 5 , 4 )Для указания точки вставки таблицы присваиваем числовой переменной количество символов в документе минус один. Вычитаем единицу, чтобы исключить из подсчета последний знак завершения абзаца (¶), так как точка вставки не может располагаться за ним.
Последний знак завершения абзаца всегда присутствует в документе Word, в том числе и в новом без содержимого, поэтому такой код подойдет и для пустого документа.
При создании, каждой новой таблице в документе присваивается индекс, по которому к ней можно обращаться:
Нумерация индексов начинается с единицы.
Отображение границ таблицы
Новая таблица в документе Word из кода VBA Excel создается без границ. Отобразить их можно несколькими способами:
Вариант 1
Присвоение таблице стиля, отображающего все границы:
Вариант 2
Отображение внешних и внутренних границ в таблице:
Вариант 3
Отображение всех границ в таблице по отдельности:
Присвоение таблицам стилей
Вариант 1
Чтобы узнать название нужного стиля, в списке стилей конструктора таблиц наведите на него указатель мыши. Название отобразится в подсказке. Кроме того, можно записать макрос с присвоением таблице стиля и взять название из него.
Вариант 2
Выбирайте нужную константу с помощью листа подсказок свойств и методов – Auto List Members.
Обращение к ячейкам таблицы
Обращение к ячейкам второй таблицы myTable2 в документе myDocument по индексам строк и столбцов:
Обращение к ячейкам таблицы myTable в документе Word с помощью свойства Cell объектов Row и Column и запись в них текста:
В таблице myTable должно быть как минимум 2 строки и 3 столбца.
Примеры создания таблиц Word
Пример 1
Создание таблицы в новом документе Word со сплошными наружными границами и пунктирными внутри:
В выражении myDocument.Range(Start:=0, End:=0) ключевые слова Start и End можно не указывать – myDocument.Range(0, 0) .
Пример 2
Создание таблицы под ранее вставленным заголовком, заполнение ячеек таблицы и применение автосуммы:
Метод AutoSum суммирует значения в ячейках одного столбца над ячейкой с суммой. При использовании его для сложения значений ячеек в одной строке, результат может быть непредсказуемым.
Чтобы просуммировать значения в строке слева от ячейки с суммой, используйте метод Formula объекта Cell:
Другие значения метода Formula, применяемые для суммирования значений ячеек:
- «=SUM(ABOVE)» – сумма значений над ячейкой (аналог метода AutoSum);
- «=SUM(BELOW)» – сумма значений под ячейкой;
- «=SUM(RIGHT)» – сумма значений справа от ячейки.
8 комментариев для “VBA Excel. Создание таблиц в документе Word”
Здравствуйте, Юрий!
Попробуйте так:
Объекты, задающие программный проект, являются общими для всех документов Office 2000, в том числе и документа Word. Этой важной теме - программной работе с такими объектами посвящена лекция 4
Текст и объекты Range и Selection
Основной частью документа Word является, конечно, текст этого документа. Уже было сказано, как структурирован текст документа, рассмотрены коллекции - Characters , Words , Sentences , Paragraphs , которые позволяют работать с символами, словами, предложениями и абзацами текста. Говорил я также и о том, что только этими коллекциями не обойтись, и необходим общий класс объектов, позволяющий задать произвольную область текста. Таковыми являются два важных класса Range и Selection . Объекты этих классов широко используются при работе с текстом. Документы, поддокументы, разделы, все вышеупомянутые коллекции от Characters до Words имеют метод или свойство Range , возвращающие в качестве результат объект Range . Каждый объект Range задает область определения некоторого объекта, включая текст и все объекты, связанные с этим текстом - комментарии, ссылки и прочее. Так, если некоторый объект вызвал метод Range , то возвращаемый объект Range будет содержать область определения объекта, вызвавшего метод.
Объект Selection представляет выделенную область. Поскольку в каждом окне может быть только одна выделенная область, то одновременно может существовать лишь несколько объектов Selection по одному на каждое существующее окно или подокно. Заметим также, что, объект Selection всегда существует в окне, даже если и не сделано явного выделения некоторой области, в последнем случае объект Selection задает точку вставки, определенную позицией курсора.
Объект Document имеет метод Range , возвращающий объект Range , и метод Select , создающий объект Selection . Метод Range - это функция, возвращающая в качестве результата объект Range ; метод Select - это процедура без параметров, которая создает объект Selection в качестве побочного эффекта. Заметьте существенную разницу между методами Range и Selection . В первом случае возвращается сам объект и поэтому можно запомнить возвращаемый объект и в программе одновременно работать с несколькими такими объектами. В случае вызова метода Selection объект не возвращается, следовательно, запомнить его нельзя, что и гарантирует уникальность объекта Selection .
Объект Range имеет метод Select , выделяющий область объекта Range , и определяющий, тем самым, новый объект Selection . Симметрично, объект Selection имеет свойство Range , возвращающее объект Range , соответствующий выделенной области.
Объекты Range и Selection столь же многообразны по своей структуре, как и объект Document . И даже большинство свойств у этих трех объектов одни и те же. Эти три объекта являются схожими. Это понятно, так как большинство частей документа: предложения, абзацы, разделы, таблицы, рисунки, комментарии, ссылки и многое другое - может составлять любую подобласть документа, в том числе и выделенную подобласть. Значит, большинство ранее описанных частей документа являются и частями (свойствами) объектов Range и Selection . Это приятно - ведь с большинством свойств этих объектов мы уже знакомы!
Объект Range напоминает матрешку: в каждую область вложена область поменьше. Вот пример корректного (хоть и не самого эффективного) задания объекта Range :
Сколько объектов Range упоминается в этом предложении? Правильный ответ: 6, но не 3. Напомним: на нижнем уровне отсутствуют классы, определяющие символ, слово или предложение - все эти объекты принадлежат классу Range .
Для объекта Selection нельзя построить такую хитрую цепочку вложений - ведь метод Select не возвращает объект Selection . Но можно построить такую же "хитрую" последовательность операторов, которая задает сужающуюся область выделения:
Работа с текстом
Объекты Range и Selection позволяют выполнять основные операции над текстом (и не только над текстом): "выделить", "добавить", "заменить", "удалить". У наших объектов большой набор методов, позволяющих реализовать эти операции. Все рассматриваемые здесь методы принадлежат обоим объектам, если не сделана специальная оговорка.
Говоря в этом параграфе о выделении, я имею в виду не применение метода Select , а выделение в более широком смысле, умение задать некоторую подобласть данной области. Выделить некоторую часть текста означает, по существу, определение объекта Range или Selection . Оба объекта задают непрерывную область, а их свойства Start и End позволяют задать начало и конец области. Меняя эти свойства, можно задать нужную область выделения. Этот основной способ выделения мы не раз демонстрировали в наших примерах:
В первом случае при задании области используются параметры Start и End , во втором - задается вся область данного объекта. Область может изменяться автоматически при добавлении или удалении из нее части текста. Изменить область можно и путем ее перемещения. Этим занимается специальная группа методов перемещения Move. Прежде чем говорить о перемещении, рассмотрим сжатие области. Нередко нужна пустая область - точка вставки, параметры Start и End которой совпадают. Поэтому простейший способ сжатия - задать совпадающие значения этих параметров:
Для сжатия области можно применять специальный метод сжатия - Collapse(Direction). Область стягивается в начальную или конечную позицию. Направление сжатия задает параметр Direction, принимающий значения wdCollapseStart или wdCollapseEnd . По умолчанию область стягивается в начальную точку (значение параметра: wdCollapseStart ). Если сжимается абзац, и он стягивается в конечную точку, точка вставки переносится за метку конца абзаца и устанавливается в начало следующего абзаца. Если такой эффект нежелателен, после сжатия применяется метод перемещения MoveEnd , передвигающий точку вставки назад на один символ:
Если есть методы сжатия области, то должны быть и методы расширения области. Основным из них является метод Expand (Unit). В зависимости от значения параметра Unit область можно расширить на слово, предложение, абзац, раздел, на строку или столбец таблицы, или на всю таблицу. Для объекта Selection область можно расширить на всю строку. Для расширения области на весь фрагмент можно использовать метод WholeStory , что впрочем эквивалентно вызову метода Expand (Unit := wdStory)
Метод Move является основным методом перемещения. Остальные методы - в той или иной степени его модификации. Метод Move ( Unit , Count ) сжимает область в точку, стягивая ее в начало или конец, и затем перемещает точку вставки. Параметр Unit определяет единицы перемещения, а Count - количество этих единиц и направление стягивания и перемещения (по умолчанию 1). Положительные значения этого параметра задают стягивание к концу и перемещение вперед, отрицательные - стягивание в начало и перемещение назад. Само стягивание означает перемещение на одну единицу. Метод возвращает количество единиц, на которое фактически произошло перемещение, или 0, если оно не осуществлено. Параметр Unit принимает значения wdCharacter (по умолчанию), wdWord, wdSentence, wdParagraph, wdSection, wdStory, wdCell, wdColumn, wdRow и wdTable.
Методы перемещения на сам текст не влияют - лишь изменяют область, заданную объектами Range и Selection . Поэтому эти методы применимы только к переменным типа Range , но не к фиксированным областям. Например, запись:
не имеет эффекта, поскольку область первого абзаца - вещь неизменяемая.
Метод Move стягивает область в точку, которая и перемещается, поэтому после его выполнения область исчезает, и остается только точка вставки. Методы MoveStart и MoveEnd перемещают начальную или конечную точку области, обычно расширяя тем самым область.
Конечно, для перемещения по тексту документу есть много различных возможностей, кроме группы методов Move . Стоит упомянуть группу методов Next, основным из которых является метод Next(Unit,Count). Основное отличие от метода Move с теми же параметрами состоит в том, что метод Next возвращает сам объект Range , в отличие от метода Move , возвращающего число символов, на которое произошло перемещение. Напомним также о тех возможностях перемещения, которыми обладают объекты Browser и Hyperlink , напомним о закладках, специально предназначенных для перехода к ним.
Удаление текста
Метод Delete позволяет удалить текст. Вызванный без параметров, он удаляет вызывающий его объект Range или Selection . Если он применен в форме Delete(Unit,Count), удаляется часть текста в указанной области. Параметр Unit задает единицы, но при удалении возможны только два значения: wdWord и wdCharacter. Параметр Count задает количество удаляемых единиц. Если область стянута в точку, удаляются символы перед точкой вставки или после нее в зависимости от знака параметра Count . Вот несколько примеров:
Вставка текста
Группа методов Insert объектов Range и Selection позволяет осуществлять вставки в документ. Для вставки текста используются методы InsertBefore(Text) и InsertAfter(Text). Параметр Text типа String задает текст, вставляемый до или после области, заданной объектами Range или Selection . После вставки текста область автоматически расширяется, включая в себя добавляемый текст. Вот пример вставки нового абзаца в начало документа:
Свойство Text позволяет заменять текст в выделенной области, поэтому нет нужды вызывать метод Insert(Text), - лучше использовать свойство. Методы InsertBefore и InsertAfter безопасны, так как текст добавляется, не изменяя содержимого области. При вставке внутрь области, например, при использовании метода InsertSymbol или InsertParagraph, заменяется содержимое области. Эта вроде бы безобидная программка сотрет все содержимое документа, заменив его пустым абзацем:
Говоря о методах вставки текста, нельзя не упомянуть о таком мощном методе, как InsertFile - он позволяет вставлять не только текст или таблицу Excel, но и целый документ, хранящийся в файле. Вот простой пример вызова метода, при котором в начало активного документа вставляется существующий документ:
Работа с буфером
Известно, как полезен буфер при работе с одним и, особенно, с несколькими документами. Объекты Range и Selection в полной мере позволяют задействовать все возможности буфера. Метод Copy, не имеющий параметров, копирует объект (содержимое области) в буфер. Метод Cut, действуя аналогично, копирует объект в буфер, заодно удаляя его. Заметьте, что в отличие от предыдущей версии, теперь метод Cut работает, как ему положено, не только копируя объект, но и удаляя его, ранее удаления не происходило, вместо этого объект, вызывавший метод стягивался в точку. Метод Paste позволяет приклеить объект, помещенный в буфер. Рассмотрим пример:
Метод Paste позволяет "вклеить" содержимое буфера в область, заданную объектами Range и Selection . Эта операция опасна, так как происходит замена, а не добавление текста. Поэтому обычно метод Paste применяется к объектам Range и Selection , стянутым в точку вставки. В выполнении этого метода есть нюансы. У объекта Range содержимое буфера включается в его область, Объект Selection остается точкой вставки, расположенной после текста, добавленного из буфера.
Заметьте, в буфер можно копировать не только текст. В нашем следующем примере в буфер копируется рисунок, являющийся элементом коллекции TableOfFiguress . Напомню, что элементы этой коллекции вставляются аналогично символам текста и являются частью абзаца. В тестовом документе DocOne, с которым я работаю, в начало текста вставлен рисунок мышки. Я буду работать с первым абзацем этого текста, содержащим этот рисунок, как с обычным текстом, выделю рисунок, помещу его в буфер, а затем приклею в другом месте текста. Вот код соответствующей процедуры:
Иногда в буфер копируют формат текста. Этим занимается метод CopyFormat , копирующий формат по первому символу объекта Selection . Если этот символ - метка абзаца, копируется формат абзаца. Методом CopyFormat обладает только объект Selection .
Метод PasteFormat применяет форматирование, хранящееся в буфере к объекту Selection .
Метод PasteSpecial позволяет явно управлять форматированием в момент вставки объекта из буфера.
Читайте также: