Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1796to1800
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

Makro umgestalten

Makro umgestalten
29.11.2020 12:08:20
stef26
Guten Tag liebe Forumsteilnehmer,
ich habe letzte Woche hier im Forum vom Matthias ein super Makro gebaut bekommen, welches mir aus 15.000 Word Dokumente 3 bestimmte Suchkriterien sucht und die ganze Zeile in der sich das Word befindet in Excel auflistet.
Nochmal recht herzlichen Dank dafür, das hat mir Wochenlanges suchen erleichtert. DANKE Matthias.
Nun habe ich einen ähnliche Fall, den ich mit dem Makro (welches für 3 Suchwörter bis zu 10h läuft leider so nicht benutzen kann. D. h. das Makro müsste nochmal etwas anders zusammengestellt werden.
Ich habe nun in der Spalte A die Datei in der gesucht werden soll.
In Spalte B bis Spalte AI stehen zur jeweiligen Datei die Suchwörter (33 Stück) die gesucht werden sollen.
Nun meine erneute unverschämte Bitte. Wer ist in der Lage das Makro so umzustricken, dass die 33Suchwörter der jeweiligen Datei gesucht werden, und würde das nochmal für mich für versuchen anzupassen?
Anbei das aktuelle Makro, was der Matthias so super erstellt hat:
Sub WordSuchExtraZeileViel()
Dim inhalt As Variant
Dim pfad, datnamem, kriterien(1 To 3)
Dim treffer(), fertig()
Dim temp
Dim zeile As Long, anzzeil As Long, krit As Long, spalte As Long
Dim startp As Long, endp As Long, nextp As Long
Dim erster As Boolean
Sheets("Suche-Word-Zeilen").Range("D1").Value = Now
On Error GoTo fehler
pfad = ActiveWorkbook.Path & "\"
datname = Dir(pfad & "*.doc*")
ReDim Preserve treffer(1 To 4, 1 To 2)
treffer(1, 1) = "Trefferübersicht"
kriterien(1) = ActiveWorkbook.ActiveSheet.Range("C1")
kriterien(2) = ActiveWorkbook.ActiveSheet.Range("E1")
kriterien(3) = ActiveWorkbook.ActiveSheet.Range("G1")
treffer(1, 2) = "Dateiname"
treffer(2, 2) = kriterien(1)
treffer(3, 2) = kriterien(2)
treffer(4, 2) = kriterien(3)
anzzeil = 2
erster = True
Do Until datname = ""
With GetObject(pfad & datname)
inhalt = .Content
.Close SaveChanges:=False
End With
'Inhalt nach Zeilen aufsplitten
temp = Split(inhalt, Chr(13))
anzzeil = anzzeil + 1
startp = anzzeil
endp = startp
ReDim Preserve treffer(1 To 4, 1 To anzzeil)
treffer(1, anzzeil) = datname
For krit = 1 To 3
If kriterien(krit)  "" Then
If InStr(1, inhalt, kriterien(krit), vbTextCompare) > 0 Then
nextp = startp
For zeile = 0 To UBound(temp)
If InStr(1, temp(zeile), kriterien(krit), vbTextCompare) > 0 Then
If nextp  endp Then endp = nextp - 1
Else
treffer(krit + 1, startp) = "kein Treffer"
End If
End If
Next
datname = Dir
Loop
ReDim fertig(1 To UBound(treffer, 2), 1 To 4)
For zeile = 1 To 4
For spalte = 1 To UBound(treffer, 2)
fertig(spalte, zeile) = treffer(zeile, spalte)
Next spalte
Next zeile
Cells(2, 1).Resize(UBound(treffer, 2), 4) = fertig
Sheets("Suche-Word-Zeilen").Range("F1").Value = Now
Exit Sub
fehler:
MsgBox "Irgendwas ist schief gelaufen!"
End Sub

Liebe Gruesse
Stefan

24
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Makro umgestalten
29.11.2020 13:52:22
onur
Nach deinen Angaben braucht das Makro für 15.000 Dateien und 3 Wörtern 10 Stunden, also 2,4 sec pro Datei.
Und wir sollen (für lau natürlich) diesen Code für dich stundenlang analysieren, testen und optimieren, damit er wesentlich schneller läuft?
Selbst wenn er 11 mal so schnell gemacht werden könnte, würde er für 33 Suchwörter wieder 10 Stunden brauchen.
"unverschämte Bitte" ? - Stimmt absolut.
AW: Makro umgestalten
29.11.2020 14:19:22
stef26
Hallo Onur,
du musst gar nichts machen. Das ist das schöne an diesem Forum, dass keiner was machen muss.
Zudem hast du die Aufgabe vermutlich nicht ganz verstanden.
Der Matthias hat hier schon 90% der Arbeit geleistet. Bei ihm hab ich mir wirklich schon überlegt wie ich ihm da das auch mit einer Aufmerksamkeit danken kann.
Hier geht es nicht um Analysen oder der Art, da das Makro alles macht was es tun soll.
Ich hab auch kein Wort verloren, dass das Makro zu langsam läuft.
Da das Makro meist über Nacht läuft ist die Performance völlig ausreichend.
Bei der neuen Anforderung hab ich mir einen kleinen Teil der vielen DOK in einen anderen Ordner Kopiert. So dass nur in einem Bruchteil an Dok (ca. 1500) gesucht werden muss.
Allerdings hab ich zu jeder Suche 33 statt bisher 3 Suchwörter.
D.h. eigentlich bräuchte ich vermutlich 2 Schleifen.
Die eine müsste 11x laufen je 3 Suchwörter suchen und zurückgeben. Das habe ich versucht zu machen, aber auch da stoße ich auf meine VBA Grenzen.
Was vermutlich schwieriger zu lösen ist, ist dass nur noch in einer Datei gesucht werden soll und nicht mehr in allen Dateien. Diese Schleife müsste dann Von A2 bis Ende wiederholt werden.
Wenn der Aufwand zu groß ist, dann bitte um Rückmeldung, das dies für eine freiwillige Programmierung zu Aufwendig ist, dann könnte ich das was ich vorhabe halt leider nicht realisieren.
Wie schon gesagt es geht nicht um irgendwelche Analysen.
Liebe Grüsse
Stefan
Anzeige
AW: Makro umgestalten
29.11.2020 14:24:41
onur
Das ist natürlich was Anderes - da meldet sich bestimmt Jemand dazu.
Du solltest aber besser die (Beispiels-) Datei und noch irgend eine Textdatei (wo die gesuchten Wörter enthalten sind) posten, damit man das besser testen und realisieren kann.
AW: Makro umgestalten
29.11.2020 14:29:20
stef26
Hallo Onur,
ja den Upload hatte ich mir schon überlegt, jedoch weiß ich nicht wie ich 3 oder 4 Word Dokumente mit einer Excelliste hochlade, da man hier glaub ich kein ZIP hochladen kann...
Gruß
Stefan
AW: Makro umgestalten
29.11.2020 14:30:31
onur
Doch - zip geht.
AW: Makro umgestalten
29.11.2020 14:48:46
stef26
Hall nochmal,
ok wusste ich gar nicht. Hab mal einen kleinen Beispiel Datensatz erzeugt...
https://www.herber.de/bbs/user/141927.zip
Da sind ein paar Dok und die bisherige Such Excel enthalten.
Ich hoffe der Aufwand dazu hält sich in Grenzen. Wenn es zu viel Arbeit ist, dann bitte nicht umsetzen...
Besten Dank das ihr euch das zu minderst mal anseht.
Liebe Grüße
Stefan
Anzeige
AW: Makro umgestalten
29.11.2020 20:14:13
stef26
Hallo nochmal,
ich habe mit Google Hilfe mal versucht die beiden Schleifen zu programmieren.
Leider hab ich`s nicht ganz geschafft, so wie ich das erhofft hatte.
Mein Ziel war den Code vom Matthias nicht zu verändern und drum rum zwei Schleifen zu basteln, die mir es dann erlauben die 33 Suchwörter (mit jeder Schleife 3 Suchwörter) zu suchen und zwar immer nur in der Datei, in die Dateischleife steht.
Aber da sieht man, dass das VBA technisch noch zu komplex ist für mich.
Das Makro läuft erst gar nicht an und bleibt
Sub WordSuchExtraZeileViel()
Dim inhalt As Variant
Dim pfad, datnamem, kriterien(1 To 3)
Dim treffer(), fertig()
Dim temp
Dim zeile As Long, anzzeil As Long, krit As Long, spalte As Long
Dim startp As Long, endp As Long, nextp As Long
Dim erster As Boolean
Dim Zelle As Range
Dim i As Integer
Dim SpalteSuch As Integer
Sheets("Zeit").Range("D1").Value = Now
Sheets("Ergebnis").Activate
treffer(1, 1) = "Trefferübersicht"
treffer(1, 2) = "Dateiname"
treffer(2, 2) = kriterien(1)
treffer(3, 2) = kriterien(2)
treffer(4, 2) = kriterien(3)
On Error GoTo fehler
'Dateinamen einlesen Schleife
For Each Zelle In Sheets("Suchen").Range("A2:A" & Cells(Rows.Count, "A").End(xlUp).Row)
If Zelle  "" Then
pfad = ActiveWorkbook.Path & "\"
datname = pfad & Sheets("Suchen").Cells(Rows.Count, "A").Value
ReDim Preserve treffer(1 To 4, 1 To 2)
'11er Schleife
For i = 1 To 11
SpalteSuch = i * 3
kriterien(1) = Sheets("Suchen").Cells(Rows.Count, SpalteSuch - 1)
kriterien(2) = Sheets("Suchen").Cells(Rows.Count, SpalteSuch)
kriterien(3) = Sheets("Suchen").Cells(Rows.Count, SpalteSuch + 1)
anzzeil = 2
erster = True
Do Until datname = ""
With GetObject(pfad & datname)
inhalt = .Content
.Close SaveChanges:=False
End With
'Inhalt nach Zeilen aufsplitten
temp = Split(inhalt, Chr(13))
anzzeil = anzzeil + 1
startp = anzzeil
endp = startp
ReDim Preserve treffer(1 To 4, 1 To anzzeil)
treffer(1, anzzeil) = datname
For krit = 1 To 3
If kriterien(krit)  "" Then
If InStr(1, inhalt, kriterien(krit), vbTextCompare) > 0 Then
nextp = startp
For zeile = 0 To UBound(temp)
If InStr(1, temp(zeile), kriterien(krit), vbTextCompare) > 0 Then
If nextp  endp Then endp = nextp - 1
Else
treffer(krit + 1, startp) = "kein Treffer"
End If
End If
Next
datname = Dir
Loop
ReDim fertig(1 To UBound(treffer, 2), 1 To 4)
For zeile = 1 To 4
For spalte = 1 To UBound(treffer, 2)
fertig(spalte, zeile) = treffer(zeile, spalte)
Next spalte
Next zeile
Sheets("Suchen").Cells(2, 1).Resize(UBound(treffer, 2), 4) = fertig
Next i
i = 0
End If
Next
Sheets("Zeit").Range("F1").Value = Now
Exit Sub
fehler:
MsgBox "Irgendwas ist schief gelaufen!"
End Sub

Vielleicht kann ja einer mal draufschauen, was ich da alles falsch gemacht habe...
Gruß
Stefan
Anzeige
AW: Makro umgestalten
29.11.2020 21:18:06
Matthias
Moin!
Mal noch als Frage zum Programm. Brauchst du wieder die Zeilen (falls es mehrfach vorkommt) oder reicht dir die Aussage, dass es vorhanden ist bzw. wie oft? Je nachdem sollte die Schleife ggf. anders aussehen bzw. kann man den Code vereinfachen. Kommt dann aber auch wieder darauf an, ob du mehrere Treffer in einer Zelle oder je einer extra Zeile haben willst oder halt nur die Anzahl der Treffer.
Bzgl. der Performance, könntest du wie letztens geschrieben, mal schauen, ob es sich ändert, wenn du Word durchgehend offen lässt und nicht bei jeder Datei öffnest.
Vllt. helfen die Angaben auch anderen bei der Erstellung.
Falls du übrigens den Code bzw. die Gedanken dahinter erklärt haben willst (Kommentare bzw. allgemeines) einfach melden.
VG
Anzeige
AW: Makro umgestalten
29.11.2020 21:29:00
stef26
Hallo Matthias,
schön von dir zu hören. Deine Zeilen lesen sich wie ein Wunschkonzert.
Wenn ich mir es aussuchen könnte, dann wäre die Ganze Zeile in einer extra Zelle optimal.
Die Rückgabe ob es vorhanden ist reicht mir da leider nicht.
Zur Performance. Nur wenn ein beliebiges Word Dokument beim Start des Makros offen ist läuft es optimal. Ist kein Word offen, dann würde es vermutlich Wochen dauern.
Das mit der Performance ist mit dem geöffneten Word völlig ausreichend.
Hab selber versucht da irgendwie Scheifen rein zu bekommen, jedoch hab ich da vermutlich mehr falsch als richtig gemacht...
Treffer könnten im Word Dokument durchaus mehrfach vorkommen.
Liebe Grüße
Stefan
Anzeige
AW: Makro umgestalten
30.11.2020 21:23:29
Matthias
Moin!
Also habe den Code mal umgebaut. Erscheint nur auf den 1. Blick etwas länger - ist aber fast der gleiche Code. Habe ein paar Kommentare mit eingefügt - man soll ja auch verstehen, was der Code macht und am besten auch noch warum.
Bzgl. des Eintragens, war ich mir nicht sicher. Trage jetzt erstmal alles unter die Suchkiterien ein. Ist dort aber ungünstig, wenn man den Code nochmal durchlaufen lässt (die Zeilen werden dann mit ausgewertet). Wußte aber nicht, wo es im zweiten Blatt hin soll. Bitte mal testen - aber nicht gleich an tausenden von Dateien, 5 bis 10 reichen vllt. am Anfang. :-) Bei der Schnelligkeit, bin ich mir nicht sicher, ob man da viel rausholen kann. Da du ja jeden Treffer haben willst, muss man entweder alle Zellen im Array durchgehen oder es berechnen. Zum Berechnen habe ich grad ne Idee aber ehrlich gesagt heute keine Lust, dass duchzuprogrammieren. Bleibt noch was für die Tage. Evtl. könnte man noch was beim Öffnen rausholen - das muss man aber mal testen. Das hier ist deshalb mal eine (hoffentlich :-) ) 1. lauffähige Version.
Sub WordSuchExtraZeileViel()
'das würde ich eigentlich raus nehmen
On Error GoTo fehler
Dim inhalt As Variant
Dim pfad, datnam, blatt
Dim treffer(), fertig(), daten
Dim temp, aktkrit
Dim zeile As Long, anzzeil As Long, krit As Long, spalte As Long, ende As Long, zeildat As Long
Dim startp As Long, endp As Long, nextp As Long
'festlegen des Blattes, wo die Kriterien stehen
Set blatt = Worksheets("Suchen")
Sheets("Suche-Word-Zeilen").Range("D1").Value = Now
pfad = ActiveWorkbook.Path & "\"
'suchen der letzen Zeile in Spalte A, dient auch als index für den Durchlauf
ende = blatt.Cells(blatt.Rows.Count, 1).End(xlUp).Row
'einlesen der ganzen Daten (NAmen und Suchkriterien) in ein array;
'die fixe Spaltenzal 35 könnte man auch noch dynamisch ermitteln
daten = blatt.Range("A1").Resize(ende, 35)
'das wird wieder das array für die Auswertung
'um einfacher spalten hinzuzufügen, ist es erst noch gedreht
'deshalb gibt es 35 Zeilen, und die Spaltenzahl wächst dann
ReDim Preserve treffer(1 To 35, 1 To 1)
treffer(1, 1) = "Trefferübersicht"
'gibt die Anzahl der Spalten (spätere Zeilen an)
anzzeil = 1
'jetzt sind alle Startvariablen fertig
'nun können die Schleifen beginnen
For zeildat = 2 To ende
'neue Zeile für die Datei anlegen, dazu die Spaltenanzeil erhöhen
anzzeil = anzzeil + 1
ReDim Preserve treffer(1 To 35, 1 To anzzeil)
'Überschriften eintragen
treffer(1, anzzeil) = daten(zeildat, 1)
'jetzt durch die DAten gehen, die Starten dabei in Zeile 2 da in 1 die Überschriften stehen
'falls eine leere Zeile auftritt, passiert nix
If daten(zeildat, 1)  "" Then
'da deine Daten docx sind, du hier aber doc stehen hast, nehme ich den Teil ohne die  _
Endung und packe docx dran
datnam = Split(daten(zeildat, 1), ".")(0) & ".docx"
'nochmal prüfen, ob die Datei existiert, sonst würde ein Fehler auftreten
If Dir(pfad & datnam)  "" Then
'Datei öffnen und inhalt auslesen
With GetObject(pfad & datnam)
inhalt = .Content
.Close SaveChanges:=False
End With
'jetzt den INhalt am Zeilenumbruch splitten, das entstehende Array ist 0 basiert
'und hat in jedem Arrayfeld eine Zeile
temp = Split(inhalt, Chr(13))
'jetzt zur besseren Übersicht in die 1. Zeile nochmal die Kriterien eintragen
For spalte = 2 To 35
treffer(spalte, anzzeil) = daten(zeildat, spalte)
Next
'jetzt die nächste Spalte für die Fundstellen bzw. den Vermerk, wenn da nix war  _
anlegen
anzzeil = anzzeil + 1
ReDim Preserve treffer(1 To 35, 1 To anzzeil)
'noch 2 "Pointer" mit den POsitionen im Array, um die Treffer in den Spalten genau  _
einzutragen
startp = anzzeil
endp = startp
'jetzt eine Schleife duch die Kriterien
For krit = 1 To 34
'wenn Kriteritum nicht leer ist
aktkrit = daten(zeildat, krit + 1)
If aktkrit  "" Then
'jetzt prüfen, ob der Wert im ganzen Inhalt vorkommt, wenn nicht Vermerk  _
eintragen
If InStr(1, inhalt, aktkrit, vbTextCompare) > 0 Then
'pointer zum durcharbeiten setzen
nextp = startp
'jetzt durch alle Zeile der Datei gehen und auswerten
For zeile = 0 To UBound(temp)
'jetzt prüfen, ob der Inhalt in der Zeile vorkommt
If InStr(1, temp(zeile), aktkrit, vbTextCompare) > 0 Then
'Treffer, prüfen, ob wir noch eine Spalte zum eintagen haben
If nextp  endp Then endp = nextp - 1
Else
treffer(krit + 1, startp) = "kein Treffer"
End If
End If 'Prüfung auf leer
Next 'kriteritum
Else
'Datei wurde nicht gefunden
treffer(2, anzzeil) = "Datei wurde nicht gefunden"
End If
Else
'Feld in Spalte A war leer
treffer(2, anzzeil) = "Feld ist leer"
End If
Next
'jetzte das Array zum Eintragen anlegen, hierein werden die Daten jetzte "reingedreht"
ReDim fertig(1 To UBound(treffer, 2), 1 To 35)
'durch alle Spalten und Zeilen gehen und die Daten in die Senkrechte drehen
For zeile = 1 To 4
For spalte = 1 To UBound(treffer, 2)
fertig(spalte, zeile) = treffer(zeile, spalte)
Next spalte
Next zeile
'jetzt im Blatt suchen ganz am Ende die Daten eintragen
'hier ggf. anstelle von blatt ein anderes Worksheet nehmen
blatt.Cells(ende + 1, 1).Resize(UBound(treffer, 2), 35) = fertig
Sheets("Suche-Word-Zeilen").Range("F1").Value = Now
MsgBox "Fertig"
Exit Sub
fehler:
MsgBox "Irgendwas ist schief gelaufen!"
End Sub

VG
Anzeige
AW: Makro umgestalten
01.12.2020 08:25:12
Matthias
Moin!
Beim Zähneputzen ist mir eingefallen, dass noch ein Fehler drin ist. Und zwar beim Drehen, nehme ich zuwenig Spalten. Deshalb die Zeile hier
For zeile = 1 To 4

in das umwandeln.
For zeile = 1 To 35

VG
AW: Makro umgestalten
01.12.2020 19:39:42
stef26
Hallo Matthias,
ein herzliches Dankeschön für deine Unterstützung.
Gibt es die Möglichkeit dir eine Kleinigkeit zukommen zu lassen?
Liebe Grüße
Stefan
AW: Makro umgestalten
02.12.2020 18:33:28
Matthias
Moin!
Auf die Frage ein klares Nein. :-)
Abgesehen davon sind wir ja noch nicht fertig - zumindest wenn es nach mir geht. Das ist jetzt eine funktionsfähige Version. DA kann man aber noch was optimieren. Zum einen kann man das Einlesen optimieren und dann noch das Auswerten.
Für das Einlesen habe ich mal anbei eine Testdatei. Dort sind 4 Buttons mit jeweils anderen bzw. leicht modifizierten Vorgehen. Jeder Button braucht ca. 5 Minuten. Dazu noch eine word-Datei mit dem Namen test.docx in den selben Ordner legen. Der Inhalt der Datei, sollte ungfähr genauso groß, wie deine Dateien sind. Wenn du die 4 getestet hast, kann man deinen Code mit der besten Variant schonmal beschleunigen. Bei mir war die bisherige am langsamsten. Ist zwar nur marginal aber auf die Menge könnte es sich dann auswirken. Beim Testen wird die angelegte Datei 10, 50, 100 und 200 mal geöffnet und ausgelesen und die dafür benötigte Zeit in die Tabelle daneben eingetragen.
https://www.herber.de/bbs/user/142017.xlsm
Beim Auswerten muss ich nochmal testen.
VG
Anzeige
AW: Makro umgestalten
02.12.2020 21:49:55
stef26
Hallo Matthias,
ich habe deine Test XLS mal gestartet,
Bei 1 & 2 sehe ich nicht wo er die benötigte Zeit eingetragen hat.
Bei 3 & 4 läuft er auf Fehler.
Ich bin der Version die du mir gemacht hast sehr zufrieden.
Die Performance spielt für mich kaum ne Rolle, da ich die Suchen sowieso über Nacht laufen lasse.
Da wären ggf. andere Themen die bei der Suche an sich noch interessant wären, aber damit möchte ich gar nicht anfangen.
Wie schon gesagt ich bin eigentlich wunschlos glücklich.
Liebe Grüße
Stefan
AW: Makro umgestalten
03.12.2020 11:00:43
Matthias
Moin!
Die Zeiten wären unten in den Zeilen 6 bis 9 eingetragen.
Habe nochmal bzgl. des Auswertens getestet. Da ist meine andere Variante aber nicht wesentlich langsamer.
Würde es daher so belassen, wenn es dich eh nichg stört.
Jetzt wäre ansonsten die einmalige Chance die anderen Sachen bei der Suche noch zu erwähnen. :-) Fragen kostet bekanntlich nichts (oder zumindest nicht immer)
VG
Anzeige
AW: Makro umgestalten
03.12.2020 21:12:29
stef26
Hallo Matthias,
ich bin eigentlich wunschlos glücklich.
Wenn überhaupt könnte ich mir vorstellen, dass man die Suche an sich ändert.
Das man 2 Suchwörter hat und nicht eine Zeile ausgibt,
sondern alles was ab Suchwort1 bis zum Suchwort 2 ausgegeben wird.
Wie schon gesagt, ist kein muss, da ich weiß, dass man hier den kompletten Code umschreiben müsste.
Liebe Grüsse
Stefan
AW: Makro umgestalten
03.12.2020 21:35:22
Matthias
Moin!
Das ist kein großer Aufwand. Wäre vermtl. sogar schneller als die jetzige Version. Code hätte ich schon im Kopf. Frage wäre nur, was machen wenn einer der beiden Suchwärter nicht vorkommt. Dann nichts kopieren oder nur bis bzw. ab dem vorhandenen Wert?
Das bezieht sich jetzt auch die 33 Suchwerte oder die 1. Variante mit den 3 WErten. Oder willst du die beiden Suchwert als neue Version (wenn ja, wo stehen die im Blatt)
Wie gesagt, die paar Infos musst du noch nachsteuern, dann ist das Ruckzuck geändert.
VG
Anzeige
AW: Makro umgestalten
03.12.2020 21:58:03
Matthias
Achja, noch ne Frage: Was soll passieren, wenn die Wörte mehrfach vorkommen? Immer nur den 1. berücksichtigen?
VG
AW: Makro umgestalten
03.12.2020 22:39:46
stef26
Hi,
du bist echt der Hammer.
Da wünschte ich mir ich könnte das auch. Ich verfolge immer wieder Post in diesem Forum. Nur um zu lernen. Kann mittlerweile auch schon ganz ganz einfache Codes umsetzen.
Aber so coolen Support ist schon einzigartig.
Wenn ich es selber programmieren könnte würde ich es so versuchen.
a) durchsuchen nur die Dateien die in Spalte A gelistet sind
b) Kommt die Kombination zwischen Startwort und Endwort öfters vor, dann mehrfach auflisten
Denke da z.B. an solche Zeichen --- diese Trennen in den Word Dokumenten verschiedene Themengebiete
c) Kommt die Kombi nicht vor dann weiter mit nächster Word Datei
d) Kommt nur Start Suchwort, dann bis Ende
e) Kommt nur Ende. dann von Beginn an bis Ende
Gruß
Stefan
AW: Makro umgestalten
04.12.2020 16:53:52
Matthias
Moin!
Also hier wäre mal meine Variante dafür. Die Suchkriterien stehen in B1 und c1. Ggf. noch im Code ändern. Die Prüfung erledigt jetzt folgendes (dabei ist K1 das erste und K2 das zweite Suchkriteritum):
- weder K1 noch K2 : nix
- nur K1: ab K1 bis Ende
- nur K2: Anfang bis K2
- K1 und K2: jeweils vom K1 bis zum nächsten K2 (dazwischen befindliche K1 werden mitgenommen), das Ganze so oft, wie Paare möglich. Sollte am Ende noch ein K1 ohne K2 existieren, dann ab dem K1 bis zum Ende
Ansonsten ist der Code am Anfang und Ende identisch wie bisher. Habe ledilgich die Kommentare rausgemacht. Wie immer einfach testen.
Sub WordSuchExtraZeileViel()
'das würde ich eigentlich raus nehmen
On Error GoTo fehler
Dim inhalt As Variant
Dim pfad, datnam, blatt
Dim treffer(), fertig(), daten
Dim temp, aktkrit
Dim zeile As Long, anzzeil As Long, krit As Long, spalte As Long, ende As Long, zeildat As Long
Dim spaltanz As Long
Dim suchanf, suchend, posk2, arrpos
Dim eintragen As Boolean
Set blatt = Worksheets("Suchen")
Sheets("Suche-Word-Zeilen").Range("D1").Value = Now
pfad = ActiveWorkbook.Path & "\"
ende = blatt.Cells(blatt.Rows.Count, 1).End(xlUp).Row
daten = blatt.Cells(1, 1).Resize(ende, 1)
'hier ggf. die Adrsse der Suchkriterien ändern
suchanf = blatt.Cells(1, 2)
suchend = blatt.Cells(1, 3)
spaltanz = 2
ReDim Preserve treffer(1 To spaltanz, 1 To 1)
treffer(1, 1) = "Trefferübersicht"
anzzeil = 1
For zeildat = 2 To ende
anzzeil = anzzeil + 1
arrpos = anzzeil
ReDim Preserve treffer(1 To spaltanz, 1 To anzzeil)
treffer(1, anzzeil) = daten(zeildat, 1)
If daten(zeildat, 1)  "" Then
datnam = Split(daten(zeildat, 1), ".")(0) & ".docx"
If Dir(pfad & datnam)  "" Then
'Datei öffnen und inhalt auslesen
With GetObject(pfad & datnam)
inhalt = .Content
.Close SaveChanges:=False
End With
tempk1 = Split(inhalt, suchanf)
tempk2 = Split(inhalt, suchend)
If UBound(tempk1) = 0 And UBound(tempk2) = 0 Then
'beide Werte nicht gefunden
treffer(2, anzzeil) = "kein Treffer"
Else
If UBound(tempk1) = 1 And UBound(tempk2) = 0 Then
'start ist da, ende nicht
treffer(2, anzzeil) = Replace(inhalt, tempk1(0), "", 1, 1, vbTextCompare)
ElseIf UBound(tempk1) = 0 And UBound(tempk2) = 1 Then
'ende ist da, start nicht
treffer(2, anzzeil) = tempk2(0) & suchend
Else
'beide Werte kommen vor
For spalte = 1 To UBound(tempk1)
eintragen = True
posk2 = InStr(1, tempk1(spalte), suchend)
If posk2 = 0 Then
temp = temp & suchanf & tempk1(spalte)
eintragen = False
Else
temp = temp & suchanf & Split(tempk1(spalte), suchend)(0) & suchend
eintragen = True
End If
If eintragen = True Or (temp  "" And spalte = UBound(tempk1)) Then
'wenn letztes K1 bis E>nde nicht, dann den or Teil raus
If arrpos > anzzeil Then
anzzeil = anzzeil + 1
ReDim Preserve treffer(1 To spaltanz, 1 To anzzeil)
treffer(2, anzzeil) = temp
arrpos = arrpos + 1
temp = ""
Else
treffer(2, anzzeil) = temp
arrpos = arrpos + 1
temp = ""
End If
End If
Next
End If
End If
Else
treffer(2, anzzeil) = "Datei wurde nicht gefunden"
End If
Else
treffer(2, anzzeil) = "Feld ist leer"
End If
Next
ReDim fertig(1 To UBound(treffer, 2), 1 To spaltanz)
For zeile = 1 To spaltanz
For spalte = 1 To UBound(treffer, 2)
fertig(spalte, zeile) = treffer(zeile, spalte)
Next spalte
Next zeile
blatt.Cells(ende + 1, 1).Resize(UBound(treffer, 2), spaltanz) = fertig
Sheets("Suche-Word-Zeilen").Range("F1").Value = Now
MsgBox "Fertig"
Exit Sub
fehler:
MsgBox "Irgendwas ist schief gelaufen!"
End Sub
VG
AW: Makro umgestalten
04.12.2020 20:09:48
stef26
Hallo Matthias,
wie schon erwähnt. Du bist echt der Hammer.
Werde den Code mal über Sonntag Nacht laufen lassen.
Kann dir am Montag nochmal Rückmeldung geben.
Bisher ist alles super gelaufen und ich konnte schon einige Auswertungen machen.
Vielen Dank für so viel Mühe.
Liebe Grüße
Stefan
AW: Makro umgestalten
05.12.2020 18:23:01
stef26
Hallo Matthias,
läuft wie erwartet super.
Eine Frage hätte ich jedoch allegemein für alle Suchmakros.
Bisher such ich Doc danach nochmal docx.
Wenn ich auf doc* gehe macht er leider nichts.
Gibt es die Möglichkeit, dass er in beiden Formaten nachschauen kann?
Liebe Grüße
Stefan
AW: Makro umgestalten
05.12.2020 20:39:44
Matthias
Moin!
Also wenn in deiner Excelliste schon die richtigen Endungen sind, dann wäre es so wie unten am einfachsten. Da die Dateinamen in der Datei und deinen Beispielen unterschiedlich waren, hatte ich es so angepasst. Ändere das hier.
If daten(zeildat, 1)  "" Then
datnam = Split(daten(zeildat, 1), ".")(0) & ".docx"
If Dir(pfad & datnam)  "" Then
in das
If daten(zeildat, 1)  "" Then
datnam = daten(zeildat, 1)
If Dir(pfad & datnam)  "" Then

Damit nimmt er jetzt direkt den Namen aus dem Blatt. Sollte die Datei nicht existieren, kommt weiterhin die Meldung, das die Datei nicht gefunden wurde. Notfalls könnte man noch einbauen, dass er die Dateinamen mit beiden Endungen probiert. Könnte dann aber auch u.U. zwei Treffer geben.
Könnte sein, dass der Threat heute oder morgen abläuft. Wenn noch was geändert werden sollte, ggf. nochmal einen neuen aufmachen.
VG
AW: Makro umgestalten
05.12.2020 23:09:17
stef26
Hallo Matthias, ok MOIN! :-)
ach ja jetzt weiß ich auch warum der Code
If daten(zeildat, 1) "" Then
datnam = daten(zeildat, 1)
If Dir(pfad & datnam) "" Then
auf Fehler gelaufen ist. Ich hatte noch eine Kopie der XLS in der ich Suche.
Hab die rausgenommen, dann läufts auch.
Danke; Moin und ein schönes Wochenende!
:-)
Stefan

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige