Word VBA: Изменить абзацный отступ

Автор Anton, 30 марта 2017, 15:15

Anton

Хотел изменить абзацный отступ по условию, но не пойму, почему не работает:

Dim prg As Paragraph
    For Each prg In ActiveDocument.Paragraphs
        With prg

            If Selection.ParagraphFormat.FirstLineIndent = CentimetersToPoints(1.25) Then
                Selection.ParagraphFormat.FirstLineIndent = CentimetersToPoints(1.29)
            End If
        End With

    Next prg

Если оставить без условия - просто Selection.ParagraphFormat.FirstLineIndent = CentimetersToPoints(1.29), то работает.

И еще подскажите пожалуйста, как при таком переборе  исключить таблицы.

Администратор

Выкладывайте на форуме целостные коды, чтобы код можно было скопировать в VBA и запускать. То есть у макроса должно быть сверху и снизу Sub ... End Sub.

Использование метода "CentimetersToPoints" для данной задачи не подходит, т.к. при отступе в 1,25 см метод "CentimetersToPoints" вернёт число, которое не совпадает с числом, которое возвращает свойство "FirstLineIndent". Несовпадение связано с тем, что программа "Word" бракованная.
Поэтому сравнивайте без использования метода "CentimetersToPoints".

Для этого, с помощью этого кода узнайте, сколько пунктов у нужного отступа. Для этого в ворде поставьте курсор внутрь абзаца с отступом 1,25 см, затем перейдите в VBA и используйте такой код в View - Immediate Window:
print selection.Paragraphs(1).FirstLineIndent

Полученное число подставляйте в код. Я это сделал в вашем коде.

Макрос
Sub Макрос()

    Dim par As Paragraph
   
    For Each par In ActiveDocument.Paragraphs
        ' Исключение таблиц из перебора.
        If par.Range.Information(wdWithInTable) = False Then
            If par.FirstLineIndent = 35.45 Then
                par.FirstLineIndent = CentimetersToPoints(1.29)
            End If
        End If
    Next par

End Sub
[свернуть]

Anton

Вот как. Ясно, большое спасибо за науку и за пример.

Администратор

Способ с использованием метода "Find". Этот способ должен быстрее работать по двум причинам:
1) будут просматриваться не все абзацы, а только те, у которых отступ 1,25;
2) не будут просматриваться абзацы таблиц.

Макрос
Sub Макрос()
   
    Dim find_rng As Range, find As find
   
   
    '1. Откл. монитора.
    Application.ScreenUpdating = False
   
    '2. Создание объектов для поиска.
    Set find_rng = ActiveDocument.Range(0, 0)
    Set find = find_rng.find
   
    '3. Настройка поиска.
    find.ParagraphFormat.FirstLineIndent = CentimetersToPoints(1.25)
    find.Format = True
    find.Wrap = wdFindStop
   
    '4. Поиск и замена.
    Do While find.Execute = True
        ' Если найдено в таблице, то перестановка точки вставки за таблицу.
        If find_rng.Information(wdWithInTable) = True Then
            find_rng.SetRange find_rng.Tables(1).Range.End, find_rng.Tables(1).Range.End
        ' Если найдено не в таблице.
        Else
            ' Изменение отступа первой строки.
            find_rng.ParagraphFormat.FirstLineIndent = CentimetersToPoints(1.29)
            ' Перестановка точки вставки за найденный фрагмент.
            find_rng.Collapse Direction:=wdCollapseEnd
        End If
    Loop
   
    '5. Вкл. монитора.
    Application.ScreenUpdating = True
   
    '6. Сообщение.
    MsgBox "Готово.", vbInformation

End Sub
[свернуть]

Anton

Спасибо.
А в такой конструкции, получается, Word все правильно считает? Буду знать.

find.ParagraphFormat.FirstLineIndent = CentimetersToPoints(1.25)

Администратор

Цитата:
А в такой конструкции, получается, Word все правильно считает? Буду знать.


Да, в этом случае использование "CentimetersToPoints(1.25)" работает.