Хотел изменить абзацный отступ по условию, но не пойму, почему не работает:
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
Вот как. Ясно, большое спасибо за науку и за пример.
Способ с использованием метода "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
Спасибо.
А в такой конструкции, получается, Word все правильно считает? Буду знать.
find.ParagraphFormat.FirstLineIndent = CentimetersToPoints(1.25)
Цитата:
А в такой конструкции, получается, Word все правильно считает? Буду знать.
Да, в этом случае использование "CentimetersToPoints(1.25)" работает.