Mithilfe eines Makros mehrere Excel-Datein nach einem Begriff durchsuchen und Daten kopieren
Hallo Zusammen,
ich bin ein absoluter Neuling in Sachen Makro – VBA Programmierung. Deshalb benötige ich eure Hilfe bei der Erstellung für folgendes Makro:
In einer Excel-Datei soll ein InputBox geöffnet werden, diese eine Nummer abfragt.
Es sollen 3 Excel-Dateien nach dieser Nummer durchsucht werden, diese folgendermaßen gleich aufgebaut sind:
-1. Datei:
Name: List_akutell
Zu durchsuchendes Blatt (Name): Basisdaten
Spalte: B
-2. Datei:
Name: List_alt
Zu durchsuchendes Blatt (Name): Prio 2
Spalte: B
-3. Datei:
Name: List_zukunft
Zu durchsuchendes Blatt (Name): Tabelle 1
Spalte: B
Falls diese Nummer in den verschieden Dateien gefunden wird, sollen die kompletten Zeilen in die aktuelle Datei kopiert/angezeigt werden.
Über Hilfe wäre sich sehr, sehr dankbar
Viele Grüße
Eli
PS: Ich habe bereits im Forum eine ähnliche Frage gefunden:
Excel 2007 - Mehrere Excel-Dateien nach einem Wert duchsuchen und dazugeh. Daten abspeichern
Allerdings möchte ich mehrere Datein durchsuchen und keine neue Excel-Datei erstellen. Außerdem funktioniert das Makro bei Excel 2013 nicht.
ich bin ein absoluter Neuling in Sachen Makro – VBA Programmierung. Deshalb benötige ich eure Hilfe bei der Erstellung für folgendes Makro:
In einer Excel-Datei soll ein InputBox geöffnet werden, diese eine Nummer abfragt.
Es sollen 3 Excel-Dateien nach dieser Nummer durchsucht werden, diese folgendermaßen gleich aufgebaut sind:
-1. Datei:
Name: List_akutell
Zu durchsuchendes Blatt (Name): Basisdaten
Spalte: B
-2. Datei:
Name: List_alt
Zu durchsuchendes Blatt (Name): Prio 2
Spalte: B
-3. Datei:
Name: List_zukunft
Zu durchsuchendes Blatt (Name): Tabelle 1
Spalte: B
Falls diese Nummer in den verschieden Dateien gefunden wird, sollen die kompletten Zeilen in die aktuelle Datei kopiert/angezeigt werden.
Über Hilfe wäre sich sehr, sehr dankbar
Viele Grüße
Eli
PS: Ich habe bereits im Forum eine ähnliche Frage gefunden:
Excel 2007 - Mehrere Excel-Dateien nach einem Wert duchsuchen und dazugeh. Daten abspeichern
Allerdings möchte ich mehrere Datein durchsuchen und keine neue Excel-Datei erstellen. Außerdem funktioniert das Makro bei Excel 2013 nicht.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 293776
Url: https://administrator.de/contentid/293776
Ausgedruckt am: 26.11.2024 um 17:11 Uhr
5 Kommentare
Neuester Kommentar
Hallo Eli, willkommen auf Administrator.de!
Hiermit solltest du für dein Projekt klar kommen. Folgendes ist anzupassen:
Für dein Verständnis habe ich die wichtigsten Zeilen kommentiert.
Grüße Uwe
Hiermit solltest du für dein Projekt klar kommen. Folgendes ist anzupassen:
- In Zeile 4 trägst du die Pfade der zu durchsuchenden Mappen in das Array ein.
- Dazu entsprechend die Namen der Sheets in Zeile 6 in der selben Reihenfolge wie im obigen Array.
- In Zeile 8 kannst du das Sheet festlegen in welches die gefundenen Daten eingefügt werden.
Für dein Verständnis habe ich die wichtigsten Zeilen kommentiert.
Sub SearchAndCopy()
Dim wsSearch As Worksheet, c As Range, wsTarget As Worksheet, strFind As String, firstAddress As String, arrFiles As Variant, arrSheets As Variant, i As Integer
'Pfad der Dateien in welchen gesucht wird
arrFiles = Array("C:\daten\list_aktuell.xlsx","C:\daten\list_alt.xlsx","C:\daten\list_zukunft.xlsx")
'Namen der Sheets in der entsprechenden Reihenfolge der oben angeführten Dateien
arrSheets = Array("Basisdaten","Prio 2","Tabelle1")
'Sheet festlegen in das die Daten kopiert werden
Set wsTarget = Sheets(1)
'Eingabeaufforderung für die Nummer
strFind = InputBox("Bitte geben sie Ihre Nummer ein:", "Nummer suchen")
'Screenflicker unterdrücken
Application.ScreenUpdating = False
Application.DisplayAlerts = False
'Alle Dateien im Array verarbeiten
For i = 0 To UBound(arrFiles)
'Mappe öffnen
Set wsSearch = GetObject(arrFiles(i)).Sheets(arrSheets(i))
'Suche in der Mappe in Spalte B (Wert muss der Zelle muss in diesem Fall komplett übereinstimmen, wenn das nicht gewünscht ist LookAt:= auf xlPart ändern)
With wsSearch.Range("B:B")
Set c = .Find(strFind, LookIn:=xlValues, LookAt:=xlWhole)
If Not c Is Nothing Then
firstAddress = c.Address
Do
' Eintrag wurde gefunden, kopiere ganze Zeile in Zielsheet in die nächsten freien Zeilen
c.EntireRow.Copy
wsTarget.Range("A" & wsTarget.UsedRange.SpecialCells(xlCellTypeLastCell).Row + 1).PasteSpecial xlPasteAll
Set c = .FindNext(c)
Loop While Not c Is Nothing And c.Address <> firstAddress
End If
End With
' schließe die Mappe
wsSearch.Parent.Close False
Next
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub
Hallo Uwe!
Noch ein kleiner Hinweis zu xlWhole:
Bei diesem Parameter kann man bei der Suche auch Wildcards verwenden z.B. "*Suchwort" oder "Suchwort*" (davor/danach)...
Gruß Dieter
Noch ein kleiner Hinweis zu xlWhole:
Bei diesem Parameter kann man bei der Suche auch Wildcards verwenden z.B. "*Suchwort" oder "Suchwort*" (davor/danach)...
Gruß Dieter
Keine Ursache.
Ich würde hier eher eine Datenbankgestützte Lösung favorisieren. Oder ihr richtet euch eine Cloud ein. Alternativ die Daten als HTML-Seite bereitsstellen, die ließe sich auch per VBA problemlos auslesen und durchsuchen.
Für den Fall das du es über die Methode des temporären Herunterladen machen wolltest hier mal der angepasste Code dafür:
Grüße Uwe
Ich hätte nur noch eine weitere Frage:
Ist es möglich als Pfad der Dateien eine Webseite mit Beginn "http://" anzugeben?
In der aktuellen obigen Form, nein.Ist es möglich als Pfad der Dateien eine Webseite mit Beginn "http://" anzugeben?
Ich habe daran gedacht, die Seite als Laufwerk einzubinden, jedoch sollte der Zugriff auf die Datei/Makro auch für andere Benutzer möglich sein. Gibt es hierzu eine Lösung?
Dazu müsstest du entweder die Seite als WebDAV zur Verfügung stellen und dann als Laufwerk mappen, oder der Code müsste die Files jedes mal erst ins lokale Filesystem herunterladen, was mit VBA problemlos machbar wäre.Ich würde hier eher eine Datenbankgestützte Lösung favorisieren. Oder ihr richtet euch eine Cloud ein. Alternativ die Daten als HTML-Seite bereitsstellen, die ließe sich auch per VBA problemlos auslesen und durchsuchen.
Für den Fall das du es über die Methode des temporären Herunterladen machen wolltest hier mal der angepasste Code dafür:
Sub SearchAndCopy()
Dim wsSearch As Worksheet, c As Range, wsTarget As Worksheet, strFind As String, firstAddress As String, arrFiles As Variant, arrSheets As Variant, i As Integer, fso As Object, objShell As Object, TEMP as String, strTempFile as String
' Objects erstellen
Set fso = CreateObject("Scripting.FileSystemObject")
Set objShell = CreateObject("Wscript.Shell")
' Temp-Verzeichnis ermitteln
TEMP = objShell.ExpandEnvironmentStrings("%TEMP%")
' Web-Pfade der Dateien in welchen gesucht wird
arrFiles = Array("http://www.domain.de/List_aktuell.xlsx","http://www.domain.de/list_alt.xlsx";"http://www.domain.de/list_zukunft.xlsx")
'Namen der Sheets in der entsprechenden Reihenfolge der oben angeführten Dateien
arrSheets = Array("Basisdaten","Prio 2","Tabelle1")
' Sheet festlegen in das die Daten kopiert werden
Set wsTarget = Sheets(1)
' Eingabeaufforderung für die Nummer
strFind = InputBox("Bitte geben sie Ihre Nummer ein:", "Nummer suchen")
' Screenflicker unterdrücken
Application.ScreenUpdating = False
Application.DisplayAlerts = False
' Alle Dateien im Array verarbeiten
For i = 0 To UBound(arrFiles)
'Datei in das TEMP-Verzeichnis heruntergeladen
strTempFile = TEMP & "\" & fso.GetFileName(arrFiles(i))
'Mappe herunterladen
If DownloadFile(arrFiles(i), strTempFile) Then
'Mappe öffnen
Set wsSearch = GetObject(strTempFile).Sheets(arrSheets(i))
'Suche in der Mappe in Spalte B (Wert muss der Zelle muss in diesem Fall komplett übereinstimmen, wenn das nicht gewünscht ist LookAt:= auf xlPart ändern oder Platzhalter (*?) benutzen)
With wsSearch.Range("B:B")
Set c = .Find(strFind, LookIn:=xlValues, LookAt:=xlWhole)
If Not c Is Nothing Then
firstAddress = c.Address
Do
' Eintrag wurde gefunden, kopiere ganze Zeile in Zielsheet in die nächsten freien Zeilen
c.EntireRow.Copy
wsTarget.Range("A" & wsTarget.UsedRange.SpecialCells(xlCellTypeLastCell).Row + 1).PasteSpecial xlPasteAll
Set c = .FindNext(c)
Loop While Not c Is Nothing And c.Address <> firstAddress
End If
End With
' schließe die Mappe
wsSearch.Parent.Close False
Else
MsgBox "Konnte Mappe von '" & arrFiles(i) & "' wegen eines Fehlers nicht herunterladen", vbExclamation
End If
Next
Application.DisplayAlerts = True
Application.ScreenUpdating = True
Set fso = Nothing
Set objShell = Nothing
End Sub
'Funktion zum Herunterladen von Dateien
Function DownloadFile(ByVal strURL As String, ByVal strTarget As String) As Boolean
On Error GoTo Error
Dim objhttp As Object, objStream as Object
Set objhttp = CreateObject("Microsoft.XMLHTTP")
Set objStream = CreateObject("ADODB.Stream")
With objhttp
.Open "GET", strURL, False
.send
If .Status = 200 Then
objStream.Open
objStream.Type = 1
objStream.Write .responseBody
objStream.SaveToFile strTarget, 2
objStream.Close
DownloadFile = True
Else
DownloadFile = False
End If
End With
Exit Function
Error:
DownloadFile = False
End Function