vba123
Goto Top

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.

Content-ID: 293776

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

Ausgedruckt am: 26.11.2024 um 17:11 Uhr

colinardo
colinardo 21.01.2016 aktualisiert um 13:25:01 Uhr
Goto Top
Hallo Eli, willkommen auf Administrator.de!

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
Grüße Uwe
116301
116301 23.01.2016 um 11:05:22 Uhr
Goto Top
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
colinardo
colinardo 23.01.2016 um 11:15:04 Uhr
Goto Top
Hallo Dieter,
ja, das hatte ich im Kommentar nicht erwähnt, aber für den TO dann noch ein guter Hinweis. Merci.

Grüße Uwe
VBA123
VBA123 11.02.2016 um 07:05:32 Uhr
Goto Top
Hallo Uwe,

vielen lieben Dank für deine Hilfe, funktioniert einwandfrei face-smile

Ich hätte nur noch eine weitere Frage:
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?

Besten Dank vorab face-smile
Viele Grüße
Eli
colinardo
colinardo 11.02.2016 aktualisiert um 19:14:23 Uhr
Goto Top
Zitat von @VBA123:
vielen lieben Dank für deine Hilfe, funktioniert einwandfrei face-smile
Keine Ursache.
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.
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
Grüße Uwe