Anzeige
Archiv - Navigation
1936to1940
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
VBA: Abgleich zweier Excel Tabellen
13.07.2023 13:10:55
Andy
Herzliches Hallo an alle :)

Ich habe ein Problem, und hoffe, dass ihr mir weiter helfen könnt.

Ich habe eine Excel Datei A, wo in der Spalte N Zahlenwerte stehen, in einer andere Excel Datei B sind in der Spalte C ebenso Zahlenwerte. Nun soll abgeglichen werden ob z.B. der Wert in N2 in der Spalte C in dem anderen Arbeitsblatt vorkommen, wenn das der Fall ist, soll in dieser Zeile in der Spalte R "Online" stehen, wenn nicht dann "STP".
Und so soll die ganze Tabelle abgearbeitet werden. Die Anzahl der Zeilen kann in beiden Dokumenten variieren - können aber auch mal ca. 100.000 Zeilen sein.

Ich hoffe ich hab mich verständlich ausgedrückt.

Über eure Hilfe würde ich mich sehr freuen - trotz Suchfunktion komm ich hier leider nicht weiter.

LG,
Andy

15
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA: Abgleich zweier Excel Tabellen
13.07.2023 14:37:44
Jowe
sind die Dateien A und B geheim?

AW: VBA: Abgleich zweier Excel Tabellen
13.07.2023 14:49:01
Andy
Ja, es handelt sich um firmeninterne Dokumente mit vertraulichen Informationen.

AW: VBA: Abgleich zweier Excel Tabellen
13.07.2023 14:58:59
JoWE
Nun, dann bin ich raus

AW: VBA: Abgleich zweier Excel Tabellen
13.07.2023 16:01:40
Yal
Hallo Andy,

schaue den Formel Verweisund SVerweis nach.

VG
Yal

AW: VBA: Abgleich zweier Excel Tabellen
14.07.2023 14:13:58
Piet
Hallo

dieses Makro vergleicht DateiA Spalte N mit DateiB Spalte C. Die Spalte R wird vorher komplett auf "STP" gesetzt, bei Treffer in "Online" umgewandelt, denn wenn der Wert nicht gefunden wird kann man "STP" ja nicht in die "Luft schreiben!"

Unklar ist mir ob es bei 100.000 Zeilen doppelte Werte geben kann?? Das habe ich zur Zeit nicht berücksichtigt!

mfg Piet

  • 'Datei A Spalte N mit DateiB Spalte C

    Sub Dateien_vergleichern()
    Dim rFind As Range, lzA As Long, lzB As Long
    Dim DatA As Worksheet, DatB As Worksheet
    Set DatA = Workbooks("Test Juli.xls").Worksheets("Tabelle1")
    Set DatB = Workbooks("Test Juli.xls").Worksheets("Tabelle2")
        '** Lastzell aus Spalte N+C ermitteln
        lzA = DatA.Cells(Rows.count, 14).End(xlUp).Row
        lzB = DatB.Cells(Rows.count, 3).End(xlUp).Row
        DatB.Range("R2:R" & lzB) = "STP"
    
        'Alle Zeilen aus DateiA Spalte N in DateiB Spalte C suchen
        For Each AC In DatA.Range("N2:N" & lzA)
            If AC.Value = Empty Then GoTo nx
            Set rFind = DatB.Columns(3).Find(What:=AC, After:=[c1], LookIn:=xlFormulas, LookAt:= _
                xlWhole, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:=False)
            If Not rFind Is Nothing Then
               DatB.Cells(rFind.Row, "R") = "Online"
    nx:     End If
        Next AC
    End Sub


  • Anzeige
    AW: VBA: Abgleich zweier Excel Tabellen
    14.07.2023 16:41:37
    Yal
    Moin,

    guter Code, Piet!
    Damit habe ich meine anfangliche Faulheit überwunden.

    Bei 100.000 Zeilen sollte man auf die übliche Leistungsbremse achten:
    _ Events und Updating ausschalten (eigentlich immer)
    _ einmalig in einem Array und die einzelnen aus dem Array lesen (erst bei grossen Anzahl an Zellen relevant)
    _ in einem Dictionary packen, um über den Schlüssel direkt das Element finden ( Cells.Find in Kombi mit der Menge ist wahrscheinlich eine Plage)

    Nicht getestet, ich hoffe, ich habe keine Patzer gemacht.
    Sub Dateien_vergleichen()
    Dim Arr
    Dim Dic
    Dim Z
    
    'Bremse auschalten
        Application.ScreenUpdating = False
        Application.EnableEvents = False
    'Eingangsdaten in einem Array
        With Workbooks("Test Juli.xls").Worksheets("Tabelle1")
            Arr = Range(.Range("C2"), .Cells(Rows.Count, "C").End(xlUp)).Value
        End With
    'Array in einem Dictionary
        Set Dic = CreateObject("Scripting.Dictionary")
        For Z = 1 To UBound(Arr, 1) ' Z ist hier ein Zähler
            Dic(Arr(Z, 1)) = 1
        Next
    'Zweite Tabelle befüllen
        With Workbooks("Test Juli.xls").Worksheets("Tabelle2")
            For Each Z In Range(.Range("N2"), .Cells(Rows.Count, "N").End(xlUp)) 'Z ist hier eine Zelle
                Z.Offset(1, 0) = IIf(Dic.Exists(Z.Value), "Online", "STP")
            Next
        End With
    'weil nicht umsonst da, wieder einschalten
        Application.ScreenUpdating = True
        Application.EnableEvents = True
    End Sub
    VG
    Yal

    Anzeige
    Patzer
    14.07.2023 16:51:19
    Yal
    Z.Offset(0, 1) 'null Zeile, aber eine Spalte weiter (nach links)
    und nicht
    Z.Offset(1, 0) 'eine Zeile weiter (nach unten) aber null Spalte weiter

    VG
    Yal

    AW: Patzer
    14.07.2023 17:04:45
    Daniel
    wenn du die vollständige Arbeit in Arrays machst, so dass du am schluss nur noch das Ergebnisarray in die Tabelle zurückschreiben musst, dann kannst du dir auch das auschalten der Leistungsbremsen sparen.
    Gruß Daniel

    Stimmt
    14.07.2023 18:06:36
    Yal
    sollte sogar leicht schneller sein.

    Sub Dateien_vergleichen()
    Dim Arr
    Dim Dic
    Dim Z
    Dim Arr2
    
    'Eingangsdaten in einem Array
        With Workbooks("Test Juli.xls").Worksheets("Tabelle1")
            Arr = Range(.Range("C2"), .Cells(Rows.Count, "C").End(xlUp)).Value
        End With
    'Array in einem Dictionary
        Set Dic = CreateObject("Scripting.Dictionary")
        For Z = 1 To UBound(Arr, 1) ' Z ist hier ein Zähler
            Dic(Arr(Z, 1)) = 1
        Next
        With Workbooks("Test Juli.xls").Worksheets("Tabelle2")
        'Vergleichswerte in Array + ZielWert-Array
            Arr = Range(.Range("N2"), .Cells(Rows.Count, "N").End(xlUp)).Value
            ReDim Arr2(1 To UBound(Arr, 1))
        'Vergleichen und einstellen
            For Z = 1 To UBound(Arr, 1)
                Arr2(Z) = IIf(Dic.Exists(Arr(Z)), "Online", "STP")
            Next
        'an der Ziel-Stelle ablegen
            .Range("R2").Resize(UBound(Arr2), 1) = Application.Transpose(Arr2)
        End With
    End Sub
    VG
    Yal

    Anzeige
    AW: Stimmt
    14.07.2023 18:15:31
    Daniel
    und jetzt stellt sich die Frage, warum der Weg über das eindimensionale Array arr2?
    das bringt dir nichts als zusätzliche Programmschritte wie beispielsweise das Transpose.
    hier kannst du das sogar als Daten- und Ergebnisarray verwenden, da die Daten nur einmal benötigt werden:
    with .Range(.Range("N2"), .Cells(Rows.Count, "N").End(xlUp))
        Arr = .Value
        'Vergleichen und einstellen
            For Z = 1 To UBound(Arr, 1)
                Arr(Z, 1) = IIf(Dic.Exists(Arr(Z, 1)), "Online", "STP")
            Next
        'an der Ziel-Stelle ablegen
            .Offset(0, 4).value = Arr
    end with
    Gruß Daniel

    Anzeige
    AW: Freut mich das ihr weitermacht. Danke oWt
    14.07.2023 22:27:05
    Piet
    ...

    AW: Stimmt
    15.07.2023 14:12:57
    Yal
    In der Tat. Gut gelöst :-)

    VG
    Yal

    AW: VBA: Abgleich zweier Excel Tabellen
    14.07.2023 14:17:40
    Piet
    Nachtrag

    im Code musst du für DateiA + DateiB bitte noch DEINE Mappen und Tabellen Namen einsetzen. Zum Testen nahm ich meine Test Datei.

    mfg Piet

    AW: VBA: Abgleich zweier Excel Tabellen
    17.07.2023 16:03:06
    Andy
    Vielen lieben Dank euch allen für die Lösungen! Das funktioniert perfekt!!!!
    Danke! :)

    LG Andy

    Anzeige
    AW: VBA: Abgleich zweier Excel Tabellen
    14.07.2023 16:50:40
    Daniel
    Hi
    bei der genannten Datenmenge:
    1. beide Dateien öffnen
    2. die Tabelle B nach Spalte C aufsteigend sortieren
    3. in der Tabelle A kommt in die Zelle R2 diese Formel, die du bis zum Datenende kopierst:
    =wenn(SVerweis(N2;'[Datei_B.xlsx]Tabelle1'!C:C;1;1)=N2;"Online";"STP")
    4. ggf die Spalte kopieren und als Wert einfügen.
    so gehts von Hand schnell, einfach und auch für Excelanfänger verständlich, mit Hilfe des Recorders sollte sich auch ein Makro daraus erstellen lassen.
    Gruß Daniel

    195 Forumthreads zu ähnlichen Themen

    Anzeige
    Anzeige
    Anzeige

    Links zu Excel-Dialogen

    Beliebteste Forumthreads (12 Monate)

    Anzeige

    Beliebteste Forumthreads (12 Monate)

    Anzeige
    Anzeige
    Anzeige