Макрос слова: поиск ключевых слов и извлечение предложения в Excel - PullRequest
0 голосов
/ 15 ноября 2018

Я менеджер предложений и использую приведенный ниже макрос для поиска в файле Word слова «должен» и извлекаю предложение, содержащее «должен» в Excel. Это работает, но я не могу понять, как редактировать код, чтобы он мог искать более одного слова в порядке их появления в файле.

Пример: 1. Ищите «должен» или «должен». 2. Он не должен искать «должен», а затем искать «должен». Он должен искать «должен» или «должен», затем «должен» или «должен». 3. Если параграф содержит четыре предложения, и первое предложение содержит «должен», второе содержит «должен», третье содержит «должен», а четвертое содержит «должен», макрос должен быть извлечен в Excel в этом порядке.

Sub FindWordCopySentence()
Dim appExcel As Object
Dim objSheet As Object
Dim aRange As Range
Dim intRowCount As Integer
intRowCount = 1
Set aRange = ActiveDocument.Range
With aRange.Find
    Do
        .Text = "shall" ' the word I am looking for
        .Execute
        If .Found Then
            aRange.Expand Unit:=wdSentence
            aRange.Copy
            aRange.Collapse wdCollapseEnd
            If objSheet Is Nothing Then
                Set appExcel = CreateObject("Excel.Application")
                 'Change the file path to match the location of your test.xls
                Set objSheet = appExcel.workbooks.Open("C:\Temp\test.xlsx").Sheets("Sheet1")
                intRowCount = 1
            End If
            objSheet.Cells(intRowCount, 1).Select
            objSheet.Paste
            intRowCount = intRowCount + 1
        End If
    Loop While .Found
End With
If Not objSheet Is Nothing Then
    appExcel.workbooks(1).Close True
    appExcel.Quit
    Set objSheet = Nothing
    Set appExcel = Nothing
End If
Set aRange = Nothing
End Sub

Ответы [ 2 ]

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

Один из способов решения этой проблемы:

(1) Используйте поиск / замену Word, чтобы обернуть слова, представляющие интерес (должны, будут), в теги, например, будут, будут.и может быть чем угодно, чего вы не ожидаете в исходном документе Word;

(2) Используйте измененную версию вашего FindWordCopySentence, чтобы найти помеченные слова, а затем скопируйте соответствующие предложения в Excel;затем

(3) Используйте поиск / замену Word для очистки (уберите теги).Или вы можете просто закрыть документ Word без сохранения.

Вот код с некоторыми комментариями для объяснения деталей:

Option Explicit
Const START_TAG As String = "$$SWSTART_"
Const END_TAG As String = "_SWEND$$"


Sub AddTagsToShallWords()
' SHALL_WORDS is a |-delimited string of the words you want to replace
' The "[Ss]" means that the first letter can be upper or lower case (same for [Ww])
' This is designed to be extendible, e.g. you could add "must" by appending |[Mm]ust
Const SHALL_WORDS = "[Ss]hall|[Ww]ill"
Dim v As Variant
Dim I As Long
Dim s As String
Dim aRange As Range
Dim sFindText As String
Dim sReplaceText As String

' Create shall words to an array
v = Split(SHALL_WORDS, "|")

' Replace each shall word with its tagged version
For I = 0 To UBound(v)
    s = CStr(v(I))
    Set aRange = ActiveDocument.Range

    ' Create the FindText arg, e.g. "(<[Ss]hall>)"
    ' The parentheses create a "group" that we use to build the replacement text
    ' The <> are used to mark the beginning and end of words
    ' to prevent FindText="will" from matching "swill", "goodwill", etc.
    sFindText = "(<" & s & ">)"

    ' Create the ReplaceText arg. "\1" is the found text. Wrap it in the tags.
    sReplaceText = START_TAG & "\1" & END_TAG
    With aRange.Find
        .MatchWildcards = True
        .Execute FindText:=sFindText, ReplaceWith:=sReplaceText, Replace:=wdReplaceAll
    End With
Next I
Set aRange = Nothing
End Sub



Sub RemoveTags()
Dim aRange As Range
Dim sFindText As String
Dim sReplaceText As String

Set aRange = ActiveDocument.Range
sFindText = START_TAG & "(*)" & END_TAG
sReplaceText = "\1"
With aRange.Find
    .MatchWildcards = True
    .Execute FindText:=sFindText, ReplaceWith:=sReplaceText, Replace:=wdReplaceAll
End With
Set aRange = Nothing
End Sub



Sub FindWordCopySentence()
Dim appExcel As Object
Dim objSheet As Object
Dim aRange As Range
Dim intRowCount As Integer
Dim s As String
intRowCount = 1
Set aRange = ActiveDocument.Range
With aRange.Find
    .MatchWildcards = True
    Do
        .Text = START_TAG & "*" & END_TAG ' the word I am looking for
        .Execute
        If .Found Then
            aRange.Expand Unit:=wdSentence
            s = aRange.Text
            s = Replace(s, START_TAG, "")
            s = Replace(s, END_TAG, "")
            aRange.Collapse wdCollapseEnd
            If objSheet Is Nothing Then
                Set appExcel = CreateObject("Excel.Application")
                 'Change the file path to match the location of your test.xls
                Set objSheet = appExcel.workbooks.Open("C:\Temp\test.xlsx").Sheets("Sheet1")
                intRowCount = 1
            End If
            objSheet.Cells(intRowCount, 1).Formula = s
            intRowCount = intRowCount + 1
        End If
    Loop While .Found
End With
If Not objSheet Is Nothing Then
    appExcel.workbooks(1).Close True
    appExcel.Quit
    Set objSheet = Nothing
    Set appExcel = Nothing
End If
Set aRange = Nothing
End Sub

Надеюсь, что поможет

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

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

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

Для нас с тобой это будет считаться одним предложением; для VBA это считается как 5 предложений. Соответственно, следующий макрос просто захватывает все соответствующие абзацы. Большая часть кода связана с установлением существования рабочей книги и рабочего листа; Я не включил проверку ошибок относительно того, может ли файл уже открываться.

Sub Demo()
'Note: This code requires a VBA reference to the Excel object library
Dim xlApp As New Excel.Application, xlWkBk As Excel.Workbook
Dim xlSht As Excel.Worksheet, StrWkBkNm As String, StrWkSht As String
Dim lRow As Long, Para As Paragraph
StrWkBkNm = "C:\Temp\test.xlsx": StrWkSht = "Sheet1"
If Dir(StrWkBkNm) = "" Then
  MsgBox "Cannot find the designated workbook: " & StrWkBkNm, vbExclamation
  Exit Sub
End If
With xlApp
  .Visible = True
  ' The file is available, so open it.
  Set xlWkBk = .Workbooks.Open(FileName:=StrWkBkNm, ReadOnly:=False, AddToMru:=False)
  If xlWkBk Is Nothing Then
    MsgBox "Cannot open:" & vbCr & StrWkBkNm, vbExclamation
    .Quit
    Exit Sub
  End If
  ' Process the workbook.
  With xlWkBk
    'Ensure the worksheet exists
    If SheetExists(StrWkSht) = True Then
    Set xlSht = .Worksheets(StrWkSht)
      With xlSht
        ' Find the last-used row in column A.
        lRow = .Cells(.Rows.Count, 1).End(-4162).Row ' -4162 = xlUp
      End With
      For Each Para In ActiveDocument.Paragraphs
        With Para
          If (InStr(.Range.Text, "shall") > 0) Or (InStr(.Range.Text, "shall") > 0) Then
            lRow = lRow + 1
            xlSht.Range("A" & lRow).Value = .Range.Text
          End If
        End With
      Next
    Else
      MsgBox "Cannot find the designated worksheet: " & StrWkSht, vbExclamation
      .Close False
      xlApp.Quit
    End If
  End With
End With
' Release Excel object memory
Set xlSht = Nothing: Set xlWkBk = Nothing: Set xlApp = Nothing
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...