В MS word findall (Поиск в основном документе) очень медленный для длинных документов, так как использовать макрос для достижения того же, зацикливая одну находку за раз - PullRequest
0 голосов
/ 26 февраля 2019

В MS word findall (Поиск в основном документе) очень медленный для длинных документов

Преимущество findall состоит в том, что он выбирает все найденные слова (т.е. подсвечивается светло-прозрачным синим), затем я могу изменитьшрифт или любые другие свойства за один раз.

Но проблема в том, что когда документ очень очень большой (в моем случае), поиск занимает много времени или зависает.Я могу сказать, что не знаю, что происходит на заднем плане

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

Так возможно ли это.

В слове Microsoft я могу найти слово один раз следующим образом:

enter image description here

И следующий макрос такой же, как этот:

Sub findawordonce()
'
' Macro6 Macro
'
'
    Selection.HomeKey Unit:=wdStory
    Selection.Find.ClearFormatting
    With Selection.Find
        .Text = "PQXY"
        .Replacement.Text = ""
        .Forward = True
        .Wrap = wdFindContinue
        .Format = True
    End With
    Selection.Find.Execute
End Sub

Когда я нахожу слово (например, word1), используя findNext, он выбирает вхождение слова, которое представлено подсветкойслово по умолчанию в прозрачном синем цвете

То, что я наблюдаю, это:

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

То, что я хочу:

Когда я снова использую FindNext, выбирается следующее вхождение слова, сохраняя предыдущий выбор.

Это невозможно спользовательский интерфейс, но возможно ли это с помощью макроса.

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

Я знаю вслово мы можем найти слово во всем документе.Но мой документ очень большой и часто зависает.

1 Ответ

0 голосов
/ 03 марта 2019

Можете ли вы попробовать этот отзыв?

Sub CommandButton1_Click()
'Updated by Extendoffice 20180625
Dim xFileDialog As FileDialog, GetStr(1 To 100) As String '100 files is the maximum applying this code
Dim xFindStr As String
Dim xReplaceStr As String
Dim xDoc As Document
On Error Resume Next
Set xFileDialog = Application.FileDialog(msoFileDialogFilePicker)
With xFileDialog
    .Filters.Clear
    .Filters.Add "All WORD File ", "*.docx", 1
    .AllowMultiSelect = True
    i = 1
    If .Show = -1 Then
        For Each stiSelectedItem In .SelectedItems
            GetStr(i) = stiSelectedItem
            i = i + 1
        Next
        i = i - 1
    End If
    Application.ScreenUpdating = False
    xFindStr = InputBox("Find what:", "hall", xFindStr)
    xReplaceStr = InputBox("Replace with:", "NOTHING", xReplaceStr)
    For j = 1 To i Step 1
        Set xDoc = Documents.Open(FileName:=GetStr(j), Visible:=True)
        Windows(GetStr(j)).Activate
        Selection.Find.ClearFormatting
        Selection.Find.Replacement.ClearFormatting
        With Selection.Find
            .Text = xFindStr  'Find What
            .Replacement.Text = xReplaceStr  'Replace With
            .Forward = True
            .Wrap = wdFindAsk
            .Format = False
            .MatchCase = False
            .MatchWholeWord = False
            .MatchByte = True
            .MatchWildcards = False
            .MatchSoundsLike = False
            .MatchAllWordForms = False
        End With
        Selection.Find.Execute Replace:=wdReplaceAll
        Application.Run macroname:="NEWMACROS"
        ActiveDocument.Save
        ActiveWindow.Close
    Next
    Application.ScreenUpdating = True
End With
MsgBox "Operation end, please view", vbInformation
End Sub
...