Letysite.ru

IT Новости с интернет пространства
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Vba word форматирование таблицы

Форум для экологов

Форум для экологов

О быстром оформлении таблиц в Word


О быстром оформлении таблиц в Word

Сообщение masm0 » 28 авг 2017, 19:50

В и-нете много шуточек о перфекционистах. Возможно, я из их числа: я не могу смотреть без боли в глазах на отчеты программ для расчета выбросов — cразу хочется отредактировать это безобразие! К тому же у уважающих себя контор имеются внутренние стандарты, регламентирующие правила оформления своей продукции. Если исправить шрифт и его кегль можно с помощью нажатий нескольких клавиш, то при оформлении таблиц придется потрудиться.

В данной заметке я расскажу о своем относительно быстром способе оформления таблиц в Word. Сразу отмечу, что способ наверняка не самый совершенный. Коллеги, понимающие в программировании, возможно, предложат варианты значительно лучше моего, но у меня нет времени на оптимизацию.

Важно! Ниже приведен пример быстрого оформления таблиц для отчетов программ фирмы Интеграл. Более универсальные способы (или, напротив, еще более узкоспециализированные) рассмотрим в других заметках.

Установка макроса

Итак, начнем с того, что добавим в шаблон Normal.dotm новый макрос.

Примечание: Как правило, макросы вызывают ужас у рядового гражданина. Но не нужно их бояться. Следуйте моим инструкциям, и все будет хорошо.

1. Закрываем все документы, открытые в Word, и оставляем одну единственную открытую копию приложения. Можно создать новый документ.

2. Отображаем на ленте вкладку Разработчик. Для этого воспользуемся инструкцией Microsoft .

3. Теперь самое неприятное для обычного юзера — включаем макросы. Самый простой способ — это на вкладке Разработчик нажать на кнопку Безопасность макросов и там выбрать Включить все макросы, а затем закрыть Word и открыть заново. Конечно, это довольно опасно, так как при открытии документов из неизвестных источников вы рискуете подцепить вирус. Чтобы себя обезопасить, не открывайте такие документы или отключайте макросы, когда вы с ними не работаете. Подробная инструкция о включении и выключении макросов приведена на сайте Microsoft .

4. Следующим шагом, переходим на вкладку Вид и записываем пустой макрос. Для этого снова воспользуемся инструкцией разработчика Office . Просто запускаем запись, предварительно назначив сочетание клавиш или кнопку на ленте, и сразу останавливаем (я запускаю макрос с помощью сочетания клавиш «Alt+Ctrl+Shift+Z» (мне так удобно), но также его можно запускать с помощью кнопки на ленте). По умолчанию Word предложит назвать макрос «Макрос1». Можно так и оставить — это не принципиально (я назвал «ОформлениеТаблицыВВыделенном«).

5. Переходим на вкладку Разработчик. Запускаем редактор Visual Basic (первая кнопка слева).

Слева вверху отобразится окно Project – Normal. В дереве откройте Normal->Modules->NewMacros. Щелкните на этой позиции дважды. Отобразится окно Normal – NewMacros (Code). Если мы назвали макрос «Макрос1», то увидим следующий код:

6. Сохраняем (Ctrl+S). Теперь редактор Visual Basic можно закрыть и перейти в Word.

Как пользоваться макросом

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

Результаты использования макроса

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

Теперь применяем макрос и видим, что широкие таблицы сжались, а узкие стали шире, при этом занимая меньше места на бумаге (в данном примере экономия бумаги составила около 17%).

Также макрос оформляет рамки таблиц. Дело в том, что разные программы имеют разные стили оформления рамок таблиц. Теперь, если вам необходимо собрать отчеты из разных программ в одном документе, то все таблицы будут выглядеть одинаково.

Альтернативный способ (долгий)

Те же действия можно осуществить без применения макросов:

1. Щелкаем по таблице. Выделяем всю таблицу с помощью появившегося значка сверху справа от таблицы.
2. Щелкаем правой кнопкой мыши на таблице и в контекстном меню выбираем «Автоподбор». В подменю выбираем «Автоподбор по содержимому».
3. Для оформлении рамок таблицы на панели «Главная» щелкаем на кнопке настройки границ и выбираем «Все границы».
4. Вновь щелкаем правой кнопкой мыши на таблице. В контекстном меню выбираем «Автоподбор», а в подменю выбираем «Автоподбор по ширине окна».

Таким образом придется сделать 9—11 действий для одной таблицы (против 2—3 действий для нескольких таблиц при использовании макроса). При этом нужно включать мозг, чтобы не перепутать и не забыть все эти действия в их сложной последовательности. Для одноразового оформления данный способ вполне применим, но очевидно, что для оформления таблиц в промышленных масштабах лучше один раз потратить время на установку макроса.

Оформление сразу всех таблиц в документе

Выделяем весь текст в документе (Ctrl+A) и запускаем наш макрос.

Примечание 1: Также можно поменять первую строчку макроса « With Selection » на « With Application.ActiveDocument », но я считаю, что это не оптимально.

Примечание 2: Если у вас большой отчет, то его автоматическое оформление может занять продолжительное время. Например, на моём старом домашнем компьютере оформление отчета из 267 страниц, содержащего 1047 таблиц, заняло 3 минуты 25 секунд (согласитесь, что это лучше, чем несколько дней оформлять вручную). А пока компьютер работает, эти 3—4 минуты лучше потратить на чай, кофе или даже сигаретку 😉

Смотри мою следующую заметку об оформлении колонтитулов в Excel и ставь лайки 😉

Читать еще:  Как добавить примечание в word 2020

Copy Text from Table in Word and Retaing Formatting

I have a problem copying a cell from a table to another cell. I’m talking about two word documents here. I can copy the text but the bullets are gone and some of the formatting.

I tried .Formattedtext but still can’t do it.

Have you tried ‘Selection.PasteAndFormat (wdFormatOriginalFormatting)’? – Siddharth Rout 14 янв. 13 2013-01-14 11:21:12

I haven’t treid that. How do I use that? I’m sorry I’m new to VBA – user1173805 14 янв. 13 2013-01-14 11:32:30

Can you show what have you tried? – Siddharth Rout 14 янв. 13 2013-01-14 11:33:08

Dim test as word.cell test.Range.FormattedText = CTPDoc.Tables(2).Rows(testCount).Cells(3).Range.FormattedText an error occurs something like «Object variable or With block variable not set» – user1173805 14 янв. 13 2013-01-14 11:40:56

2 ответа

Here is an example.

Let’s say we have two tables in a word document. See screenshot below

Let’s say we want to paste the data from Cell 1 of Table 1 to Cell 1 of Table 2 then try this

This is what the macro does

Hope this helps 🙂

I think I can use that with my scenario. The two tables are from different files. My problem is I get all the values first before I open the target file and paste all the values. Thanks – user1173805 14 янв. 13 2013-01-14 12:32:06

your above code shows that you are reading the values form a a table so the method that i suggested above will work for you. give it a try – Siddharth Rout 14 янв. 13 2013-01-14 14:19:54

it worked. thank you very much! Now I’ve done something good in my first job 😀 – user1173805 15 янв. 13 2013-01-15 02:21:33

I have a problem. I thought it’s all working now but I tried it in a different computer and an error occurs in .PastandFormat line. It says ‘Command not available’ 🙁 – user1173805 15 янв. 13 2013-01-15 04:26:33

Which MS Office version are you using on that pc? – Siddharth Rout 15 янв. 13 2013-01-15 05:26:46

I’m using 2010 where I code and 2007 where I tested. I tried different parameters instead of wdFormatOriginalFormatting and some works but the format ia a bit messed up. One worked but in one instance only. I mean when I tried to use different source file the format is messed again. – user1173805 15 янв. 13 2013-01-15 06:23:25

I’m currently using wdListContinueNumbering and wdUseDestinationStylesRecovery and it’s now working on both computers. I assume it’ll work on any other too. Although something’s must be wrong with source file causing the messed up format when pasted. Thanks for everything. This is solved 🙂 – user1173805 15 янв. 13 2013-01-15 09:06:17

@Siddharth Rout You answer was really helpful. It’s not the exact answer to my problem but at least I learned about pasteandFormat and its diffrenet types such as . maybe someday I cann use that.

Vba word форматирование таблицы

Здравствуйте, kas1830, Вы писали:

K>Но в этом случае три значения выводятся не в одну строку, а в три, разделенные возвратом каретки.
K>Как склеить значения в одну строку?
Очевидно, надо убрать возвраты каретки. 🙂

Здравствуйте, ZAMUNDA, Вы писали:
ZAM>Очевидно, надо убрать возвраты каретки.

Спасибо. Но самое интересное в том, что необходимо вырезать не один последний символ, а два,
тогда склеивание строк в итоговой ячейке отрабатывается как надо. Дело в том, что в конце каждой ячейки присутствует
спецсимвол, который, вероятно, обозначает ее конец. Так что и его вырезать надо.

И еще один вопрос вдогонку:
два файла находятся в одной директории. Как мне в коде сослаться на второй документ (в этой же директории) без указания полного пути?
В одной из САПР VBA поддерживал следующий тип записи —

точка и слеш указывали на то, что файл находится в той же директории. В VBA для Word я не нашел такого.

И вот еще вопрос:
необходимо запустить процедуру из другого документа.
Пробую что-то типа

но не прокатывает. Процедура находится в ThisDocument. Как до нее достучаться?

Здравствуйте, kas1830, Вы писали:

K>два файла находятся в одной директории. Как мне в коде сослаться на второй документ (в этой же директории) без указания полного пути?
K>В одной из САПР VBA поддерживал следующий тип записи —

K>точка и слеш указывали на то, что файл находится в той же директории. В VBA для Word я не нашел такого.

Он и сейчас это поддерживает, потому что это свойство файловой системы. Также есть функция CurDir() (и обратная к ней ChDir()), которая может дать ответ, где ищется файл. К тому же, код выполняется в некоем окружении, в котором также есть пути, например, ActiveDocument.Path или thisDocument.Path, и можено самому формировать путь к документу ActiveDocument.Path & «» & «.имя файла».

Здравствуйте, Vi2, Вы писали:

Vi2>Он и сейчас это поддерживает, потому что это свойство файловой системы. Также есть функция CurDir() (и обратная к ней ChDir()), которая может дать ответ, где ищется файл. К тому же, код выполняется в некоем окружении, в котором также есть пути, например, ActiveDocument.Path или thisDocument.Path, и можено самому формировать путь к документу ActiveDocument.Path & «» & «.имя файла».

Читать еще:  Как вставить шаблон в документ word

Спасибо большое! Дельный совет.
А как насчет вопроса с использованием Application.Run.

Здравствуйте, kas1830, Вы писали:

ZAM>>Очевидно, надо убрать возвраты каретки. 🙂
K>Спасибо. Но самое интересное в том, что необходимо вырезать не один последний символ, а два,
K>тогда склеивание строк в итоговой ячейке отрабатывается как надо. Дело в том, что в конце каждой ячейки присутствует
K>спецсимвол, который, вероятно, обозначает ее конец. Так что и его вырезать надо.
Я знаю, я про это уже писал здесь

Здравствуйте, Vi2, Вы писали:

Vi2>ActiveDocument.Path или thisDocument.Path,
Только не надо забывать, что это разные вещи! ActiveDocument это субстанция не постоянная, сделаешь Documents.Open и активным станет свежеоткрытый документ. А ThisDocument это ссылка на документ, в котором находится модуль макроса, т.е. если вызвать функцию из другого документа, то ThisDocument для этой функции уже будет свой.

Vi2>и можено самому формировать путь к документу ActiveDocument.Path & «» & «.имя файла».
ActiveDocument.Path & «» & «имя файла»
🙂

Здравствуйте, kas1830, Вы писали:

K>И вот еще вопрос:
K>необходимо запустить процедуру из другого документа.
K>Пробую что-то типа

K>
Читай внимательнее помощь:

MacroName Required String. The name of the macro. Can be any combination of template, module, and macro name. For example, the following statements are all valid.

Application.Run «Normal.Module1.MAIN»
Application.Run «MyProject.MyModule.MyProcedure»
Application.Run «‘My Document.doc’!ThisModule.ThisProcedure»

Т.е. кавычки и имя модуля ты забыл. И ещё не забывай чтоб процедура была Public. Например если в документ добавишь модуль MMain и напишешь в нём процедуру а затем сохранишь документ с именем «Z:test.doc»; то вызвать эту процедуру можно так:
И не забывай, что Application.Run загрузит документ с вызываемым макросом (если надо), но по окончании своей работы не выгрузит его.

K>но не прокатывает. Процедура находится в ThisDocument. Как до нее достучаться?
ThisDocument.

Задать ширину столбцов таблицы в макросе Word VBA

2 Zkoh [2019-01-12 14:27:00]

1. Что я пытаюсь сделать

У меня есть папка с 84 документами Word (.docx). Каждый документ содержит таблицу одинакового формата (некоторые документы занимают 2 страницы). Однако ширина столбцов не всегда одинакова.

Я хочу, чтобы все ширины столбцов таблицы были одинаковыми в 2 дюйма, чтобы впоследствии я мог сохранить все файлы в формате PDF и подготовить их для использования в другом процессе, о котором я не буду подробно останавливаться.

2. Мой текущий подход

У меня есть макрос Word VBA, который запускает сценарий (ниже) для всех файлов .docx в папке на основе пользовательского пути к файлу. Эта часть работает — нет проблем.

Эта проблема

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

Иллюстрируя проблему со скриншотами

Рисунок 1 (выше): Вот как выглядит исходная таблица в документе Word.

Рисунок 2 (выше): Вот как выглядит таблица после запуска моего макроса. В этом примере я запустил макрос, чтобы установить ширину всех столбцов в 1,5 ( InchesToPoints(1.5) ). Вы можете видеть, что корректируются только первые 3 столбца, но столбцы 4-7 не изменены.

Рисунок 3 (выше): Я ожидал, что таблица будет выглядеть после запуска моего макроса, чтобы установить для всех столбцов ширину 1,5 дюйма.

Тестирование на другом файле

Я протестировал макрос в другом созданном мной файле, в который я вставил 3 таблицы.

Рисунок 4 (выше): я создал новый файл с 3 таблицами, все с различной шириной столбца.

Рисунок 5 (выше): Запуск макроса с этим тестовым файлом в той же папке, что и в примере документа ранее, показывает, что макрос работает, и настраивает столбцы во всех таблицах на указанную ширину.

3. Мой вопрос

Что здесь происходит? Почему SetTableWidths не работает SetTableWidths ?

Я предполагаю, что это может быть потому, что исходная таблица в оригинальном текстовом документе содержит объединенные ячейки, в противном случае, почему скрипт не будет работать со столбцами 4-7?

Любая помощь будет принята с благодарностью.

4. Слово VBA Макро

5. Кредит и отказ от ответственности

Я не писал макросы VBA. Я получил их онлайн в этих двух местах:

Примеры использования функций VBA

Удаление ненужных символов

Зачастую строки в программе содержат ненужные символы пробелов в конце или в начале строки, которые необходимо удалить, т.к. посторонние начальные или конечные пробелы в строке могут вызвать «неполадки» в работе программы.

В VBA имеются три функции, предназначенные для удаления начальных и конечных пробелов из строки: LTrim, RTrim, Trim. Следует иметь ввиду, что эти функции на самом деле не изменяют исходную строку, а возвращают копию строки с удаленными лишними пробелами.

Определение длины строки

Длину строки, как правило, надо знать при форматировании сообщений для пользователя или при форматировании строковых данных, вводимых процедурой в рабочий лист Excel или документ Word. VBA для этих целей использует функцию Len. В приведенным ниже листинге между знаками круглых скобок и словом присутствует по два пробела.

Следует быть внимательными со строками фиксированной длины. Поскольку строка фиксированной длины имеет всегда одну и ту же длину, функция Len всегда возвращает объявленную длину строки, независимо от фактической длины строки. Например, если в строковой переменной фиксированной длины StrokeName, имеющей длину 15 символов, фактически находится слово «солнце», то функция Len(StrokeName) возвратит результат 15. Чтобы в таком случае узнать фактическую длину строки (в нашем случае — 6), необходимо использовать следующую комбинацию функций: Len(Trim(StrokeName)).

Сравнение и поиск строк

В VBA имеются две функции, помогающих сравнивать строки: StrComp, InStr.

Функция StrComp

StrComp (String1, String2 [, Compare])

Читать еще:  C добавить таблицу в word

String1, String2 — любые два строковых выражения, которые необходимо сравнивать.

Compare — необязательный аргумент, может быть любой из следующих предопределенных констант (если он опускается, то используется текущая установка Option Compare):

  • vbBinaryCompare — бинарное сравнение двух строк;
  • vbTextCompare — текстовое сравнение двух строк;
  • vbDatabaseCompare — используется только в Microsoft Access.

При выполнении StrComp возвращается одно из следующих значений:

  • -1, если String1 меньше String2;
  • 0, если String1 и String2 равны;
  • 1, если String1 больше String2.

В вышеприведенном листинге в текстовом режиме сравниваются две строки: «Строка по умолчанию» и » Строка по умолчанию». Результат сравнения = 1, т.е. «Строка по умолчанию» больше, чем » Строка по умолчанию».

Поэкспериментируйте с разнообразными строками для лучшего понимания работы функции StrComp.

Функция InStr

Функция InStr дает возможность определить, содержит ли одна строка другую строку.

StrComp ([Start, ] String1, String2 [, Compare])

String1, String2 — любые допустимые строковые выражения. Функция проверяет содержится ли String1 в String2.

Compare — необязательный аргумент, может быть любой из следующих предопределенных констант (если он опускается, то используется текущая установка Option Compare):

  • vbBinaryCompare — бинарное сравнение двух строк;
  • vbTextCompare — текстовое сравнение двух строк;
  • vbDatabaseCompare — используется только в Microsoft Access.

Start — необязательный аргумент, является численным выражением и указывает положение символа в String1, с которого должна начинаться проверка.

InStr возвращает число, обозначающее положение символа в String1, где было обнаружено String2. Если InStr не находит String2 в String1, то возвращается 0. Если String1 (или String2) имеет значение Null, то функция также возвращает Null.

Разбиение строки

Иногда возникает необходимость разбиения строки на составляющие части. В VBA эту задачу решают три функции: Left, Right, Mid.

Функция Left

Left (String, Length)

String — любое допустимое строковое выражение.

Length — любое численное значение.

Функция возвращает копию String, начиная с первого символа и включая количество символов, заданных с помощью Length. Если Length является числом, большим, чем фактическая длина String, то возвращается все строковое выражение String.

Функция Right

Right (String, Length)

String — любое допустимое строковое выражение.

Length — любое численное значение.

Функция возвращает копию String, начиная с последнего символа и включая справа налево количество символов, заданных с помощью Length. Если Length является числом, большим, чем фактическая длина String, то возвращается все строковое выражение String. Функция Right всегда копирует символы от конца строки к ее началу.

Функция Mid

Mid (String, Start, [, Length])

String — любое допустимое строковое выражение.

Length, Start — любые численные значения.

Функция Mid возвращает копию String, начиная с положения символа в String, задаваемого с помощью аргумента Start . Необязательный аргумент Length определяет количество копируемых в Mid символов из String. Если Start содержит большее число, чем фактическая длина String, то возвращается пустая строка.

Символы, которые нельзя ввести с клавиатуры

Зачастую случается, что надо ввести какой-либо символ, для которого отсутствует клавиша на клавиатуре (например, символ копирайта). Другая ситуация — когда надо в строку включить служебный символ VBA (самый распространенный случай — включение двойных кавычек).

Чтобы включить в строку символы, которые невозможно ввести с клавиатуры, или которые имеют особое значение для VBA, используется функция Chr.

Charcode — любое численное выражение, являющееся допустимым кодом для набора символов, используемого компьютером. Должен быть целым числом от 0 до 255.

Функция Chr принимает код отдельного символа в качестве аргумента и возвращает строку, содержащую соответствующий этому коду символ. Данная функция использована в вышеприведенных листингах для перевода строки при выводе сообщения на экран Chr (13).

Поскольку символы, используемые для начала новой строки, являются очень важными при форматировании сообщений и других строковых данных, которыми манипулируют VBA-процедуры, имеется несколько предопределенных констант для этих символов, чтобы не было необходимости использовать функцию Chr:

  • vbCr — символ возврата каретки. Эквивалент Chr(13)
  • vbLf — символ смещения на одну строку. Эквивалент Chr(10)
  • vbCrLf — символ возврата каретки+смещения на одну строку. Эквивалент Chr(13)+ Chr(10)
  • vbTab — символ табуляции. Эквивалент Chr(9)

Для просмотра списка код-символ надо открыть справочную систему VBA и по запросу «character sets» будет представлена соответствующая таблица.


Форматирование значений данных

Очень часто формат данных на выходе программы по тем или иным причинам нас не совсем устраивает. Эту задачу решает функция Format.

VBA-функция Format идентична функции Format в Excel и использует те же символы-заполнители форматирования данных.

Format (Expression [, Format[, Firstdayofweek [, Firstweekofyear]]])

Expression — любое допустимое выражение (обязательный аргумент).

Format — допустимое выражение именованного или определенного пользователем формата.

Firstdayofweek — константа, которая определяет первый день недели.

Firstweekofyear — константа, которая определяет первую неделю года.

Чтобы использовать функцию Format, надо либо задать предопределенный формат, либо создать образ определенного формата, используя символы-заполнители.

Ссылка на основную публикацию
Adblock
detector