tommygun
Goto Top

Excel Makro - 2 Tabellen vergleichen und Matches markieren

der Code ist fertig, irgendwie fängt er sich leider in einer Endlosschleife

Hallo, ich habe eine .xls-Datei, die hat 2 Tabellenblätter.
Die Blätter sind hier in den Variablennamen schon drin also: Blatt_Bestandsdaten ist ein String (da liegt der Fehler also nicht ^^)
Anfangen soll der Vergleich ab Zeile 5 auf jedem Sheet
Und er vergleicht nur Spalte A aus Bestand mit Spalte A aus Abgang
wenn er was gleiches findet soll er den Wert aus dlgLBS.ComboBox1 in Spalte T aus Bestand schreiben

   ' Abgänge mit Blatt Gesamtbestand vergleichen anhand Versicherungsnummer und einfügen des Quartals unter 'Abgang'  
   ' nicht gefundene Versicherungsnummern werden in das Blatt "VNR nicht gefunden" kopiert  
     For Zeile = 5 To Sheets(Blatt_Bestandsdaten).Range("A65536").End(xlUp).Row     ' Versicherungsnummer aus Bestandsdaten  
     For Suchzeile = 5 To Sheets(Blatt_Abgang).Range("A65536").End(xlUp).Row        ' Versicherungsnummer aus Abgang  
         If Sheets(Blatt_Abgang).Cells(Suchzeile, 1) = Sheets(Blatt_Bestandsdaten).Cells(Zeile, 1) Then
            Sheets(Blatt_Bestandsdaten).Cells(Zeile, 20) = dlgLBS.ComboBox1.Value
         End If
     Next Suchzeile
     Next Zeile

aber irgendwas stimmt jetzt nicht, er fängt sich in einer Endlosschleife.
Die Datensätze sind ca 15000 zu 3000 also nicht soviel...

Außerdem wenn das läuft, soll es die Werte aus Abgang, die nicht gefunden werden können in eine neue Tabelle einfügen.

Für Hilfe wäre ich sehr dankbar.
mfg tommy

Content-ID: 104069

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

Ausgedruckt am: 23.11.2024 um 07:11 Uhr

StefanKittel
StefanKittel 15.12.2008 um 01:19:38 Uhr
Goto Top
Hallo,

stell doch erstmal mit zwei Variablen sicher, dass die Beiden Fors einen gültigen Bereich haben.
Laut Deinen Zahlen muss Excel hier ca. 45.000.000 (15000*3000) Einträge vergleichen. Ist das richtig?
Excel ist nicht wirklich schnell!

Mach das ganze doch intelligenter.
Sortiere beide Tabellen (notfalls in einem anderen Bereich oder Blatt). Dann kanns Du beide viel effektiver (und auch schneller) vergleiche.

Deine Variante wäre Bubblesort. Meine Quicksort face-smile

Stefan
Iwan
Iwan 15.12.2008 um 12:02:35 Uhr
Goto Top
guten morgen,

um die Suche zu beschleunigen, würde ich die 3.000 Daten in den 15.000 suchen
wenn einer der 3.000 Sätze gefunden wurde, dann wird die Zelle (in beiden Tabellen?) grün markiert
wird es nicht gefunden, dann wird die Zelle rot markiert
(getestet mit Excel 2003 SP3, ncith schön aber funktioniert)
Dim Blatt_Abgang As String, ZeilAb As String
Dim Blatt_Bestandsdaten As String, ZeilBe As String
Sub SuchenUndMarkieren()
ZeilAb = 4
Blatt_Abgang = "Tabelle1"  
Blatt_Bestandsdaten = "Tabelle2"  

Start:
ZeilBe = 4
Sheets(Blatt_Abgang).Select
ZeilAb = ZeilAb + 1
Cells(ZeilAb, 1).Select
If Cells(ZeilAb, 1) = "" Then GoTo Ende  
With Selection.Interior
    .ColorIndex = 3
End With

Suchen:
ZeilBe = ZeilBe + 1
If Sheets(Blatt_Bestandsdaten).Cells(ZeilBe, 1) = "" Then GoTo Start  
If Cells(ZeilAb, 1) = Sheets(Blatt_Bestandsdaten).Cells(ZeilBe, 1) Then
    With Selection.Interior
        .ColorIndex = 4
    End With
    GoTo Start
End If
GoTo Suchen
    
Ende:
End Sub
tommygun
tommygun 15.12.2008 um 12:53:38 Uhr
Goto Top
Hallo, ich habe mich anfangs falsch ausgedrückt mit dem Markieren.
Ich habe den Code von dir Oliver getestet, er funktioniert, ist aber nicht schneller als meiner
Meiner funktioniert auch (nachdem ich den hab mal durchrasseln lassen, was 3 Minuten gedauert hat)
Aber jetzt steh ich vor folgendem Problem:
     Blatt_VNR_NA = "VNR nicht gefunden"  
     Dim i As Long
     i = Sheets(Blatt_VNR_NA).Range("A65536").End(xlUp).Row + 1  
     For Zeile = 5 To Sheets(Blatt_Bestandsdaten).Range("A65536").End(xlUp).Row        ' Versicherungsnummer aus Bestandsdaten  
        For Suchzeile = 5 To Sheets(Blatt_Abgang).Range("A65536").End(xlUp).Row        ' Versicherungsnummer aus Abgang  
            If Sheets(Blatt_Abgang).Cells(Suchzeile, 1) = Sheets(Blatt_Bestandsdaten).Cells(Zeile, 1) Then
               Sheets(Blatt_Bestandsdaten).Cells(Zeile, 20) = dlgLBS.ComboBox1.Value                        ' Quartal eintragen  
               Sheets(Blatt_Bestandsdaten).Cells(Zeile, 18) = Sheets(Blatt_Abgang).Cells(Suchzeile, 7)      ' Endbeitrag Ab eintragen  
            Else
               Sheets(Blatt_VNR_NA).Cells(i, 1) = Sheets(Blatt_Abgang).Cells(Suchzeile, 1)                  ' VNR eintragen  
               Sheets(Blatt_VNR_NA).Cells(i, 2) = Sheets(Blatt_Abgang).Cells(Suchzeile, 7)                  ' Endbeitrag Ab eintragen  
               Sheets(Blatt_VNR_NA).Cells(i, 3) = dlgLBS.ComboBox1.Value                                    ' Quartal eintragen  
               i = i + 1
            End If
        Next Suchzeile
     Next Zeile

ich möchte das die Einträge aus Abgängen (3000) in die Blatt_VNR_NA übernommen werden, die nicht in den 15000 auftauchen
er macht mir mit dem Code, den ich hier gepostet habe aber totalen Mist, er schreibt in Blatt_VNR_NA viel zuviele Einträge.
Ich denke das liegt an meinen falschen Einträgen, was i angeht, das muss sicher irgendwie anders in die For-Schleifen gebastelt werden, ich hab aber keine Ahnung wohin.
i soll außerdem die erste freie Zeile in Blatt_VNR_NA sein, da der hier genannte Code mit jedem Quartal ausgeführt wird, also mehrmals, ich denke, das passt aber soweit

Bitte helft mir irgendwie das i noch richtig zu verstauen, so dass er das macht, was er soll
tommygun
tommygun 16.12.2008 um 19:44:06 Uhr
Goto Top
Falls es noch jemanden nach mir interessiert, oder es jemand als Anreiz braucht, ich habe das Problem gelöst und zwar wie folgt:
   ' Abgänge mit Blatt Gesamtbestand vergleichen anhand Versicherungsnummer und einfügen des Quartals unter 'Abgang'  
   ' nicht gefundene Versicherungsnummern werden in das Blatt "VNR nicht gefunden" kopiert  
     Blatt_VNR_NA = "VNR nicht gefunden"  
     Dim i As Long
     Dim pruef As Integer
     i = Sheets(Blatt_VNR_NA).Range("A65536").End(xlUp).Row + 1  
     For Zeile = 5 To Sheets(Blatt_Abgang).Range("A65536").End(xlUp).Row                                    ' Versicherungsnummer aus Abgang  
        pruef = 0
        For Suchzeile = 5 To Sheets(Blatt_Bestandsdaten).Range("A65536").End(xlUp).Row                      ' Versicherungsnummer aus Bestandsdaten  
            If Sheets(Blatt_Abgang).Cells(Zeile, 1) = Sheets(Blatt_Bestandsdaten).Cells(Suchzeile, 1) Then
               Sheets(Blatt_Bestandsdaten).Cells(Zeile, 20) = dlgLBS.ComboBox1.Value                        ' Quartal eintragen  
               Sheets(Blatt_Bestandsdaten).Cells(Zeile, 18) = Sheets(Blatt_Abgang).Cells(Zeile, 7)          ' Endbeitrag Ab eintragen  
               pruef = 1
            End If
        Next Suchzeile
        If pruef = 0 Then
           Sheets(Blatt_VNR_NA).Cells(i, 1) = Sheets(Blatt_Abgang).Cells(Zeile, 1)                          ' VNR eintragen  
           Sheets(Blatt_VNR_NA).Cells(i, 2) = Sheets(Blatt_Abgang).Cells(Zeile, 7)                          ' Endbeitrag Ab eintragen  
           Sheets(Blatt_VNR_NA).Cells(i, 3) = dlgLBS.ComboBox1.Value                                        ' Quartal eintragen  
           i = i + 1
        End If
     Next Zeile

Ist mir heute morgen direkt nach dem Aufstehen eingefallen.
Vielen Dank für die Ideen und die Hilfe,
mit freundlichem Gruß
tommy
cicero
cicero 04.04.2009 um 18:19:38 Uhr
Goto Top
Moin,

habe ein ähnliches Problem dass ich per Makro lösen möchte. Kann mir einer von euch den kompletten Quelltext zur verfügung stellen?

Danke!

Gruß
Christoph