Слово VBA поисковое предложение для определенных слов - PullRequest
0 голосов
/ 22 декабря 2018

Я работаю над небольшим сценарием, чтобы проверить мой текстовый документ.Частью этого процесса проверки является проверка того, использовал ли я слова, которые запрещены.Я сделал базу данных в MS Access, и загрузка этой базы данных в Word работала.

Часть, которая не работает, фактически проверяет, используется ли одно из слов из базы данных.Я зацикливаю каждое предложение и выполняю следующую проверку:

«RS» - это таблица загруженной базы данных, «Selection» = активное предложение, «Cword» - переменная для запрещенного слова, которая изменяется во время циклатаблица базы данных

        'Word check
        RS.MoveFirst
        While Not RS.EOF
            Cword = LCase(RS!Woord)
            PCword = LCase(RS!Pre)

            With Selection.Range.Find
            .ClearFormatting
            .MatchWildcards = True
                While .Execute(FindText:=" " & Cword & " ", Forward:=True)
                    If .Found = True Then
                        Oms = RS!Omschrijving
                        ActiveDocument.Comments.Add(Selection.Range, Oms).Author = ComAut
                        VB_count = VB_count + 1
                        RS.MoveLast
                    End If
                Wend
            End With
        Wend

        'number check
        With Selection.Range.Find
            .ClearFormatting
            .MatchWildcards = True
            While .Execute(FindText:=" [0-9] ", Forward:=True)
                If .Found = True Then
                    SingleNumber = Selection.Range
                    Tientallen = SingleNumber Mod 10
                    Hondertallen = SingleNumber Mod 100
                    Duizendtallen = SingleNumber Mod 1000
                    If SingleNumber <= 0 Or Tientallen = 0 And SingleNumber <= 100 Or Hondertallen = 0 And SingleNumber <= 1000 Or Duizendtallen = 0 And SingleNumber <= 12000 Then
                        ActiveDocument.Comments.Add(Selection.Range, "dit getal bij voorkeur voluit schrijven. Uitgezonderd van bijvoorbeeld leeftijden, exacte waarden, maten, temperaturen en percentages").Author = ComAut
                    End If
                End If
            Wend
        End With

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

Любая помощь приветствуется, так как эта часть беспокоит меня долгое время

Ответы [ 3 ]

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

Вместо того, чтобы циклически проходить через предложения и делать выборки, вы можете использовать «Найти / Заменить» для всего документа, не выделяя ничего:

Cword = LCase(RS!Woord)
Oms = RS!Omschrijving
With ActiveDocument.Range
  With .Find
    .ClearFormatting
    .Replacement.ClearFormatting
    .Text = "<" & Cword & ">"
    .Replacement.Text = ""
    .Forward = True
    .Format = False
    .Wrap = wdFindStop
    .MatchWildcards = True
    .Execute
  End With
  Do While .Find.Found
    .Comments.Add(Range:=.Range, Text:=Oms).Author = ComAut
    .Collapse wdCollapseEnd
    .Find.Execute
  Loop
End With
RS.MoveLast

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

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

Я нашел проблему.Я забыл добавить RS.MoveNext.Без этого код никогда не смог бы достичь End of Field в первом цикле while, поскольку таблица базы данных состоит из более чем одного элемента.

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

Проблема, вероятно, связана с тем, что искомый термин не удаляется и не изменяется.Таким образом, в каждом цикле искомый термин равен Selection, поэтому он продолжает находить одно и то же снова и снова.Слово не замерзает, оно находится в «бесконечном цикле».Если бы вы нажали Ctrl + Break, макрос в конечном итоге перестал бы выполняться, и вы, вероятно, увидели бы сотни или даже тысячи комментариев, указывающих на одну и ту же позицию в документе ...

Чтобы избежать этого, нужноперед началом следующего цикла переместите выделение за пределы термина «найдено» - например, нажмите клавишу со стрелкой вправо на клавиатуре.Как то так:

        With Selection.Range.Find
          .ClearFormatting
          .MatchWildcards = True
          .Wrap = wdFindStop  'Prevent Word from starting again at the beginning of the document
            While .Execute(FindText:=" " & Cword & " ", Forward:=True)
                If .Found = True Then 'Not really necessary since the "While" already checks this...
                    Oms = RS!Omschrijving
                    ActiveDocument.Comments.Add(Selection.Range, Oms).Author = ComAut
                    VB_count = VB_count + 1
                    RS.MoveLast
                    Selection.Collapse wdCollapseEnd 'like pressing right-arrow key
                End If
            Wend
        End With
...