Hallo,
ich habe ein kleines performanceproblem.
Ich möchte Datensätze zweier Tabellen miteinander vergleichen und die Abweichungen aus beiden Tabellen in eine neue Tabelle schreiben.
Die Datensätze beinhalten lediglich Personendaten.
Drei Unterscheidungsmerkmale habe ich in die Auswahl genommen
a) Arbeitsplatz
b) Personalnummer
c) Steuernummer
Da die Tabellen jeweils bis zu 20000 Datensätze beinhalten dauert meine Programmierung sehr lange!
Ich muss dazu sagen, dass ich blutiger Anfänger in Sachen VBA bin und ich bei Fragen auf das Forum angewiesen bin.
Vielleicht hat jemand von den Spezialisten eine Idee, wie ich den Quellcode besser schreiben kann, um die Laufzeit zu verkürzen.
Ich hatte auch wegen der großen Datenmenge überlegt, die Tabellen mit Hilfe von Access abzufragen, indem ich via vba beide Tabellen zunächst als Datei abspeichere anschließend eine Access-DB öffne, die beide Excel-Dateien bereits verknüpft hat. Danach würde ich ein SQL-Statement ausführen lassen und mir die Ergebnisse wieder ins Workbook hole und in eine neue Tabelle schreibe.
Was meint ihr?
Hier meine Quellcode zur Ansicht. Vielen Dank schon mal für die Hilfe!!
Option Explicit
Sub Personen_Abgleich()
Dim izeile, ispalte, izeileEnde, izeilews As Integer
Dim ws As Worksheet
Dim ws_abg As Worksheet
Dim ws_ges As Worksheet
Dim Bereich As Range
Dim sarbeitsplatz As String
Dim spersonennr As String
Dim ssteuernr As String
Dim bpersneu As Boolean
Set ws_ges = Application.ActiveWorkbook.Worksheets("Personen1")
Set ws = Application.ActiveWorkbook.Worksheets("Personen2")
Set ws_abg = Application.ActiveWorkbook.Worksheets("Personen_Abgleich")
'Abgleich starten
ws_abg.Activate
ws_abg.Cells(1, 1).Select
ws_abg.Rows("3:20000").Select
Selection.Delete
izeile = 3
izeilews = 3
ws_ges.Activate
Do Until ws_ges.Cells(izeile, 1) = ""
If ws_ges.Cells(izeile, 17) = "" Then 'hier wird gefiltert, ob die Person noch aktuell im Unternehmen ist (EndeDatum offen)
sarbeitsplatz = ws_ges.Cells(izeile, 1)
spersonennr = ws_ges.Cells(izeile, 2)
ssteuernr = ws_ges.Cells(izeile, 6)
abgleich sarbeitsplatz, spersonennr, ssteuernr
'hier werden jetzt die fehlenden Personen aus Tabelle 2 in die neue Tabelle geschrieben
If bpersneu = True Then
ws_abg.Cells(izeilews, 1) = ws_ges.Cells(izeile, 1)
ws_abg.Cells(izeilews, 2) = ws_ges.Cells(izeile, 2)
ws_abg.Cells(izeilews, 3) = ws_ges.Cells(izeile, 3)
ws_abg.Cells(izeilews, 4) = ws_ges.Cells(izeile, 4)
ws_abg.Cells(izeilews, 5) = ws_ges.Cells(izeile, 5)
ws_abg.Cells(izeilews, 6) = ws_ges.Cells(izeile, 6)
ws_abg.Cells(izeilews, 7) = ws_ges.Cells(izeile, 7)
ws_abg.Cells(izeilews, 8) = ws_ges.Cells(izeile, 8)
ws_abg.Cells(izeilews, 9) = ws_ges.Cells(izeile, 9)
ws_abg.Cells(izeilews, 10) = ws_ges.Cells(izeile, 10)
ws_abg.Cells(izeilews, 11) = ws_ges.Cells(izeile, 11)
ws_abg.Cells(izeilews, 12) = ws_ges.Cells(izeile, 12)
ws_abg.Cells(izeilews, 13) = ws_ges.Cells(izeile, 13)
ws_abg.Cells(izeilews, 14) = ws_ges.Cells(izeile, 14)
ws_abg.Cells(izeilews, 15) = ws_ges.Cells(izeile, 15)
ws_abg.Cells(izeilews, 16) = ws_ges.Cells(izeile, 16)
ws_abg.Cells(izeilews, 17) = ws_ges.Cells(izeile, 17)
ws_abg.Cells(izeilews, 18) = "Neu"
izeilews = izeilews + 1
End If
End If
izeile = izeile + 1
Loop
End Sub
'mit der Funktion vergleiche ich die 3 Kriterien aus Tab 1 mit Tab2 und merke mir die Abweichung
Function abgleich(ByVal sarbeitsplatz As String, ByVal spersonennr As String, ByVal ssteuernr As String)
Dim ws As Worksheet
Dim izeile As Integer
Dim izeile1 As Integer
Set ws = Application.ActiveWorkbook.Worksheets("Personen2")
ws.Activate
izeile = 3
If ws.Cells(izeile, 17) = "" Then 'auch hier vergleich ich nur Personen, die aktuell im Untenehmen beschäftigt sind
Do Until ws.Cells(izeile, 2) = ""
If ws.Cells(izeile, 1) = sarbeitsplatz And ws.Cells(izeile, 2) = spersonennr And ws.Cells(izeile, 6) = ssteuernr Then
bpersneu = False
Exit Function
Else
bpersneu = True
End If
izeile = izeile + 1
Loop
Else
izeile = izeile + 1
End If
End Function
|