Sub не может найти длинные предложения, если между точкой и примечаниями нет пробела (верхние индексы) - PullRequest
0 голосов
/ 30 ноября 2018

У меня есть простой цикл (ниже), который ищет предложения длиной более 30 слов.Если найдено, он добавляет поле комментария к выбранному предложению.Это работало нормально в тестировании.Затем я добавил несколько тестовых примечаний к сноскам ... и он не может найти длинные предложения.

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

В этой связанной теме стека обсуждается необходимостьпробел после точки, чтобы обозначить конец предложения.Я предполагаю пробел должен быть непосредственно после периода, потому что у меня есть пробелы в моих цитатах, как этот 1, 2, 3

Вопрос

Как я могу найти экземпляры точка + верхний индекс (без пробела, как это -> Это предложение 1, 2, 3) и добавить пробел?В идеале я хотел бы, чтобы это происходило в цикле ниже, поэтому я могу удалить пробел после добавления комментария.

Sub Comment_on_Long_Sentences ()

Dim iWords as Integer

iWords = 0

For Each MySent in ActiveDocument.Sentences

If MySent.Words.Count > iWords Then

    MySent.Select

    'find and delete space

    ActiveDocument.Comments.Add Range:= Selection.Range, Text:= "Long Sentence: " & iWords & " words"

    'put the space back

End if

Next MySent

End Sub

Ответы [ 3 ]

0 голосов
/ 01 декабря 2018

Вот альтернативное решение.Обратите внимание на опцию, указанную в начале.Хорошая практика VBA - ставить это наверху каждого модуля.

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

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

Option explicit

Sub Comment_on_Long_Sentences()

Dim iWords                          As Integer
Dim my_sentence                     As Variant

    iWords = 30

    AddSpaceBeforeCitations

    For Each my_sentence In ActiveDocument.Sentences

        If my_sentence.Words.Count > iWords Then

          my_sentence.Comments.Add Range:=my_sentence, Text:="Long Sentence: " & iWords & " words"

        End If

    Next my_sentence

    RemoveSpaceBeforeCitations

    End Sub

Sub AddSpaceBeforeCitations()

    With ActiveDocument.Content

        With .Find

            .ClearFormatting
            .Format = True
            .Text = ""
            .Wrap = wdFindStop
            .Font.Superscript = True
            .Execute

        End With

        Do While .Find.Found

            With .Previous(unit:=wdCharacter, Count:=1).characters

                If .Last.Text = "." Then

                    .Last.Text = ". "

                End If

              End With

            .Collapse direction:=wdCollapseEnd
            .Move unit:=wdCharacter, Count:=1
            .Find.Execute

        Loop

    End With

End Sub

Sub RemoveSpaceBeforeCitations()

    With ActiveDocument.Content

        With .Find

            .ClearFormatting
            .Format = True
            .Text = ""
            .Wrap = wdFindStop
            .Font.Superscript = True
            .Execute

        End With

        Do While .Find.Found

            With .Previous(unit:=wdCharacter, Count:=2).characters

                If (.Last.Text = ".") Then

                     .Last.Next(unit:=wdCharacter, Count:=1).characters.Last.Text = vbNullString

                End If

            End With

            .Collapse direction:=wdCollapseEnd
            .Move unit:=wdCharacter, Count:=1
            .Find.Execute

        Loop

    End With

End Sub
0 голосов
/ 01 декабря 2018

Независимо от того, какой подход вы используете, любой код, основанный на свойстве VBA .Sentence или .Word, будет давать ненадежные результаты.Это потому, что .Sentence понятия не имеет, что такое грамматическое предложение, а .Word не имеет понятия, что такое грамматическое слово.Например, рассмотрим следующее:

Mr.Смит потратил 1 234,56 доллара в продуктовом магазине доктора Джона, чтобы купить 10,25 кг картофеля, 10 кг авокадо и 15,1 кг г-жи Гринс.Приятные орехи макадамии.

Для вас и меня это будет считаться одним предложением из 26 слов;для VBA это считается как 5 предложений, содержащих всего 45 слов.Для точного подсчета слов используйте .ComputeStatistics (wdStatisticWords).К сожалению, для предложений не существует эквивалента .ComputeStatistics (wdStatisticSentences).

0 голосов
/ 30 ноября 2018

При попытке доступа к предложениям, оканчивающимся символом верхнего индекса, в VBA возникают проблемы.В вашем коде также есть проблемы с необъявленными переменными, поэтому я понятия не имею, как он вообще работал для вас.

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

Sub Comment_on_Long_Sentences()
    Dim doc As word.Document, rng As word.Range, para As word.Paragraph
    Dim i As Long

    Set doc = ActiveDocument
    For Each para In doc.Paragraphs
        Debug.Print para.Range.Sentences.Count
        For i = 1 To para.Range.Sentences.Count
            Set rng = para.Range.Sentences(i)
            If i = 1 And rng.Characters.First.Font.Superscript = True Then
                rng.MoveStart word.WdUnits.wdSentence, Count:=-1
            End If
            If rng.words.Count > 30 Then
                doc.Comments.Add Range:=rng, Text:="Long Sentence: " & rng.words.Count & " words"
            End If
        Next
    Next
End Sub
...