Статьи из блога

Удаление конечных знаков абзацев из ячеек таблиц

Юрий интересуется:


Как во всем документе удалить лишние концевые знаки абзацев в конце ячеек таблиц? Это именно знаки абзацев (^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

 

twitter.com facebook.com vkontakte.ru odnoklassniki.ru mail.ru ya.ru rutvit.ru myspace.com technorati.com digg.com friendfeed.com pikabu.ru blogger.com liveinternet.ru livejournal.ru memori.ru google.com bobrdobr.ru mister-wong.ru yahoo.com yandex.ru del.icio.us

Еще записи по вопросам использования Microsoft Word:

Комментариев: 15

  1. Владислав
    16.12.2008 в 11:29 | #1

    Приветствую!

    У меня похожая проблема:

    Необходимо, чтобы в любом названии таблицы (это абзац, непосредственно предшествующий таблице) в конце не было точки.

    Вариант:

    With Selection.Find
      .Text = ".(^0013)", 
      .Style = ActiveDocument.Styles("Название таблицы")
        ' в документе предусмотрен специальный стиль для 
        ' форматирования названия таблицы
      .Format = True
      .Replacement.Text = "(\1)" 
      .MatchWildcards = True
    End With
    Selection.Find.Execute Replace:=wdReplaceAll

    - находит точки, которые нужно удалить, но не хочет их заменять.

    Думаю, задачу можно как-то решить с использованием коллекции Tables, но можно ли решить проблему, используя "Найти и заменить"?

  2. 18.12.2008 в 11:10 | #2

    Владислав, скорее всего название таблицы представляет собой поле (автоназвание). Поэтому изменить его с помощью макроса или через диалоговое окно "Найти и заменить" не удасться. Необходимо сначала преобразовать такие поля в текст, а только потом уже заменять. Другого способа я не вижу.

  3. Владислав
    18.12.2008 в 11:16 | #3

    Нет, Название таблицы не является полем.

    Проблему удалось решить, если не использовать Replace, а удалять точку вручную следующим образом:

    If Selection.Find.Execute = True Then
      Selection.Characters(1).Delete
    End If

    Пишу для того, если вдруг кто-то столкнётся с подобноу проблемой

  4. 18.12.2008 в 12:54 | #4

    Ну, если это не поле, тогда все проще, конечно. Правда, ваш макрос может удалить и все другие точки, после которых идет знак абзаца. Это может быть лишним. Надо более конкретно указывать искомый текст. И лучше не использовать в макросе этот код (0013), а использовать Chr(13).

  5. Евгений Корнилов
    25.05.2009 в 20:40 | #5

    Обнаружилась проблемма с данным макросом.

    если первая ячейка таблици пуста — вылетает с ошибкой.

    Я решил это (добавив еще и удаление начальных знаков абзаца), но не уверен что это оптимальное решение, 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

  6. Евгений Корнилов
    25.05.2009 в 21:39 | #6

    Вдогонку, на сколько эффективней по скорости будет замена

    If Len(oCll.Range.Characters.First) = 1 Then

    на

    If oCll.Range.Characters.Count > 1 Then

  7. 26.05.2009 в 08:42 | #7

    Вдогонку, на сколько эффективней по скорости будет замена
    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

  8. Евгений Корнилов
    26.05.2009 в 11:36 | #8

    Это с точки зрения логики бессмысленное, сам бы смеялся когда увидел. Но, если ячейка пуста, длинна первого символа ячейки мистическим образом становится равной 2.

    За способ поимки — спасибо.

  9. 26.05.2009 в 14:20 | #9

    …Но, если ячейка пуста, длинна первого символа ячейки мистическим образом становится равной 2.

    Никакой мистики. Просто в пустой ячейке есть символ конца ячейки, а перед ним символ абзаца, но он не виден.

  10. 25.05.2010 в 18:44 | #10

    Для г-на Корнилова: Уважаемый Евгений, какие точки, какие знаки абзацев? -- Надо начинать с того, что нужно правильно писать слова "таблици", "длинна", "проблемма"! Читать невозможно!

    Для всех: Подскажите, как в этот же макрос включить возможность удаления первых (нескольких первых) пробелов в ячейках таблиц? И в каком случае целесообразнее использовать ^0013, а в каком Chr(13)?

  11. 25.05.2010 в 20:35 | #11

    Penniwise, обрамляющие пробелы у текста убираются функцией Trim, либо её разновидностями:

    1. LTrim, чтобы убрать пробелы только впереди текста;

    2. RTrim, чтобы убрать пробелы позади текста.

    ^0013 используется для поиска знака абзаца при поиске с подстановочными знаками.

    Chr(13) это выражение Basic, которое возвращает строковое значение символа номер 13 из таблицы символов. Вместо него можно использовать константу vbCr. Используется, если в тексте нужно перейти на новую строку.

  12. 12.08.2010 в 18:21 | #12

    Некоторые word-документы заканчиваются таблицей. При этом зачастую после таблицы висит конечный знак абзаца. Это бывает неудобно, когда этот самый конечный знак абзаца переносится на следующую страницу, делая её последней и в то же время пустой.

    Как можно удалить конечный знак абзаца, чтобы документ заканчивался таблицей?

  13. 12.08.2010 в 22:24 | #13

    Удалить его нельзя, но можно уменьшить шрифт до одного пункта и тогда абзац полностью поместится на странице под таблицей.

  14. 13.08.2010 в 10:48 | #14

    Спасибо. Какое-то время назад так и догадался делать + ещё удаляю у этого абзаца интервалы, но полагал, что можно как-то «умнее» это сделать.

    Хм. Интересно, зачем по замыслу разработчиков нужен этот знак абзаца после таблицы?

  15. Аноним
    07.05.2019 в 12:23 | #15

    Очень хороший скрипт, но сегодня он вдруг отказался работать. Пишет Object variable or With block variable not set.

    Что нужно поправить?

Оставьте комментарий!

(обязательно)

^ Наверх