Как использовать заглавные буквы в абзаце - PullRequest
0 голосов
/ 29 октября 2019

Я пытаюсь написать макрос для переназначения стилей абзацев из настроек Word по умолчанию на стили, определенные сторонним приложением. Я должен применить новый стиль, иначе импорт не будет работать правильно.

Некоторые стили (SCT, PRT, ART) также должны быть во ВСЕХ ЗАГЛАВНЫХ БУКВАХ, но часто автор документа не следует этому формату. ,Мне нужен способ применить заглавные буквы текста всего абзаца, пока я меняю стиль.

Я попытался ojbPara.Range.text = UCase (ojbPara.Range.text). Я также попытался присвоить тексту свойство AllCaps = True.

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

Sub ChangeStyle()

Dim objPara As Paragraph
Dim previousOriginalStyle As Style

'junk style to use for first item
Set previousOriginalStyle = ActiveDocument.Styles("Quote")

'swap styles, if preceding style is different, use "lc" style

For Each objPara In ActiveDocument.Paragraphs

    If objPara.Style = "Header" Then
        objPara.Style = ActiveDocument.Styles("SCT")

        ElseIf objPara.Style = ActiveDocument.Styles("Heading 1") Then
            objPara.Style = ActiveDocument.Styles("PRT")
            previousOriginalStyle = ActiveDocument.Styles("Heading 1")

        ElseIf objPara.Style = ActiveDocument.Styles("Heading 2") Then
            objPara.Style = ActiveDocument.Styles("ART")
            previousOriginalStyle = ActiveDocument.Styles("Heading 2")

        ElseIf objPara.Style = ActiveDocument.Styles("Heading 3") Then

            If objPara.Style = previousOriginalStyle Then
                objPara.Style = ActiveDocument.Styles("PR1")
            Else: objPara.Style = ActiveDocument.Styles("PR1lc")
            End If
            previousOriginalStyle = ActiveDocument.Styles("Heading 3")

        ElseIf objPara.Style = ActiveDocument.Styles("Heading 4") Then

            If objPara.Style = previousOriginalStyle Then
                objPara.Style = ActiveDocument.Styles("PR2")
            Else: objPara.Style = ActiveDocument.Styles("PR2lc")
            End If
            previousOriginalStyle = ActiveDocument.Styles("Heading 4")

        ElseIf objPara.Style = ActiveDocument.Styles("Heading 5") Then

            If objPara.Style = previousOriginalStyle Then
                objPara.Style = ActiveDocument.Styles("PR3")
            Else: objPara.Style = ActiveDocument.Styles("PR3lc")
            End If
            previousOriginalStyle = ActiveDocument.Styles("Heading 5")

        ElseIf objPara.Style = ActiveDocument.Styles("Heading 6") Then

            If objPara.Style = previousOriginalStyle Then
                objPara.Style = ActiveDocument.Styles("PR4")
            Else: objPara.Style = ActiveDocument.Styles("PR4lc")
            End If
            previousOriginalStyle = ActiveDocument.Styles("Heading 6")

        ElseIf objPara.Style = ActiveDocument.Styles("Heading 7") Then

            If objPara.Style = previousOriginalStyle Then
                objPara.Style = ActiveDocument.Styles("PR5")
            Else: objPara.Style = ActiveDocument.Styles("PR5lc")
            End If
            previousOriginalStyle = ActiveDocument.Styles("Heading 7")

        ElseIf objPara.Style = ActiveDocument.Styles("Footer") Then
            objPara.Style = ActiveDocument.Styles("EOS")

        objPara.Range.ListFormat.RemoveNumbers NumberType:=wdNumberParagraph

    End If

    'fix formatting

    With objPara.Range.Find
        With .Replacement
            .ClearFormatting
            .Font.Bold = False
            .Font.Italic = False
            .Font.Underline = False
            .Font.ColorIndex = wdBlack
            .Highlight = False
        End With
        .Execute Replace:=wdReplaceOne
    End With

Next

End Sub

1 Ответ

0 голосов
/ 30 октября 2019

Я пересмотрел ваш код, чтобы использовать функцию для сброса стиля и изменил long if ifif на выбранный регистр, как я и предлагал. Я также упростил вещи, используя имена стилей, а не стили. Я думаю, что приведенный ниже код точно представляет логику в приведенном выше коде, но теперь вы сможете гораздо яснее увидеть, верна ли эта логика.

Если есть ключевые слова, которые вы не понимаете, тогда в VBAВ IDE наведите курсор на ключевое слово и нажмите F1. Откроется страница справки MS для этого ключевого слова.

Вам также следует установить надстройку RUbberduck для VBA, поскольку в нее встроен индентор, а также множество других полезных и полезных инструментов.

Вытакже заметит использование .Item. Это свойство по умолчанию, которое может быть опущено, но его лучше оставить.

Option Explicit

Public Sub ChangeStyles()

    Dim objPara As Paragraph
    Dim previousOriginalStyle As String

    'junk style to use for first item
    previousOriginalStyle = ActiveDocument.Styles.Item("Quote").NameLocal

    For Each objPara In ActiveDocument.Paragraphs

        Select Case objPara.Style.NameLocal

            Case "Header"

                UpdateStyle objPara, "SCT"

            Case "Heading 1"

                UpdateStyle objPara, "PRT"
                previousOriginalStyle = "Heading 1"

            Case "Heading 2"

                UpdateStyle objPara, "ART"
                previousOriginalStyle = "Heading 2"

            Case "Heading 3"

                UpdateStyle objPara, "PR1", previousOriginalStyle, "PR1"
                previousOriginalStyle = "Heading 3"

            Case "Heading 4"

                UpdateStyle objPara, "PR2", previousOriginalStyle, "PR1lc"
                previousOriginalStyle = ActiveDocument.Styles.Item("Heading 4").NameLocal

            Case "Heading 5"

                UpdateStyle objPara, "PR3", previousOriginalStyle, "PR3lc"
                previousOriginalStyle = "Heading 5"

            Case "Heading 6"

            UpdateStyle objPara, "PR4", previousOriginalStyle, "PR4lc"
            previousOriginalStyle = "Heading 6"

            Case "Heading 7"

                UpdateStyle objPara, "PR5", previousOriginalStyle, "PR5lc"
                previousOriginalStyle = "Heading 7"

            Case "Footer"

                UpdateStyle objPara, "EOS"
                objPara.Range.ListFormat.RemoveNumbers NumberType:=wdNumberParagraph

            Case Else

            ' do nothing at the moment

        End Select

    Next

End Sub

Public Sub UpdateStyle _
( _
    ByRef ipPara As Word.Paragraph, _
    ByVal ipPrimaryStyle As String, _
    Optional ByVal ipPreviousStyle As Variant, _
    Optional ByVal ipAltStyle As Variant _
)

    If IsMissing(ipPreviousStyle) And IsMissing(ipAltStyle) Then

        ipPara.Range.ParagraphFormat.Style = ActiveDocument.Styles.Item(ipPrimaryStyle).NameLocal
        Exit Sub

    End If


    If ipPara.Range.ParagraphFormat.Style.NameLocal = ipPreviousStyle Then

        ipPara.Range.ParagraphFormat.Style = ActiveDocument.Styles.Item(ipAltStyle).NameLocal

    Else

        ipPara.Range.ParagraphFormat.Style = ActiveDocument.Styles.Item(ipPrimaryStyle).NameLocal

    End If

End Sub

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

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