Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1752to1756
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
Inhaltsverzeichnis

VBA: 2 Tabellenblätter vergleichen

VBA: 2 Tabellenblätter vergleichen
22.04.2020 07:11:01
Axel
Hallo zusammen,
Dank dieses Forums bin ich fast am Ziel mit meinem Vorhaben.
Es sollen Daten in Tabelle1 mit Tabelle2 vergleichen werden und Unterschiede farblich markiert und als Zellkommentar in die Zelle geschrieben werden.
Das funktioniert auch, solange keine Leerzellen den Zellverbund unterbrechen:
https://www.herber.de/bbs/user/136953.xlsm
Was muss noch ergänzt oder geändert werden, damit das Makro auch mit eventuellen Leerzellen zwischendrin zurecht kommt? Ich krieg das nicht hin.
Vielen Dank für jede Unterstützung vorab.
Axel

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Definiere: Zurecht kommen! Was soll passieren?
22.04.2020 07:38:31
EtoPHG

AW: Definiere: Zurecht kommen! Was soll passieren?
22.04.2020 07:52:53
Axel
Guten Morgen EtoPHG,
das Makro soll den zu prüfenden Bereich erweitern bis zur letzten befüllten Zelle. Aktuell führen Leerzellen zwischendrin dazu, dass der Bereich nicht als zusammengehörig erkannt wird.
AW: VBA: 2 Tabellenblätter vergleichen
22.04.2020 07:52:21
Nepumuk
Hallo Axel,
teste mal:
Option Explicit

Public Sub ZweiTabellenVergleichen()
    
    Dim ws1 As Worksheet, ws2 As Worksheet
    Dim lngws1Row As Long, lngws1Col As Long
    Dim lngws2Row As Long, lngws2Col As Long
    Dim intMaxRow As Long, intMaxCol As Long
    Dim intCol As Long, intRow As Long
    Dim strCompWS1 As String, strCompWS2 As String
    Dim blnDifferentFound As Boolean
    
    'Referenzierungen
    Set ws1 = Worksheets(1)
    Set ws2 = Worksheets(2)
    
    'Tabellendimension von Tabelle1 identifizieren
    If Not GetLastZell(ws1.Cells, lngws1Row, lngws1Col) Then
        Call MsgBox("Keine Zellen in Tabelle 1 gefunden.", vbExclamation, "Hinweis")
        Exit Sub
    End If
    
    'Tabellendimension von Tabelle2 identifizieren
    If Not GetLastZell(ws2.Cells, lngws2Row, lngws2Col) Then
        Call MsgBox("Keine Zellen in Tabelle 2 gefunden.", vbExclamation, "Hinweis")
        Exit Sub
    End If
    
    'Bildschirmaktualisierung ausschalten
    Application.ScreenUpdating = False
    
    'Eventuelle Farben und Kommentare in Tabelle1 löschen
    With ws1.Cells
        .Interior.Color = xlColorIndexNone
        .ClearComments
    End With
    
    'Eventuelle Farben und Kommentare in Tabelle2 löschen
    With ws2.Cells
        .Interior.Color = xlColorIndexNone
        .ClearComments
    End With
    
    'Maximale Zeilenzahl ermitteln
    intMaxRow = Application.Max(lngws1Row, lngws2Row)
    
    'Maximale Spaltenzahl ermitteln
    intMaxCol = Application.Max(lngws1Col, lngws2Col)
    
    'Jede Zelle der beiden Tabellenblätter vergleichen
    For intCol = 1 To intMaxCol
        
        For intRow = 1 To intMaxRow
            
            strCompWS1 = ws1.Cells(intRow, intCol)
            strCompWS2 = ws2.Cells(intRow, intCol)
            
            If strCompWS1 <> strCompWS2 Then
                
                'Wurden Unterschiede gefunden?
                blnDifferentFound = True
                
                'Unterschiedliche Einträge in Tabelle1
                With ws1.Cells(intRow, intCol)
                    'Kommentar einfügen
                    .AddComment strCompWS2
                    'Kommentierte Zellen markieren
                    .Interior.ColorIndex = 6 'gelb, 3=rot, 4=grün, 8=türkis
                End With
                
                'Unterschiedliche Einträge in Tabelle2
                With ws2.Cells(intRow, intCol)
                    'Kommentar einfügen
                    .AddComment strCompWS1
                    'Kommentierte Zellen markieren
                    .Interior.ColorIndex = 6 'gelb, 3=rot, 4=grün, 8=türkis
                End With
            End If
        Next intRow
    Next intCol
    
    'Bildschirmaktualisierung einschalten
    Application.ScreenUpdating = True
    
    'Wenn keine Unterschiede gefunden wurden, Message Box mit Hinweis ausgeben
    If Not blnDifferentFound Then _
        Call MsgBox("Keine Unterschiede gefunden.", vbInformation, "Info")
    
    'Objekte wieder freigeben
    Set ws1 = Nothing
    Set ws2 = Nothing
    
End Sub

Private Function GetLastZell( _
        ByRef probjRange As Range, _
        ByRef prlngLastRow As Long, _
        ByRef prlngLastColumn As Long, _
        Optional ByVal opvblnReturnLastRow As Boolean = True, _
        Optional ByVal opvblnReturnLastColumn As Boolean = True) As Boolean

    
    Dim objCell As Range
    Dim dblCellsCount As Double
    
    'Anzahl der Zellen im Bereich lesen
    dblCellsCount = probjRange.Cells.CountLarge
    
    'Pruefen ob der gesamte Bereich nicht leer ist
    If Application.CountBlank(probjRange) <> dblCellsCount Then
        
        With probjRange
            
            If opvblnReturnLastRow Then
                
                Set objCell = .Find(What:="*", LookIn:=xlValues, Lookat:=xlWhole, _
                    SearchOrder:=xlByRows, SearchDirection:=xlPrevious)
                prlngLastRow = objCell.Row
                
                GetLastZell = True
                
            End If
            
            If opvblnReturnLastColumn Then
                
                Set objCell = .Find(What:="*", LookIn:=xlValues, Lookat:=xlWhole, _
                    SearchOrder:=xlByColumns, SearchDirection:=xlPrevious)
                prlngLastColumn = objCell.Column
                
                GetLastZell = True
                
            End If
        End With
        
        Set objCell = Nothing
        
    End If
End Function

Gruß
Nepumuk
Anzeige
gelöst
22.04.2020 07:58:08
Axel
Guten Morgen Nepumuk,
sag mal, wie geil ist das denn bitte?!
Ich verstehe zwar kaum, was Du da gemacht hast, aber es funktioniert einwandfrei.
Ich guck mir das noch mal in Ruhe an, würde das aber nie im Leben hinbekommen. Wie kommt man da hin, dass man sowas kann?
Auf jeden Fall absolut perfekt so!
Tausend Dank!!!
Bleib gesund
Axel
AW: VBA: 2 Tabellenblätter vergleichen
22.04.2020 14:15:27
Axel
Nepumuk, bist Du noch online?
Mir ist was aufgefallen:
Wenn im Tabellenblatt1 0,09 steht und in der selben Zelle im Tabellenblatt2 steht 9%, dann wird kein Unterschied identifiziert.
Hm, mathematisch mag das korrekt sein, aber in der Anzeige macht es einen Unterschied. Jetzt überlege ich gerade, wenn man da auf die Zellformatierung eingeht, z.B. Zahl in Tabelle1 und Prozent in Tabelle2, ob ich dann nicht aus der Kurve fliege, wenn Zahlen als Text formatiert in Zellen stehen. Das kommt nämlich häufig vor.
Dabei ist mir auch aufgefallen, dass in den Zellkommentaren Prozentzahlen als totale Zahl dargestellt werden. Ich bin also in einer Zelle, wo 74% steht und im Kommentar steht dann nicht z.B. 80%, sondern 0,08. Kann man das ändern?
Danke und Gruß
Axel
Anzeige
AW: VBA: 2 Tabellenblätter vergleichen
22.04.2020 15:01:17
Nepumuk
Hallo Axel,
dann so:
            strCompWS1 = ws1.Cells(intRow, intCol).Text
strCompWS2 = ws2.Cells(intRow, intCol).Text

Gruß
Nepumuk

304 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige