Статьи из блога
Статьи из блога
Удаление конечных знаков абзацев из ячеек таблиц
Рубрика: Таблицы Word, Макросы, Вопрос-Ответ
Метки: макросы | таблицы | форматирование
Понедельник, 17 ноября 2008 г.
Просмотров: 6120
Подписаться на комментарии по RSS
Версия для печати
Метки: макросы | таблицы | форматирование
Понедельник, 17 ноября 2008 г.
Просмотров: 6120
Подписаться на комментарии по RSS
Версия для печати
Юрий интересуется:
Как во всем документе удалить лишние концевые знаки абзацев в конце ячеек таблиц? Это именно знаки абзацев (^13) перед маркером конца ячейки. Вариант искать "(*^13)@", заменить на "\1" не работает в ячейках...
Для этих целей следует использовать следующий макрос. Работает для всех таблиц в документе и удаляет знаки абзацев только в конце текста в ячейке:
Sub TablesRemovePilcrons()
Dim oTbl As Table
Dim oCll As Cell
For Each oTbl In ActiveDocument.Tables
For Each oCll In oTbl.Range.Cells
While oCll.Range.Characters.Last.Previous = Chr(13)
oCll.Range.Characters.Last.Previous = ""
Wend
Next
Next
End Sub

Поиск
Рубрики
Подписка
Читают
Обсуждают
страницы
сайты
статистика
Комментариев: 14
Приветствую!
У меня похожая проблема:
Необходимо, чтобы в любом названии таблицы (это абзац, непосредственно предшествующий таблице) в конце не было точки.
Вариант:
With Selection.Find .Text = ".(^0013)", .Style = ActiveDocument.Styles("Название таблицы") ' в документе предусмотрен специальный стиль для ' форматирования названия таблицы .Format = True .Replacement.Text = "(\1)" .MatchWildcards = True End With Selection.Find.Execute Replace:=wdReplaceAll- находит точки, которые нужно удалить, но не хочет их заменять.
Думаю, задачу можно как-то решить с использованием коллекции Tables, но можно ли решить проблему, используя "Найти и заменить"?
Владислав, скорее всего название таблицы представляет собой поле (автоназвание). Поэтому изменить его с помощью макроса или через диалоговое окно "Найти и заменить" не удасться. Необходимо сначала преобразовать такие поля в текст, а только потом уже заменять. Другого способа я не вижу.
Нет, Название таблицы не является полем.
Проблему удалось решить, если не использовать Replace, а удалять точку вручную следующим образом:
Пишу для того, если вдруг кто-то столкнётся с подобноу проблемой
Ну, если это не поле, тогда все проще, конечно. Правда, ваш макрос может удалить и все другие точки, после которых идет знак абзаца. Это может быть лишним. Надо более конкретно указывать искомый текст. И лучше не использовать в макросе этот код (0013), а использовать Chr(13).
Обнаружилась проблемма с данным макросом.
если первая ячейка таблици пуста — вылетает с ошибкой.
Я решил это (добавив еще и удаление начальных знаков абзаца), но не уверен что это оптимальное решение, VB вижу сегодня первый день. Знатоки — подскажите.
Sub TablesRemovePilcrons() Dim oTbl As Table Dim oCll As Cell For Each oTbl In ActiveDocument.Tables For Each oCll In oTbl.Range.Cells While oCll.Range.Characters.First = Chr(13) oCll.Range.Characters.First = "" Wend If Len(oCll.Range.Characters.First) = 1 Then While oCll.Range.Characters.Last.Previous = Chr(13) oCll.Range.Characters.Last.Previous = "" Wend End If Next Next End SubВдогонку, на сколько эффективней по скорости будет замена
If Len(oCll.Range.Characters.First) = 1 Then
на
If oCll.Range.Characters.Count > 1 Then
Чисто теоретически первый вариант быстрее, потому что проверяется только один символ, а во втором — нужно посчитать количество символов, что, естественно, медленнее.
Но это два разных условия. Первое условие бессмысленное. В ячейке всегда будет хоть один символ (маркер конца ячейки). Длина одного символа всегда равна 1. Т.е. это условие всегда будет давать истину.
Второе условие имеет смысл, но не в этой задаче.
Чтобы не вылетала ошибка, ее нужно поймать, например так:
Sub TablesRemovePilcrons() On Error Resume Next Dim oTbl As Table Dim oCll As Cell For Each oTbl In ActiveDocument.Tables For Each oCll In oTbl.Range.Cells While oCll.Range.Characters.First = Chr(13) oCll.Range.Characters.First = "" Wend If Err.Number 0 Then Err.Clear Next Next End SubЭто с точки зрения логики бессмысленное, сам бы смеялся когда увидел. Но, если ячейка пуста, длинна первого символа ячейки мистическим образом становится равной 2.
За способ поимки — спасибо.
Никакой мистики. Просто в пустой ячейке есть символ конца ячейки, а перед ним символ абзаца, но он не виден.
Для г-на Корнилова: Уважаемый Евгений, какие точки, какие знаки абзацев? -- Надо начинать с того, что нужно правильно писать слова "таблици", "длинна", "проблемма"! Читать невозможно!
Для всех: Подскажите, как в этот же макрос включить возможность удаления первых (нескольких первых) пробелов в ячейках таблиц? И в каком случае целесообразнее использовать ^0013, а в каком Chr(13)?
Penniwise, обрамляющие пробелы у текста убираются функцией Trim, либо её разновидностями:
1. LTrim, чтобы убрать пробелы только впереди текста;
2. RTrim, чтобы убрать пробелы позади текста.
^0013 используется для поиска знака абзаца при поиске с подстановочными знаками.
Chr(13) это выражение Basic, которое возвращает строковое значение символа номер 13 из таблицы символов. Вместо него можно использовать константу vbCr. Используется, если в тексте нужно перейти на новую строку.
Некоторые word-документы заканчиваются таблицей. При этом зачастую после таблицы висит конечный знак абзаца. Это бывает неудобно, когда этот самый конечный знак абзаца переносится на следующую страницу, делая её последней и в то же время пустой.
Как можно удалить конечный знак абзаца, чтобы документ заканчивался таблицей?
Удалить его нельзя, но можно уменьшить шрифт до одного пункта и тогда абзац полностью поместится на странице под таблицей.
Спасибо. Какое-то время назад так и догадался делать + ещё удаляю у этого абзаца интервалы, но полагал, что можно как-то «умнее» это сделать.
Хм. Интересно, зачем по замыслу разработчиков нужен этот знак абзаца после таблицы?