Vba копирование строки word
Я пытаюсь дублировать строку таблицы в Word, используя VBA, без использования объекта Selection или буфера обмена. То есть, я хочу, чтобы новая строка имела тот же контент, что и существующая строка.
Для этого я сначала создаю новую (пустую) строку и перебираю каждую ячейку в исходной строке и копирую ее содержимое в соответствующую ячейку целевой строки.
Чтобы скопировать каждую ячейку, я получаю объект Range который ссылается на весь контент исходной ячейки и эквивалентный Range для целевой ячейки, а затем выполните следующее:
Это хорошо работает в Office 2003, а также работает большую часть времени на Office 2010. Однако у меня есть реальная проблема с одним конкретным сценарием. Я (сильно) упростил этот сценарий, чтобы продемонстрировать суть проблемы.
На рисунке ниже на внешней (серой) таблице 2R x 1C есть две ячейки. Вторая строка - это скопированная строка. Первая строка - это новая строка, которую я создал, и в которую я хочу скопировать содержимое второй строки.
Вы заметите, что вторая строка содержит вложенную таблицу.
Когда я запускаю код ниже в Word 2003, он отлично работает, и я получаю следующий результат:
Но в Word 2010 тот же код производит этот результат:
Как вы можете видеть, содержимое ячейки было вставлено до (и снаружи) ячейки целевой таблицы.
Стоит отметить, что если я помещу что-то после вложенной таблицы, так что это уже не последняя вещь в исходной ячейке, тогда эта проблема не возникает.
Здесь полный код VBA, который я использую:
ПРИМЕЧАНИЕ. Коррекция в конце исходного и целевого диапазонов необходима, поскольку Cell.Range включает Cell.Range конца ячейки, и я не хочу его копировать.
Что я могу сделать, чтобы убедить его разместить содержимое внутри целевой ячейки (например, Word 2003), а не раньше?
в следующей таблице перечислены функции, которые Visual Basic предоставляет в Microsoft.VisualBasic.Strings классе для поиска и работы со строками. их можно рассматривать как Visual Basic встроенных функций; то есть вам не нужно вызывать их как явные члены класса, как показано в примерах. Дополнительные методы и в некоторых случаях дополняют методы, доступны в System.String классе.
Можно использовать инструкцию Option Compare , чтобы задать, сравниваются ли строки с использованием порядка сортировки текста без учета регистра, определенного языковым стандартом системы ( Text ) или внутренними двоичными представлениями символов ( Binary ). Метод сравнения текста по умолчанию — Binary .
Пример: Укасе
В данном примере функция UCase используется для возврата строки в верхнем регистре.
Пример: LTrim
В данном примере функция LTrim используется, чтобы убрать пробелы в начале, а функция RTrim — чтобы убрать пробелы в конце строковой переменной. Функция Trim в примере используется для удаления обоих типов пробелов.
Пример: mid
В этом примере Mid функция используется для возврата указанного числа символов из строки.
Пример: len
В данном примере Len используется для возврата числа знаков в строке.
Пример: InStr
В данном примере функция InStr используется для возврата позиции первого вхождения одной строки в другую.
Пример: Format
В данном примере показаны различные способы использования функции Format для форматирования значений с применением как форматов String , так и определенных пользователем форматов. Фактическое отображение системой разделителя даты ( / ), разделителя времени ( : и индикаторов AM/PM ( t и tt ) зависит от региональных параметров, применяемых кодом. При отображении времени и даты в среде разработки используется короткий формат времени и даты региональных установок кода.
Для языков, использующих 24-часовой формат, индикаторы AM/PM ( t и tt ) не отображаются.
Чтение из буфера обмена
Этот пример кода также доступен в качестве фрагмента кода IntelliSense. В средстве выбора фрагмента кода он расположен в разделе Приложения Windows Forms > Буфер обмена. Дополнительные сведения см. в статье Фрагменты кода.
Используйте метод GetImage для извлечения изображения из буфера обмена. Код в этом примере проверяет наличие изображения в буфере обмена, прежде чем извлекать его и назначать PictureBox1 .
Этот пример кода также доступен в качестве фрагмента кода IntelliSense. В средстве выбора фрагмента кода он расположен в разделе Приложения Windows Forms > Буфер обмена. Дополнительные сведения см. в разделе Фрагменты кода.
Элементы, добавленные в буфер обмена, сохраняются даже после того, как работа приложения завершается.
Определение типа файла, хранящегося в буфере обмена
В буфере обмена могут храниться данные в различных форматах, включая тексты, звуковые файлы и изображения. Чтобы определить, файл какого типа содержится в буфере обмена, можно использовать такие методы как ContainsAudio, ContainsFileDropList, ContainsImage и ContainsText. Если вы используете для проверки пользовательский формат файла, можно использовать метод ContainsData.
Функция ContainsImage позволяет определить, являются ли данные в буфере обмена изображением. Следующий код проверяет, являются ли данные изображением, и выдает соответствующий отчет.
Очистка буфера обмена
Метод Clear очищает буфер обмена. Поскольку буфер обмена используют и другие процессы, очищение буфера может плохо на них повлиять.
В следующем примере кода демонстрируется применение метода Clear .
Запись в буфер обмена
Используйте метод SetText для записи текста в буфер обмена. Следующий код записывает в буфер обмена строку "This is a test string" (Это — тестовая строка).
Метод SetText может принимать параметр формата, который содержит тип TextDataFormat. Следующий код записывает строку "This is a test string" (Это — тестовая строка) в буфер обмена в формате RTF.
Используйте метод SetData для записи данных в буфер обмена. Код в этом примере записывает DataObject dataChunk в буфер обмена в пользовательском формате specialFormat .
Используйте метод SetAudio для записи звуковых данных в буфер обмена. Код в этом примере создает массив байтов musicReader , считывает в него файл cool.wav и записывает его в буфер обмена.
Поскольку к буферу обмена могут обращаться другие пользователи, не храните в нем конфиденциальные данные, включая пароли.
Я пытаюсь скопировать строку таблицы в Word, используя VBA, без использования объекта выделения или буфера обмена. То есть я хочу новую строку, которая имеет то же содержание, что и существующая строка.
Для этого я сначала создаю новую (пустую) строку, перебираю каждую ячейку исходной строки и копирую ее содержимое в соответствующую ячейку целевой строки.
Чтобы скопировать каждую ячейку, Я получаю объект Range , который ссылается на все содержимое исходной ячейки, и эквивалент Range для целевой ячейки, а затем сделайте следующее:
Это хорошо работает в Office 2003, а также работает большую часть времени в Office 2010. Однако у меня есть реальная проблема с одним конкретным сценарием. Я (значительно) упростил этот сценарий, чтобы продемонстрировать суть проблемы.
На рисунке ниже, есть две ячейки во внешней (серой) таблице 2R x 1C. Вторая строка-это строка, которую нужно скопировать. Первая строка-это новая строка, которую я создал и в которую я хочу скопировать содержание второго ряда.
Вы заметите, что вторая строка содержит вложенную таблицу.
Когда я запускаю приведенный ниже код в Word 2003, он отлично работает, и я получаю следующий результат:
Но в Word 2010 тот же код приводит к следующему результату:
Как вы можете видеть, содержимое ячейки было вставлено перед (и снаружи) целевой ячейки таблицы.
Стоит отметить, что если я положу что-то после вложенной таблицы, так что это больше не последняя вещь в исходной ячейке, то эта проблема не возникает.
Вот полный код VBA, который я использую:
Примечание: корректировка до конца исходного и целевого диапазонов необходима, потому что Cell.Range включает маркер конца ячейки, и я не хочу его копировать.
Что я могу сделать, чтобы убедить его поместить содержимое внутрь целевой ячейки (как это делает Word 2003), а не раньше это?
Читайте также: