Убрать прямое форматирование в документ MS Word с помощью макроса VBA - PullRequest
0 голосов
/ 24 марта 2020

В прошлом я был разочарован отсутствием «чистого прямого форматирования» только в MS Word. Я должен признать, что он может быть скрыт в каком-то меню, которое я не могу найти, но так как я нашел методы для этой цели в VBA, я решил создать три небольших макроса, которые просто удалят либо прямое форматирование абзаца, либо символьное форматирование, либо и то, и другое для выбранного text.

Sub Clean_Direct()
'
' Delete direct formatting to paragraph and character
'
'
    Selection.ClearCharacterDirectFormatting
    Selection.ClearParagraphDirectFormatting
End Sub
Sub Clean_Direct_character()
'
' Delete direct formatting to character
'
'
    Selection.ClearCharacterDirectFormatting
End Sub

Sub Clean_Direct_paragraph()
'
' Delete direct formatting to paragraph
'
'
    Selection.ClearParagraphDirectFormatting
End Sub

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

Sub Cleanup()

Dim Rng As Range
For Each Rng In ActiveDocument.StoryRanges
  With Rng
    With Selection.Range
        Selection.ClearCharacterDirectFormatting
        Selection.ClearParagraphDirectFormatting
    End With
  End With
Next

End Sub

Но я вижу, что он вообще не работает, и я застрял. Как примечание, ClearCharacterDirectFormatting не очищает выделенный текст.

РЕДАКТИРОВАТЬ: я начал создавать некоторые предложения If, чтобы выяснить, как выбрать текст каждой сноски или сноски для выделения, но мне кажется, что я не могу захватить правильный объект. Я прокомментировал утверждение ElseIf, потому что оно жалуется на использование неправильных методов

    Sub Cleanup()

For Each myStory In ActiveDocument.StoryRanges
    If myStory.StoryType = wdMainTextStory Then
        myStory.Select
        Selection.ClearCharacterDirectFormatting
        Selection.ClearParagraphDirectFormatting
        Selection.Collapse

'    ElseIf myStory.StoryType = wdEndnotesStory Then
'        For Each myEndnote In myStory.Endnotes
'            myEndnote.Text.Select
'            Selection.ClearCharacterDirectFormatting
'            Selection.ClearParagraphDirectFormatting
'        Next myEndnote
'    ElseIf myStory.StoryType = wdFootnotesStory Then
'        For Each myFootnote In myStory.Footnotes
'            myFootnote.FormattedText.Select
'            Selection.ClearCharacterDirectFormatting
'            Selection.ClearParagraphDirectFormatting
'        Next myFootnote
    End If
Next myStory

End Sub

Это пока общая идея.

Ответы [ 2 ]

1 голос
/ 24 марта 2020

Ваш код не работает просто потому, что вы забыли Select диапазон.

Sub Cleanup()

Dim Rng As Range
For Each Rng In ActiveDocument.StoryRanges
  Rng.select
  With Selection.Range
    Selection.ClearCharacterDirectFormatting
    Selection.ClearParagraphDirectFormatting
  End With
Next

End Sub
0 голосов
/ 25 марта 2020

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

Sub Cleanup()

For Each myStory In ActiveDocument.StoryRanges
    If myStory.StoryType = wdMainTextStory Then
        myStory.Select
        Selection.ClearCharacterDirectFormatting
        Selection.ClearParagraphDirectFormatting
        Selection.Collapse

    ElseIf myStory.StoryType = wdEndnotesStory Then
        With myStory.Endnotes
            If myStory.Endnotes.Count >= 1 Then
                For Each Endnote In myStory.Endnotes
                    Endnote.Range.FormattedText.Select
                    Selection.ClearCharacterDirectFormatting
                    Selection.ClearParagraphDirectFormatting
                    Selection.Collapse
                Next
            End If
        End With
        ElseIf myStory.StoryType = wdFootnotesStory Then
        With myStory.Footnotes
            If myStory.Footnotes.Count >= 1 Then
                For Each Footnote In myStory.Footnotes
                    Footnote.Range.FormattedText.Select
                    Selection.ClearCharacterDirectFormatting
                    Selection.ClearParagraphDirectFormatting
                    Selection.Collapse
                Next
            End If
        End With
    End If
Next myStory

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...