mikes9
Goto Top

Makro für Excel-Suche

Hallo miteinander

Ich habe folgendes Problem:

Auf meinem PC befindet sich ein Ordner mit mehreren Excel Dateien (momentan 3, Tendenz steigend). Ich möchte nun ein Makro erstellen, welches sich in einer neuen Exceldatei (in einem anderen Ordner) befindet. Bei einem klick auf das Makro möchte ich gerne einen Suchbegriff eingeben, welcher alle Dateien im angegeben Ordner nach diesem Begriff durchsucht und die ganze Zeile in die Datei mit dem Makro kopiert.

Bis jetzt habe ich folgenden Code:


Sub dateien_durchsuchen_Click()
Dim wort$, fs As FileSearch, i%, efz%, wsA As Worksheet, wb As Workbook, ws As Worksheet, _
erg As Range
Application.DisplayAlerts = False
Application.ScreenUpdating = False

On Error Resume Next
Application.DisplayAlerts = False
ThisWorkbook.Worksheets("Auswahl").Delete
Application.DisplayAlerts = True
ThisWorkbook.Worksheets.Add.Name = "Auswahl"
Set wsA = ActiveWorkbook.Worksheets(1)

wort = InputBox("Suchwort")
Set fs = Application.FileSearch
With fs
' .LookIn = "\\192.168...\HakC\exceldateien"
.LookIn = "C:\Daten\Excel\1Projekte\FileTransfer_Allgemein"
.Filename = "*.xls"
.SearchSubFolders = False
.Execute
wsA.Range("A1").Value = "<" & wort & "> wurde in folgenden Dateien gefunden:"
wsA.Rows(1).Font.Bold = True

wsA.Range("B1").Value = "Dateiname"
wsA.Range("C1").Value = "1.Fundzelle"
For i = 1 To .FoundFiles.Count
Workbooks.Open .FoundFiles(i)
Set wb = ActiveWorkbook
Set ws = ActiveSheet
Set erg = Cells.Find(What:=wort, LookIn:=xlValues, LookAt:= _
xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False)
If Not erg Is Nothing Then
efz = wsA.Cells(Rows.Count, 1).End(xlUp).Row + 1
wsA.Cells(efz, 1).Value = .FoundFiles(i)
wsA.Cells(efz, 2).Value = Dir(.FoundFiles(i))
wsA.Cells(efz, 3).Value = erg.Address
End If
wb.Close False
Next i
End With
wsA.Columns.AutoFit
Application.DisplayAlerts = True
Application.ScreenUpdating = True

End Sub


Dieser funktioniert wunderbar, jedoch sieht das Suchergebnis nicht so aus wie ich es gerne hätte.

Es wird nur angezeigt in welcher Tabelle der gesuchte Begriff vorhanden ist. Wie könnte man den Code erweitern damit er alle Zeilen mit dem gesuchten Begriff kopiert?

Hoffe meine Frage ist versändlich face-smile

Besten Dank für eure Hilfe

Liebe Grüsse Mike

Content-Key: 202195

Url: https://administrator.de/contentid/202195

Printed on: April 18, 2024 at 23:04 o'clock

Member: colinardo
colinardo Feb 22, 2013 updated at 10:48:28 (UTC)
Goto Top
Hi Mike,
Dafür gibt es die Funktion .FindNext(x)
Denn die Suche hört nach der ersten Fundstelle auf. Du musst also so lange weitersuchen bis die FindNext-Methode keine Ergebnisse mehr liefert.

Die Struktur sieht so aus:
Set c = Cells.Find(.....)
If Not c Is Nothing Then
     firstAddress = c.Address
     Do
         'hier kommt der Code den du mit der Fund-Zeile machen willst
         Set c = Cells.FindNext(c)
     Loop While Not c Is Nothing And c.Address <> firstAddress
End If
c ist hierbei ein Objekt des Typs Range

Hoffe das hilft Dir weiter

Grüße Uwe
Member: MikeS9
MikeS9 Feb 27, 2013 at 07:09:28 (UTC)
Goto Top
Hallo Uwe

Danke für deine Antwort. Wo genau muss ich diese Funktion in meinem Code einfügen, kenn mich nicht so aus mit Makros.
Gäbe es auch eine Möglichkeit, dass alle Ergebnisse mit nur einem Klick auf Suchen angezeigt werden? Könnte als Ergebnis auch die ganze Zeile in die neue Tabelle kopiert werden?

Vielen Dank

Gruss Mike
Member: colinardo
colinardo Feb 27, 2013 updated at 10:55:59 (UTC)
Goto Top
Hi Mike,
die Stelle an dem der Code implantiert werden muss ist folgende:
..
...
Set wb = ActiveWorkbook
Set ws = ActiveSheet
Set erg = Cells.Find(What:=wort, LookIn:=xlValues, LookAt:= _
xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False)
If Not erg Is Nothing Then
     firstAddress = erg.Address 
     Do 
         efz = wsA.Cells(Rows.Count, 1).End(xlUp).Row + 1
         wsA.Cells(efz, 1).Value = .FoundFiles(i)
         wsA.Cells(efz, 2).Value = Dir(.FoundFiles(i))
         wsA.Cells(efz, 3).Value = erg.Address
         'Spalte 1 bis 5 der gefundenen Reihe ins neue Blatt in Spalte 4 kopieren  
         Range(erg.cells(1,1),erg.Cells(1,5)).Copy destination:=wsA.Cells(efz,4)
         Set erg = Cells.FindNext(erg)
     Loop While Not erg Is Nothing And erg.Address <> firstAddress 
End If
wb.Close False
...
..
Für das kopieren der ganzen Reihe musst du folgendes Beachten wenn du die Komplette Zeile also von Spalte A->unendlich kopieren willst kannst du folgenden Befehl nutzen:
BEACHTE aber folgendes: Die Zielzelle muss in einem Arbeitsblatt in der Spalte A liegen, da ansonsten z.B. bei einer Zielzelle "B1" der Platz am Ende der Zeile nicht mehr ausreichen würde um die ganze Zeile einzufügen.
erg.EntireRow.Copy destination:=[HIER DIE ZIELZELLE]
Für deinen Fall würde ich einen begrenzte Anzahl an Spalten kopieren(sie auch oben im Code):
Range(erg.cells(1,1),erg.Cells(1,5)).Copy destination:=wsA.Cells(efz,4)
Diese Zeile nimmt die ersten 5 Spalten und kopiert sie in deine neue Arbeitsmappe hinter deine 3 bisher gefüllten Spalten. Die Anzahl der Spalten kannst du ja nach deinem Gusto anpassen.

Hoffe das war soweit verständlich...

Grüße Uwe
Member: MikeS9
MikeS9 Feb 27, 2013 at 10:52:44 (UTC)
Goto Top
Hallo Uwe
Danke für die schnelle Antwort!

Habe nun folgendes Problem:

Ich habe die Datei mit dem Suchmakro auf dem Desktop. Die zu durchsuchenden Excel-Tabellen habe ich in einem eigenen Ordner. (Zum Testen habe ich extra eine kleine Excel-Tabelle genommen) Das Such-Makro habe ich mit folgdenem Code erstellt:


Sub dateien_durchsuchen_Click()
Dim wort$, fs As FileSearch, i%, efz%, wsA As Worksheet, wb As Workbook, ws As Worksheet, _
erg As Range
Application.DisplayAlerts = False
Application.ScreenUpdating = False

On Error Resume Next
Application.DisplayAlerts = False
ThisWorkbook.Worksheets("Auswahl").Delete
Application.DisplayAlerts = True
ThisWorkbook.Worksheets.Add.Name = "Auswahl"
Set wsA = ActiveWorkbook.Worksheets(1)

wort = InputBox("Suchwort")
Set fs = Application.FileSearch
With fs
' .LookIn = "\\192.168...\HakC\exceldateien"
.LookIn = "C:\...\...\..."
.Filename = "*.xls"
.SearchSubFolders = False
.Execute
wsA.Range("A1").Value = "<" & wort & "> wurde in folgenden Dateien gefunden:"
wsA.Rows(1).Font.Bold = True

wsA.Range("B1").Value = "Dateiname"
wsA.Range("C1").Value = "1.Fundzelle"
For i = 1 To .FoundFiles.Count
Workbooks.Open .FoundFiles(i)
Set wb = ActiveWorkbook
Set ws = ActiveSheet
Set erg = Cells.Find(What:=wort, LookIn:=xlValues, LookAt:= _
xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False)
If Not erg Is Nothing Then
firstAddress = c.Address
Do
efz = wsA.Cells(Rows.Count, 1).End(xlUp).Row + 1
wsA.Cells(efz, 1).Value = .FoundFiles(i)
wsA.Cells(efz, 2).Value = Dir(.FoundFiles(i))
wsA.Cells(efz, 3).Value = erg.Address
'Spalte 1 bis 5 der gefundenen Reihe ins neue Blatt in Spalte 4 kopieren
Range(erg.Cells(1, 1), erg.Cells(1, 2)).Copy Destination:=wsA.Cells(efz, 4)
Set erg = Cells.FindNext(erg)
Loop While Not erg Is Nothing And erg.Address <> firstAddress
End If
wb.Close False
Next i
End With
wsA.Columns.AutoFit
Application.DisplayAlerts = True
Application.ScreenUpdating = True

End Sub


Die Exceldatei (die die durchsucht wird) wird geöffnet. Leider passiert dann nichts mehr. Auch nach ca 5 Minuten nicht. Muss Excel dann mit dem Task-Manager beenden..

Was könnte da das Problem sein? Die Exceldatei hat nur 2 Datensätze (extra zum testen)

Danke im voraus!!
Member: colinardo
colinardo Feb 27, 2013 at 10:55:42 (UTC)
Goto Top
Sorry da ist mir ein kleiner Schreibfehler passiert:
firstAddress = c.Address
sollte so aussehen:
firstAddress = erg.Address
Member: MikeS9
MikeS9 Feb 28, 2013 at 07:16:15 (UTC)
Goto Top
Cool, super jetzt klappts! Vielen Dank! Jetzt habe ich nur noch ein kleines Problem. Ich möchte gerne, dass von jeder gefundenen Zeile die Spalten A-U kopiert werden.

Was muss ich da an meinem Code noch ändern?

Gruss Mike
Member: colinardo
colinardo Feb 28, 2013 updated at 08:15:13 (UTC)
Goto Top
Range(erg.Cells(1, 1), erg.Cells(1, 21)).Copy Destination:=wsA.Cells(efz, 4)
8-)
Member: MikeS9
MikeS9 Feb 28, 2013 at 07:56:29 (UTC)
Goto Top
So wird aber erst von der Spalte an kopiert, wo sich der gesuchte Begriff befindet. Ich möchte gerne dass die ganze zeile von A-U kopiert wird.

face-smile
Member: colinardo
colinardo Feb 28, 2013 at 08:13:21 (UTC)
Goto Top
Ach so, verstehe....

Range(erg.EntireRow.cells(1,1), erg.EntireRow.cells(1, 21)).Copy Destination:=wsA.Cells(efz, 4)
Member: MikeS9
MikeS9 Feb 28, 2013 at 08:23:24 (UTC)
Goto Top
Jetzt hats geklappt. 1000 Dank!

Liebe Grüsse Mike
Member: colinardo
colinardo Feb 28, 2013 at 08:24:55 (UTC)
Goto Top
Keine Ursache, bitte noch den Beitrag als gelöst markieren.. Danke