ich habe gerade eine Blockade und bräuchte daher einmal Eure Hilfe.
Ich passe gerade ein Makro an. Dieses möchte ich gerne allgemein nutzbar machen. Den Pfad habe ich schon über einen Folder-Picker erweitert.
Momentan werden in allen xlsx-Dateien eines Verzeichnisses vorgegebene Spalten anhand der vorgegebenen Überschriften durchsucht.
Dieses möchte ich allerdings ändern, so dass alle genutzen Spalten durchsucht werden. Ich habe den Abschnitt entsprechend kommentiert.
Es wäre super, wenn jemand von Euch weiß wie ich die Stelle am besten ändern muss.
Danke und Viele Grüße
Marco
Sub SearchAndCopyData()
'Variablen
Dim fso As Object, strFind As String, wsTarget As Worksheet, file As Object, sh As _
Worksheet, rngCol As Range, c As Range, firstAddress As String, dblKosten As String, strFolder As String, strHeader As Variant
'Ordner in dem sich die xlsx-Dateien befinden (im Beispiel der aktuelle Pfad in dem sich _
diese Mappe befindet)
Dim oFileDialog As FileDialog
Set oFileDialog = Application.FileDialog(msoFileDialogFolderPicker)
With oFileDialog
.Title = "Wählen Sie bitte den gewünschten Ordner aus!"
.ButtonName = "Übernehmen"
.InitialFileName = "C:\"
.Show
strFolder = .SelectedItems(1)
End With
Set oFileDialog = Nothing
'Objekte
Set fso = CreateObject("Scripting.FileSystemObject")
'Sheet festlegen in das die Daten kopiert werden
Set wsTarget = Sheets(1)
'Eingabeaufforderung für die Nummer
strFind = InputBox("Wonach wollen Sie suchen:", "Inhalt suchen", "Suchwort")
If strFind "" Then
'Screenflicker und Dialoge unterdrücken
Application.ScreenUpdating = False
Application.DisplayAlerts = False
'Ausgabebereich löschen
wsTarget.Range("A2:DK1000").Clear
'Für jede Datei im Ordner ...
For Each file In fso.GetFolder(strFolder).Files
'Wenn es eine 'xlsx' Datei ist
If LCase(fso.GetExtensionName(file.Name)) = "xlsx" Then
'Mappe öffnen
Set wbSearch = GetObject(file.Path)
' Alle Sheets der Datei durchsuchen
For Each sh In wbSearch.Sheets
With sh.UsedRange
'Suche Spaltenüberschrift
'!!!Hier möchte ich, dass anstelle von Spaltennamen Alle genutzten Spalten _
durchsucht werden!!!
For Each strHeader In Array("SPALTE1", "SPALTE2", "SPALTE3")
Set rngCol = sh.UsedRange.Find(strHeader, LookIn:=xlValues, LookAt:= _
xlWhole)
If Not rngCol Is Nothing Then Exit For
Next
'Wurde eine der Spalten gefunden, suche Inhalt
If Not rngCol Is Nothing Then
Set c = .Find(strFind, LookIn:=xlValues, LookAt:=xlWhole)
If Not c Is Nothing Then
firstAddress = c.Address
Do
'Nummer wurde gefunden ... extrahiere Wert
dblKosten = sh.Cells(c.Row, rngCol.Column).Value
' und schreibe Ihn in unser Sammelsheet in die nächste _
freie Zeile zusammen mit Inventarnummer und Pfad zur Datei
wsTarget.Cells(Rows.Count, "A").End(xlUp).Offset(1, 0). _
Resize(1, 3).Value = Array(strFind, dblKosten, file.Path)
'Suche weiter
Set c = .FindNext(c)
Loop While Not c Is Nothing And c.Address firstAddress
End If
End If
End With
Next
' schließe die Mappe
wbSearch.Close False
End If
Next
'Spaltenbreiten automatisch anpassen
wsTarget.Range("A:D").EntireColumn.AutoFit
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End If
End Sub