Thema Datum  Von Nutzer Rating
Antwort
Rot Datensätze vergleichen
08.05.2015 08:12:33 Mirko
NotSolved

Ansicht des Beitrags:
Von:
Mirko
Datum:
08.05.2015 08:12:33
Views:
1861
Rating: Antwort:
  Ja
Thema:
Datensätze vergleichen

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

 

 


Ihre Antwort
  • Bitte beschreiben Sie Ihr Problem möglichst ausführlich. (Wichtige Info z.B.: Office Version, Betriebssystem, Wo genau kommen Sie nicht weiter)
  • Bitte helfen Sie ebenfalls wenn Ihnen geholfen werden konnte und markieren Sie Ihre Anfrage als erledigt (Klick auf Häckchen)
  • Bei Crossposting, entsprechende Links auf andere Forenbeiträge beifügen / nachtragen
  • Codeschnipsel am besten über den Code-Button im Text-Editor einfügen
  • Die Angabe der Emailadresse ist freiwillig und wird nur verwendet, um Sie bei Antworten auf Ihren Beitrag zu benachrichtigen
Thema: Name: Email:



  • Bitte beschreiben Sie Ihr Problem möglichst ausführlich. (Wichtige Info z.B.: Office Version, Betriebssystem, Wo genau kommen Sie nicht weiter)
  • Bitte helfen Sie ebenfalls wenn Ihnen geholfen werden konnte und markieren Sie Ihre Anfrage als erledigt (Klick auf Häckchen)
  • Bei Crossposting, entsprechende Links auf andere Forenbeiträge beifügen / nachtragen
  • Codeschnipsel am besten über den Code-Button im Text-Editor einfügen
  • Die Angabe der Emailadresse ist freiwillig und wird nur verwendet, um Sie bei Antworten auf Ihren Beitrag zu benachrichtigen

Thema Datum  Von Nutzer Rating
Antwort
Rot Datensätze vergleichen
08.05.2015 08:12:33 Mirko
NotSolved