VBA zwei Tabellenblätter miteinander vergleichen und neue Werte ergänzen

  • Excel

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    VBA zwei Tabellenblätter miteinander vergleichen und neue Werte ergänzen

    Hallo miteinander,

    aktuell habe ich eine sehr aufwendige VBA – Excel Datei laufen, die viel zu viele Dateien zusammen führt.

    Das will ich etwas beschleunigen und vereinfachen.
    Kann man das Tabellenblatt „Füllung“ mit dem Tabellenblatt „Komplett“ Spalte A miteinander vergleichen und fehlende Werte in Tabelle "Komplett" Spalte A:J anfügen?

    Quasi dass immer nur noch aktuelle Daten an die vorhandene Sammlung Tabelle "Komplett" angefügt werden??

    Vielen Dank schon mal vorab,

    Gruß
    Hi,

    ja klar das kann man.

    Grob:

    Visual Basic-Quellcode

    1. TotalRowsK= Worksheets("Komplett").Rows(osheet.Rows.Count).End(xlUp).Row
    2. TotalRowsF= Worksheets("Füllung").Rows(osheet.Rows.Count).End(xlUp).Row
    3. For a= 1 To TotalRows
    4. If NOT Worksheets("Komplett").Range("A1:A" & TotalRowsK).Find(Worksheets("Füllung").Cells(a,1).Value) IS Nothing then 'suchen nach dem Wert
    5. 'hier iwas machen wenn aus dem Worksheet Füllung der Wert in Komplett nicht gefunden wurde
    6. end if
    7. Next
    Das ist meine Signatur und sie wird wunderbar sein!
    Woran scheiterst du denn?

    Ich habe es bewusst nicht komplett CopyPasta konform aus dem Kopf ungetestet geschrieben.
    Ich gebe dir gerne Hilfestellung. Hast du irgendeinen Plan von VBA?
    Oder willst du eine fertige Lösung?

    Was genau klappt denn nicht usw.. Es ist immer angebracht etwas Initiative zu zeigen ;)
    Das ist meine Signatur und sie wird wunderbar sein!
    Ok, deine Informationen sind leider sehr dünn.
    Ich kann nicht sehen was du siehst und nicht wissen was du genau denkst.
    Was hast du denn bisher bezüglich Code. Was für Daten sind zuviel?

    Vll beschreibst mal näher was dein gesamtes Anliegen ist.

    Hab auch keine Ahnung was du damit zB meinst:
    ​und fehlende Werte in Tabelle "Komplett" Spalte A:J anfügen? Quasi dass immer nur noch aktuelle Daten an die vorhandene Sammlung Tabelle "Komplett" angefügt werden??
    Das ist meine Signatur und sie wird wunderbar sein!
    Ich rufe aktuell viele Dateien ab, die Täglich erweitert werden um eine zusammenfassung zu haben.

    Der Quellcode dafür ist:

    Brainfuck-Quellcode

    1. Sub Lese()
    2. Dim intBereich As Integer
    3. Dim intZeile As Integer
    4. Dim intSpalte As Integer
    5. Dim strDatei As String
    6. Dim intAnzVerz As Integer
    7. Dim intAktVerz As Integer
    8. Dim intAktBlatt As Integer
    9. Dim intAktZeile As Integer
    10. Dim intAktSpalte As Integer
    11. Dim intSpDatum As Integer
    12. Dim intSpBlatt As Integer
    13. Dim intSpDatei As Integer
    14. Dim intSpVerz As Integer
    15. Dim strVerz As String
    16. Dim strVerzA() As String
    17. Dim varDatum As Variant
    18. Dim varKopie As Variant
    19. Dim varRngKopie As Variant
    20. Dim bolLeer As Boolean
    21. Dim rngAusgabe As Range
    22. Dim wbLesen As Workbook
    23. Dim wsLesen As Worksheet
    24. Const intMaxVerz As Integer = 30
    25. Const intMaxblatt As Integer = 2
    26. Const strTeilDatei As String = ".xlsx"
    27. Const strRngDatum As String = "C2"
    28. Const strRngKopie As String = "B3:J55"
    29. Const bolZeigVerz As Boolean = False
    30. Const bolZeigDatei As Boolean = False
    31. Const bolZeigBlatt As Boolean = False
    32. Const bolZeigLeer As Boolean = True
    33. Application.ScreenUpdating = False
    34. '----------------------------------------------------
    35. ' Spalten für Verzeichnis, Datei und Blatt einrichten
    36. '----------------------------------------------------
    37. intSpDatum = 0
    38. intSpBlatt = 0
    39. intSpDatei = 0
    40. intSpVerz = 0
    41. If bolZeigBlatt Then
    42. intSpDatum = intSpDatum + 1
    43. End If
    44. If bolZeigDatei Then
    45. intSpDatum = intSpDatum + 1
    46. intSpBlatt = intSpBlatt + 1
    47. End If
    48. If bolZeigVerz Then
    49. intSpDatum = intSpDatum + 1
    50. intSpBlatt = intSpBlatt + 1
    51. intSpDatei = intSpDatei + 1
    52. End If
    53. varRngKopie = Split(strRngKopie)
    54. '----------------------------------------------------
    55. ' Verzeichniseinlesen und Variablen initialisieren
    56. '----------------------------------------------------
    57. ReDim strVerzA(intMaxVerz)
    58. intAktVerz = 1
    59. intAnzVerz = 1
    60. intAktZeile = 0
    61. strVerzA(intAnzVerz) = ThisWorkbook.Names("Verzeichnis").RefersToRange
    62. Set rngAusgabe = ThisWorkbook.Worksheets("Füllung").Cells(3, 1)
    63. 'Set rngAusgabe = ThisWorkbook.Names("Ausfüllen").RefersToRange
    64. '----------------------------------------------------
    65. ' Schleife über Verzeichnisse
    66. '----------------------------------------------------
    67. While intAktVerz <= intAktVerz And intAktVerz <= intMaxVerz
    68. strVerz = strVerzA(intAktVerz)
    69. strDatei = Dir(strVerz, vbDirectory)
    70. '----------------------------------------------------
    71. ' Schleife über Dateien im Verzeichnis
    72. '----------------------------------------------------
    73. While strDatei <> ""
    74. If (GetAttr(strVerz & strDatei) And vbDirectory) = vbDirectory Then
    75. If strDatei <> "." And strDatei <> ".." And strDatei <> "" And intAnzVerz < intMaxVerz Then
    76. intAnzVerz = intAnzVerz + 1
    77. strVerzA(intAnzVerz) = strVerz & strDatei & "\"
    78. End If
    79. Else
    80. If InStr(strDatei, strTeilDatei) > 0 And strDatei <> ThisWorkbook.Name Then
    81. intAktBlatt = 0
    82. Set wbLesen = Workbooks.Open(Filename:=strVerz & strDatei, ReadOnly:=True)
    83. For Each wsLesen In wbLesen.Worksheets
    84. intAktBlatt = intAktBlatt + 1
    85. If intAktBlatt <= intMaxblatt Then
    86. varDatum = wsLesen.Range(strRngDatum)
    87. For intBereich = 0 To UBound(varRngKopie)
    88. varKopie = wsLesen.Range(varRngKopie(intBereich)).Value
    89. For intZeile = 1 To UBound(varKopie, 1)
    90. '----------------------------------------------------
    91. ' Prüfen ob Werte leer
    92. '----------------------------------------------------
    93. If bolZeigLeer Then
    94. bolLeer = False
    95. Else
    96. bolLeer = True
    97. For intSpalte = 1 To UBound(varKopie, 2)
    98. If varKopie(intZeile, intSpalte) <> "" Then
    99. bolLeer = False
    100. End If
    101. Next intSpalte
    102. End If
    103. '----------------------------------------------------
    104. ' Schreiben wenn nicht leer
    105. '----------------------------------------------------
    106. If Not bolLeer Then
    107. For intSpalte = 1 To UBound(varKopie, 2)
    108. rngAusgabe.Offset(intAktZeile, intSpalte + intSpDatum).Value = varKopie(intZeile, intSpalte)
    109. Next intSpalte
    110. rngAusgabe.Offset(intAktZeile, intSpVerz).Value = strVerz
    111. rngAusgabe.Offset(intAktZeile, intSpDatei).Value = strDatei
    112. rngAusgabe.Offset(intAktZeile, intSpBlatt).Value = wsLesen.Name
    113. rngAusgabe.Offset(intAktZeile, intSpDatum).Value = varDatum
    114. intAktZeile = intAktZeile + 1
    115. End If
    116. Next intZeile
    117. Next intBereich
    118. End If
    119. Next wsLesen
    120. wbLesen.Close savechanges:=False
    121. End If
    122. End If
    123. strDatei = Dir()
    124. Wend
    125. intAktVerz = intAktVerz + 1
    126. Wend
    127. Application.ScreenUpdating = True
    128. End Sub


    Jetzt sind das aber inzwischen zu viele Dateien, wodurch ich immer mal wieder Probleme mit der "Abrufen" Datei bekomme.

    Jetzt war mein Plan, immer nur noch den aktuellen Monat in einem Ordner zu haben, und diesen Ordner abzurufen.

    Im anschluss will ich die abgerufenen und sortierten Daten in dem Tabellenblatt "Füllung" mit dem Tabellenblatt "Komplett" vergleichen und um der neuerungen erweitern.

    Das war jetzt der ganze Plan.

    Ergo Spalte A von Tabellenblatt "Füllung" mit Spalte A Tabellenblatt "Komplett" vergleichen und neuerungen im Tabellenblatt "Komplett" anfügen.

    Die Werte die anzufügen sind, befinden sich in Spalte A bis J.

    Visual Basic-Quellcode

    1. TotalRowsK = Worksheets("Komplett").Cells(Worksheets("Komplett").Rows.Count, "A").End(xlUp).Row 'letzte Zeile aus Blatt Komplett
    2. TotalRowsF = Worksheets("Füllung").Cells(Worksheets("Füllung").Rows.Count, "A").End(xlUp).Row 'letzte Zeile aus Blatt Füllung
    3. Dim fRange As Range
    4. Dim rowsK As Long
    5. Dim findWhat As String
    6. currentRowK = TotalRowsK + 1 'erste leere Zeile in Komplett
    7. For a = 1 To TotalRowsF 'von erster bis letzte Zeile durchgehen und in Komplett danach suchen
    8. findWhat = Worksheets("Füllung").Cells(a, 1).Value
    9. If findWhat <> "" Then
    10. Set fRange = Worksheets("Komplett").Range("A1:A" & TotalRowsK).Find(findWhat, LookIn:=xlValues, lookat:=xlWhole)
    11. If fRange Is Nothing Then 'suchen nach dem Wert
    12. 'hier iwas machen wenn aus dem Worksheet Füllung der Wert in Komplett nicht gefunden wurde
    13. Worksheets("Komplett").Range("A" & currentRowK & ":J" & currentRowK).Value = Worksheets("Füllung").Range("A" & a & ":J" & a).Value 'value von Spalte A bis J aus der Zeile kopieren
    14. currentRowK = currentRowK + 1 ' eine Zeile weiter
    15. Else
    16. 'wenn gefunden dann nix machen (oder)
    17. End If
    18. End If
    19. Next


    Falls ich dich richtig verstanden habe dann sollte das hier jetzt funkionieren.

    LG
    Das ist meine Signatur und sie wird wunderbar sein!
    Hey Mono,

    du bist mein Retter!!!

    Das funktioniert perfekt!!!!!!

    Vielen vielen Dank!!!!

    Nachtrag:

    Wie schon geschrieben, du bist mein Retter!! Nur ein problem bleitbt. Spalte A ist in erster Linie ein Datum. Er setzt das abgerufene dennoch unten an, obwohl das schon vorhanden ist.

    Ggf. gibt es da eine einfache Erklärung.

    Vielen, vielen Dank und Gruß

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „tw3aker“ ()

    Mono schrieb:

    Visual Basic-Quellcode (24 Zeilen)

    Falls ich dich richtig verstanden habe dann sollte das hier jetzt funkionieren.

    LG


    Hallo Mono,

    ich bin bei meiner Bing-Suche auf diesen Beitrag gestoßen und Dein Code hat mir bei einem sehr ähnlichen Problem geholfen!
    Daher habe ich mich hier im Forum registriert, um Dir meinen Danz zu übermitteln.
    Du hast mir bei meinem Problem geholfen und erstparst mir einiges an Arbeit.
    Danke!

    Gruß

    OLLI
    Schön, dass Dir geholfen werden konnte. Deshalb aber einen Uralt-Thread wiederzubeleben, wird hier allerdings nicht gern gesehen. Ne persönliche Nachricht an Mono + eine Hilfreich-Bewertung hätte gereicht.
    *closed
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.