Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1012to1016
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
Große Tabellen vergleichen
07.10.2008 16:55:00
gerwas
Hallo Weite Welt - mal wieder
Habe schon mal im Archiv rumgeforstet aber ohne rechten Erfolg.
Mein Problem:
Zwei große Exceltabellen (Tabelle a und Tabelle b mit gefüllten 65536 Zeilen) haben in Spalte x Textinformationen. Ich will wissen, wie oft ein Text aus Tabelle a in Tabelle b vorkommt und in welcher Zeile dort.
Die Variante for next habe ich verworfen, weil - soviel Kaffee kann man garnicht trinken...
Habe dann mal versucht per Ergebnis=Filter(Sucharray,Text,True,1) etwas herauszubekommen, das geht einigermaßen - aber ich weiß dann zwar wie oft der Text im Sucharray vorkommt aber noch nicht in welchen Zeilen ...
Kann mir jemand einen Rat geben?
Gruss GerWas

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Große Tabellen vergleichen
07.10.2008 18:36:52
fcs
Hallo Gerwas,
prinzipiell kann man einen derartigen Vergleich mit nachfolgendem Makro durchführen.
Allerdings gibt es dann immer noch das Problem der Ergebnisnissausgabe bzw. was willst du mit den Zeilennummern anfangen.
In meiner Lösung werden die Fundstelen in ein Datenarray geschrieben und in einer Textbox ausgegeben.
Gruß
Franz

Sub Vergleich()
Dim wksA As Worksheet, wksB As Worksheet, rngBereich As Range
Dim SpA As Long, SpB As Long
Dim lngZeileA As Long, lngFund As Long, strFund As String, strBox As String
Dim lngCountB, arrZeilenB() As Long, rngSuchen As Range
Dim varSuchen
Dim strAdr1 As String
Set wksA = Worksheets("TabelleA")
Set wksB = Worksheets("TabelleB")
SpA = 1 'Spalte mit Texten in Tabelle A
SpB = 1 'Spalte mit Texten in Tabelle B
With wksB
Set rngBereich = .Columns(SpB) 'zu durchsuchender Bereich in Blatt B
End With
For lngZeileA = 1 To IIf(IsEmpty(wksA.Cells(wksA.Rows.Count, SpA)), _
wksA.Cells(wksA.Rows.Count, SpA).End(xlUp).Row, wksA.Rows.Count)
varSuchen = wksA.Cells(lngZeileA, SpA)
strFund = ""
'Prüfen ob Suchtext erstmals gesucht werden soll, bei Wiederholung keine Berechnung
If Application.WorksheetFunction.CountIf(wksA.Range(wksA.Cells(1, SpA), _
wksA.Cells(lngZeileA, SpA)), varSuchen) = 1 Then
Set rngSuchen = rngBereich.Find(what:=varSuchen, LookIn:=xlValues, lookat:=xlWhole)
If rngSuchen Is Nothing Then
lngCountB = 0
Else
strAdr1 = rngSuchen.Address
lngCountB = 0
Do
lngCountB = lngCountB + 1
ReDim Preserve arrZeilenB(1 To lngCountB)
arrZeilenB(lngCountB) = rngSuchen.Row
Set rngSuchen = rngBereich.FindNext(rngSuchen)
Loop Until rngSuchen.Address = strAdr1
End If
'Ausgabe Ergebnis
If lngCountB = 0 Then
If MsgBox(varSuchen & " in Tabelle " & wksB.Name & " nicht gefunden!", _
vbOKCancel) = vbCancel Then Exit Sub
Else
strBox = varSuchen & " in Tabelle " & wksB.Name & " gefunden: " & lngCountB & " mal"
strBox = strBox & vbLf & "Fundstellen 1  bis "
For lngFund = 1 To lngCountB
strFund = strFund & vbLf & arrZeilenB(lngFund)
If lngFund Mod 20 = 0 Then
strBox = strBox & lngFund & strFund
If MsgBox(strBox, vbOKCancel) = vbCancel Then Exit Sub
strBox = varSuchen & " in Tabelle " & wksB.Name & " gefunden: " & lngCountB & " mal" _
strBox = strBox & vbLf & "Fundstellen " & lngFund + 1 & " bis "
strFund = ""
End If
Next
If strFund  "" Then
strBox = strBox & lngCountB & strFund
If MsgBox(strBox, vbOKCancel) = vbCancel Then Exit Sub
End If
ReDim arrZeilenB(1 To 1)
End If
End If
Next
End Sub


Anzeige
AW: Große Tabellen vergleichen
08.10.2008 10:38:06
gerwas
Danke Franz
das hilft mir weiter .-)))
Gruss GerWas
Arrays und Dictionarys
08.10.2008 16:31:00
ransi
HAllo Gerwas
Der Thread ist zwar beantwortet, und du hast eine funktionierende Lösung.
aber schau dir trotzdem mal dies an:
Daten in Tabelle A!X1:X65536
Daten in Tabelle B!X1:X65536
In Tabelle 3!A:A stehen die Werte,
in B:B die Anzahl und in C:C die einzelnen Zeilennummern.
Der Code lässt dir keine Zeit dir eine Zigarette anzuzünden und ist leicht zu pflegen...
Option Explicit


Public Sub test()
Dim ArrA As Variant
Dim ArrB As Variant
Dim Dic1 As Object
Dim Dic2 As Object
Dim lngIndex As Long
ArrA = Sheets("Tabelle A").Range("X:X")
ArrB = Sheets("Tabelle B").Range("X:X")
Set Dic1 = CreateObject("Scripting.Dictionary")
Set Dic2 = CreateObject("Scripting.Dictionary")
For lngIndex = 1 To UBound(ArrA)
    Dic1(ArrA(lngIndex, 1)) = 0
    Dic2(ArrA(lngIndex, 1)) = 0
Next
For lngIndex = 1 To UBound(ArrB)
    If Dic1.exists(ArrB(lngIndex, 1)) Then
        Dic1(ArrB(lngIndex, 1)) = Dic1(ArrB(lngIndex, 1)) + 1 'Zählen
        Dic2(ArrB(lngIndex, 1)) = Dic2(ArrB(lngIndex, 1)) & "; " & lngIndex 'Fundstellen sammeln
    End If
Next
'Ausgeben
With Sheets("Tabelle3")
    .Range("A1").Resize(Dic1.Count) = WorksheetFunction.Transpose(Dic2.keys)
    .Range("B1").Resize(Dic1.Count) = WorksheetFunction.Transpose(Dic1.items)
    .Range("C1").Resize(Dic1.Count) = WorksheetFunction.Transpose(Dic2.items)
End With
End Sub


ransi
Anzeige
AW: Arrays und Dictionarys
09.10.2008 10:53:28
gerwas
Hallo Ransi
das hilft auch weiter, aber ich verstehe es nicht. Hilfe nicht installiert.
In der Letzen Zeile der Ausgabe (habe die größe an das jeweilige dic angepasst, kommt Fehlermeldung 13 Typen unverträglich. Wenn ich dic2.items in die überwachung nehme, sehe ich die aufgelisteten fundstellen. versuche ich jedoch eine einzelne anzuzeigen (z.B. dic2.items(9)) bekomme ich Fehlermeldung
Gruß Gerwas
AW: Arrays und Dictionarys
09.10.2008 20:32:00
ransi
HAllo
In der Letzen Zeile der Ausgabe (habe die größe an das jeweilige dic angepasst, kommt Fehlermeldung 13
Warum willst du etwas anpassen ?
Das .resize(Dic1.Count) macht das doch von alleine...
versuche ich jedoch eine einzelne anzuzeigen (z.B. dic2.items(9)) bekomme ich Fehlermeldung
Das ist in der Tat ein wenig fieselig...
Ein kleiner Umweg hilft:
Dim ITMS 'as Items
.
.
.
'Ausgeben
MsgBox ITMS(8)
.
.
.
End Sub
Zur installierten Hilfe:
Öffne mal den Script-Editor.
Da in der Hilfe wird das Dictionary-Object erklärt.
ransi
Anzeige
AW: Große Tabellen vergleichen
07.10.2008 18:41:00
Stempfle
Hallo Gerwas,
in der Datei findest du auf Tabelle1 eine kurze Beschreibung was der Code macht.
Ich denke damit kannst du etwas anfangen und nach deinen Anforderungen anpassen.
(und schnell ist das auch)
https://www.herber.de/bbs/user/55870.xls
Gruß Leo
AW: Große Tabellen vergleichen
08.10.2008 10:39:18
gerwas
Danke Leo
habe die Version von Franz verwendet
Gruß gerwas

307 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige