Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1748to1752
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

VBA: Suche Word Docs nach Wörtern

VBA: Suche Word Docs nach Wörtern
09.04.2020 17:57:25
Robin
Hallo Leute,
heute geht es bei mir um ein Problem was mich schon seit Tagen beschäftigt und wozu ich bereits erfolglos englisch und deutschsprachige Foren durchsucht habe.
Ich möchte in einem definierten Ordner die Dateien nach einen bestimmten Begriff durchsuchen. Wenn das Wort gefunden wird soll es in die Zelle geschrieben werden, der dazugehörige Pfad soll in der Nachbarspalte stehen. Alle Dokumente wo das Wort nicht gefunden wird, sollen in einer anderen Spalte aufgeführt werden.
Das war nach etwas Arbeit kein Problem.
Ich suche derzeit nach einer Möglichkeit, dass gleichzeitig nach einen zweiten Begriff gesucht werden soll. Wenn eins der beiden Wörter auftaucht (also als ODER zu verstehen) soll das Dokument aufgelistet werden. Dokumente wo beide Wörter nicht aufgefunden werden, sollen in einer anderen Spalte auflistet werden. Ich habe versucht mit einer zweiten If Schleife dies zu Lösen, leider ohne Erolg.
Mein bisheriger Ansatz sieht wiefolgt aus:
--------------------------------------------
Sub GetDocData()
Application.ScreenUpdating = False
Dim wdApp As New Word.Application, wdDoc As Word.Document, WkSht As Worksheet
Dim strFolder As String, strFile As String, r As Long, n As Long, s As Long
strFolder = GetFolder
If strFolder = "" Then Exit Sub
Set WkSht = ActiveSheet
r = WkSht.Cells(WkSht.Rows.Count, 1).End(xlUp).Row 'r Wort 1
n = WkSht.Cells(WkSht.Rows.Count, 1).End(xlUp).Row 'n Ausschuss
s = WkSht.Cells(WkSht.Rows.Count, 1).End(xlUp).Row 's Wort 2
wdApp.WordBasic.DisableAutoMacros
strFile = Dir(strFolder & "\*.doc", vbNormal)
While strFile  ""
Set wdDoc = wdApp.Documents.Open(Filename:=strFolder & "\" & strFile, AddToRecentFiles:=False, _
Visible:=False)
With wdDoc 'Loop 1 Wort 1
With .Range.Find 'Wort 1
.ClearFormatting
.Replacement.ClearFormatting
.MatchWholeWord = True
.MatchCase = True
.Wrap = wdFindStop
.Text = WkSht.Cells(1, 1).Text
'.Text = WkSht.Cells(2, 1).Text
.Execute
If .Found = True Then
r = r + 1
WkSht.Cells(r, 1) = strFile
WkSht.Cells(r, 2) = strFolder
Else:
With .Range.Find 'Startet Loop Wort 2
.ClearFormatting
.Replacement.ClearFormatting
.MatchWholeWord = True
.MatchCase = True
.Wrap = wdFindStop
.Text = WkSht.Cells(2, 1).Text
.Execute
If .Found = True Then
s = s + 1
WkSht.Cells(s, 3) = strFile
WkSht.Cells(s, 4) = strFolder
Else: 'Wenn Beide Wörter nicht gefunden
n = n + 1
WkSht.Cells(n, 5) = strFile
WkSht.Cells(n, 6) = strFolder
'Kill (wdDoc) eigener Macro
End If 'Loop 2
End With 'End With Loop2
End If 'Loop 1
End With 'End With Loop 1
.Close SaveChanges:=False
End With 'End With Doc
strFile = Dir()
Wend
wdApp.Quit
Set wdDoc = Nothing: Set wdApp = Nothing: Set WkSht = Nothing
Application.ScreenUpdating = True
End Sub

Function GetFolder() As String
Dim oFolder As Object
GetFolder = ""
Set oFolder = CreateObject("Shell.Application").BrowseForFolder(0, "Choose a folder", 0)
If (Not oFolder Is Nothing) Then GetFolder = oFolder.Items.Item.Path
Set oFolder = Nothing
End Function

--------------------------------------------------------------
Beim Starten kommt die Meldung für das "With.Range.Find 'Startet Looü Wort 2", dass das Objekt oder die Methode nicht gefunden wird.
Ohne die Zeile Läuft das Makro, aber er findet kein Ergbenisse für das 2. Wort.
Vielleicht kennt einer von euch eine Lösung.
Es darf auch ein anderer Ansatz sein wie man einen 2. Suchbegriff in die Funktion einbettet. Ebenfalls funktionierten "Or" oder einfach einer 2. Zeile ".Text=.." in der ersten Schleife nicht.
Falls Euch der Code zu unübersichtlich ist, kann ich den Orginalen, ohne 2. If Schleife auch geben.
Vielen Dank schon mal
BG

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA: Suche Word Docs nach Wörtern
10.04.2020 11:12:59
volti
Hallo Robin,
anliegend mal ein Muster, wie Du Dein Problem lösen kannst. Habe mir erlaubt, auch sonst noch etwas anzupassen, da mir Dein code nicht überall plausibel vorkam.
Insbesondere im Bereich der Ausgabe kannst Du ja noch jonglieren, oder nimm es einfach als Tipp.

Option Explicit
Sub GetDocData()
'Early Binding =>Verweis auf Wordbibliothek muss gesetzt sein
 Dim wdApp As New Word.Application, wdDoc As Word.document, WkSht As Worksheet
 Dim strFolder As String, strFile As String, T As String
 Dim iZeile As Long, i As Integer, iFound As Integer, iOfs As Integer
 
 Application.ScreenUpdating = False
 strFolder = GetFolder                           'Ordner auswählen
 If strFolder = "" Then Exit Sub                 'Keine gewählt =>raus
 Set WkSht = ActiveSheet
 With WkSht
  iZeile = .Cells(.Rows.Count, 1).End(xlUp).Row  'letzte Zeile ermitteln
 End With
 wdApp.WordBasic.DisableAutoMacros
 strFile = Dir(strFolder & "\*.doc*", vbNormal)  'Suchmaske setzen
 While strFile <> ""
  Set wdDoc = wdApp.Documents.Open(Filename:=strFolder _
      & "\" & strFile, AddToRecentFiles:=False, Visible:=True)
'   wdApp.Visible = True                         'Word sichtbar
    With wdDoc
      With .Range.Find
           .ClearFormatting
           .Replacement.ClearFormatting
           .MatchWholeWord = True
           .MatchCase = True
           .wrap = wdFindContinue 'wdFindStop
           iFound = 0
           For i = 1 To 2 'Anzahl (Zeilennummern) für die Suchbegriffe
             .Text = WkSht.Cells(i, 1).Text
             .Execute                            'Jetzt suchen
             If .Found = True Then _
                iFound = iFound Or i             'Ergebnis verarbeiten
           Next i
           iOfs = 0: iZeile = iZeile + 1         'nächste Zeile
           With WkSht
            Select Case iFound
            Case 0: iOfs = 0: T = "Kein Treffer"
            Case 1: iOfs = 2: T = .Cells(1, 1).Text
            Case 2: iOfs = 2: T = .Cells(2, 1).Text
            Case 3: iOfs = 4: T = .Cells(1, 1).Text & " und " & .Cells(2, 1).Text
            End Select
            .Cells(iZeile, iOfs + 1) = strFolder 'Pfad schreiben
            .Cells(iZeile, iOfs + 2) = strFile   'Datei schreiben
            .Cells(iZeile, iOfs + 3) = T         'Ergebnisse schreiben
           End With
      End With
      .Close SaveChanges:=False                  'Dokument schließen ohne speichern
    End With
    strFile = Dir$()                             'Nächste Datei
 Wend
 wdApp.Quit                                      'Word schließen
 Set wdDoc = Nothing: Set wdApp = Nothing: Set WkSht = Nothing
 Application.ScreenUpdating = True
 MsgBox "Bin fertig!", vbInformation, "Suchen"
End Sub
Function GetFolder() As String
 Dim oFolder As Object
 GetFolder = ""
 Set oFolder = CreateObject("Shell.Application").BrowseForFolder(0, "Ordner auswählen", 0)
 If (Not oFolder Is Nothing) Then GetFolder = oFolder.Items.Item.Path
 Set oFolder = Nothing
End Function

viele Grüße
Karl-Heinz

Anzeige
AW: VBA: Suche Word Docs nach Wörtern
16.04.2020 14:30:38
Robin
Hey Heinz, danke für die Hilfe.
Das funktioniert schon sehr gut. Mir war nicht bewusst, dass man das i gleich für die Auswahl des Textes mit nutzen kann.
Ich habe auf die Schnelle noch nicht ganz verstanden wie das Zählen mit den iOfs und den i(negiert)im Detail funktioniert.
Eine Sache gibt es aber noch, oder eher 2.
Zum einen sind die Ergbenisse je nach Anzahl der Funde (also keins eins oder 2 gefundene Wörter im Dokument) jeweils um diese Anzahl an Spalten verrückt, sodass keine zusammenhängende Liste entsteht.
Mir stellt sich zudem die Frage, ob bei dieser festen Definition der Cases, die Dokumente auch erfasst werden, wenn die gesuchten Begriffe mehrfach im Dokument auftauchen.
Schon mal vielen Dank Heinz. Du Genie hast mir bereits sehr geholfen
VG Robin
Anzeige
AW: VBA: Suche Word Docs nach Wörtern
16.04.2020 15:50:27
volti
Hallo Robin,

  • Die Variable iOfs sorgt dafür, dass es einen Spaltenversatz gibt. Ich dachte, Du wolltest das so haben.
    Wenn alles schön untereinander in Liste sein soll, nehme das iOfs einfach raus oder setzte es auf 0.

  • Ansonsten werden die zwei Suchbegriffe in einer Schleife gesucht und, wenn das Ergebnis gefunden wurde, iFound byteweise via i gesetzt.
    1. Fund => Bit 1 gesetzt, 2. Fund => Bit 2 gesetzt
    ALs Ergebnis können dann vier Möglichkeiten auftreten:
    Nix gefunden, 1.Text gefunden, 2. Text gefunden und Beide gefunden

  • Das Word-Item .found sagt lediglich aus, dass der Begriff gefunden wurde (True/false) und nicht wie oft. Insofern kann ich Deine Bedenken zerstreuen

viele Grüße
Karl-Heinz
Anzeige
AW: VBA: Suche Word Docs nach Wörtern
16.04.2020 16:18:54
Robin
Ok die iOfs für die Ausgabe hatte ich bereits entfernt um eine zusammenhängende Spalte zu erhalten.
Ich sehe das Marko schwächelt leider mit Groß und Kleinschreibung sowie ZUsammengesetzten Wörtern.
Für 3 oder mehr Suchwörter müsste es dann so aussehen oder?:
Jetzt mal nur die relevanten Zeilen

For i = 1 To 3
Select Case iFound
Case 0: iOfs = 0: T = "Kein Treffer"
Case 1: iOfs = 2: T = .Cells(1, 1).Text
Case 2: iOfs = 2: T = .Cells(2, 1).Text
Case 3: iOfs = 2: T = .Cells(3, 1).Text
Case 4: iOfs = 4: T = .Cells(1, 1).Text & " und " & .Cells(2, 1).Text
Case 5: iOfs = 4: T = .Cells(1, 1).Text & " und " & .Cells(3, 1).Text
Case 6: iOfs = 4: T = .Cells(2, 1).Text & " und " & .Cells(3, 1).Text
Case 7: iOfs = 8: T = .Cells(1, 1).Text & " und " & .Cells(2, 1).Text & " und " & .  _
_
Cells(3, End Select

Kommt das so hin?
PS: Als Anfänger versuche ich dnicht nur zu kopieren sondern zu verstehen
VG Robin
Anzeige
AW: VBA: Suche Word Docs nach Wörtern
16.04.2020 16:59:47
volti
Nein Robin,
das kommt so nicht hin.
Das Makro ist bzgl. der Ausgabe nur für zwei Suchbegriffe ausgelegt.
Wenn Du beliebig viele ausgeben möchtest, kannst Du die Schleife zwar verwenden, um alle zu finden, aber die Bit-Verarbeitung funzt da nicht bzw. so nicht.
Da müsstest Du am besten alle gefundenen Suchbegriffe in einer Variablen sammeln und ausgeben.
Ich bin keine Word-Experte (beschäftige mich eigentlich gar nicht damit). Bzgl. der Groß/Kleinschreibung gibt es sicher irgendeine Einstellung/Parameter dafür und zu zusammengesetzten Wörtern kann ich leider nichts sagen.
Möchtest Du mehrere Suchbegriffe finden? Dann guck ich mal danach (wenn ich Zeit habe).
viele Grüße
Karl-Heinz
Anzeige
AW: VBA: Suche Word Docs nach Wörtern
16.04.2020 17:14:12
volti
Hier noch ein Beispiel aus meiner Bastelkiste für beliebig viele Suchbegriffe....

Option Explicit
Sub SucheInWorddateien()
'Suchen von zwei Begriffen in Worddateien
'Early Binding =>Verweis auf Wordbibliothek muss gesetzt sein
 Dim appWD As New Word.Application, oDoc As Word.document, WSh As Worksheet
 Dim sPath As String, sFile As String, T As String, sSuch() As String
 Dim iZeile As Long, i As Integer, iFound As Integer
 
 Application.ScreenUpdating = False
 sPath = GetFolder                      'Ordner auswählen
 If sPath = "" Then Exit Sub            'Keine gewählt =>raus
 Set WSh = ActiveSheet
 With WSh
  .Cells.Clear
  .Cells(1, 1).Resize(1, 3).value = _
   Split("Pfad,Durchsuchte Datei,Ergebnisse", ",")
  iZeile = 1
  sSuch = Split("Sehr,Hugo,und,mit", ",")
 End With
 appWD.WordBasic.DisableAutoMacros      'Makros ausschalten
 sFile = Dir(sPath & "\*.doc*", vbNormal) 'Suchmaske setzen
 While sFile <> ""
  Set oDoc = appWD.Documents.Open( _
    Filename:=sPath & "\" & sFile)
'   appWD.Visible = True                'Word sichtbar
    With oDoc.Range.Find
        .ClearFormatting
        .Replacement.ClearFormatting
        .MatchWholeWord = True
        .MatchCase = False              'Groß-Kleinschreibung
        .wrap = wdFindContinue 'wdFindStop
        T = ""
        For i = 0 To UBound(sSuch)      'Anzahl Suchbegriffe
          .Text = sSuch(i)
          .Execute                      'Jetzt suchen
          If .Found = True Then _
             T = T & sSuch(i) & "," '   'Ergebnis verarbeiten
        Next i
        iZeile = iZeile + 1             'nächste Zeile
        With WSh
         If T = "" Then T = "Kein Treffer,"
         .Cells(iZeile, 1) = sPath      'Pfad schreiben
         .Cells(iZeile, 2) = sFile      'Datei schreiben
         .Cells(iZeile, 3) = _
          Left$(T, Len(T) - 1)          'Ergebnisse schreiben
        End With
    End With
    oDoc.Close SaveChanges:=False       'Dokument schließen ohne speichern
    sFile = Dir$()                      'Nächste Datei
 Wend
 appWD.Quit                             'Word schließen
 Set oDoc = Nothing: Set appWD = Nothing: Set WSh = Nothing
 Application.ScreenUpdating = True
 MsgBox "Bin fertig!", vbInformation, "Suchen"
End Sub
Function GetFolder() As String
 Dim oFolder As Object
 GetFolder = ""
 Set oFolder = CreateObject("Shell.Application").BrowseForFolder(0, "Ordner auswählen", 0)
 If (Not oFolder Is Nothing) Then GetFolder = oFolder.Items.Item.Path
 Set oFolder = Nothing
End Function

viele Grüße
Karl-Heinz

Anzeige
AW: VBA: Suche Word Docs nach Wörtern
17.04.2020 12:27:05
Robin
Danke dir Karl-Heinz, aber leider funktioniert diese Version nicht. Die Suche liefert fehlerhafte Ergebnisse und in der Ergebnisspalte finden sich mit neben "kein Treffer" auch "mit" und "und". In den Zeilen sind mit diesen Ergebnissen finden sich auch nicht die zu findenden Dateien.
Die Einstellung zur Deaktivierung der Groß und Kleinschreibung hat mir aber bereits in Kmobination mit der vorherigen Version weiter geholfen. Dann beschränke ich mich erstmal auf 2 Suchbegriffe.
Vielen Dank für deine Mühe.
AW: VBA: Suche Word Docs nach Wörtern
17.04.2020 12:58:01
volti
Nun Robin,
bei dieser Variante hatte ich die Suchbegriffe ja auch nicht aus dem Blatt genommen, sondern zunächst einfach in den Code gesetzt:
sSuch = Split("Sehr,Hugo,und,mit", ",")
Deshalb treten "mit" und "und" auf. :-)
Man kann die auch irgendwie von einem Blatt zusammensammeln, Beispiel
Dim oRng As Range
  T = ""
  For Each oRng In Sheets("Vorgaben").Range("$D1:$D3")
   T = T & oRng.value & ","
  Next oRng
  sSuch = Split(Left$(T, Len(T) - 1), ",")

viele Grüße
KH
Anzeige

144 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige