HERBERS Excel-Forum - das Archiv
Makro nur bei eingeblendeten Zeilen ausführen
Rolf

Hallo zusammen
Mit nachstehendem Code (den ich von hier habe, besten dank!) werden Zeilen miteinander verglichen und bei Änderungen (= ungleicher Wert) farbig markiert.

Dim lzVergleich As Long
lzVergleich = Cells(Rows.Count, "A").End(xlUp).Row
Dim spVergleich As Long
spVergleich = Cells(5, Columns.Count).End(xlToLeft).Column
Dim r, c As Integer 'r = Zeile, c = Spalte
For r = 6 To lzVergleich
With Sheets("Tabelle1")
If .Cells(r, 5).Value = .Cells(r + 1, 5).Value Then
For c = 4 To spVergleich
If .Cells(r, c).Value <> .Cells(r + 1, c).Value Then
.Cells(r + 1, c).Interior.Color = 255
End If
Next
End If
End With
Next
Mein Problem ist nun, dass die Datenbank recht gross wurde und es mit diesem Code immer die kompletten Daten miteinander abgleicht. Dies ist nicht nötig. Es soll daher nur die gefilterten Zeilen vergleichen und die ausgefilterten/ausgeblendeten ignorieren. Wie bekomme ich das hin?
Dass die relevanten Daten eingeblendet bzw. die irelevanten Daten ausgeblende sind, regle ich mit einem separaten vorgängigen Makro.
Danke für deine Hilfe!
Grüsse
Rolf

AW: Makro nur bei eingeblendeten Zeilen ausführen
Nepumuk

Hallo,
so besser?
Public Sub Test()
    
    Dim spVergleich As Long
    Dim r As Long, c As Long 'r = Zeile, c = Spalte
    
    With Sheets("Tabelle1")
        
        spVergleich = .Cells(5, .Columns.Count).End(xlToLeft).Column
        
        For r = 6 To .Cells(.Rows.Count, 1).End(xlUp).Row
            
            If Not .Rows(r).Hidden Then
                
                If .Cells(r, 5).Value = .Cells(r + 1, 5).Value Then
                    
                    For c = 4 To spVergleich
                        
                        If .Cells(r, c).Value <> .Cells(r + 1, c).Value Then _
                            .Cells(r + 1, c).Interior.Color = 255
                        
                    Next
                End If
            End If
        Next
    End With
End Sub

Gruß
Nepumuk

AW: Makro nur bei eingeblendeten Zeilen ausführen
Rolf

Hi Nepumuk
Funktioniert - Danke!!
Nun muss ich es nur noch schaffen, dass er, sobald er in einer Zeile ein Feld farbig markiert, in der Spalte B das Wort "Neu" schreibt und in der darüberliegenden Zeile (in derjenigen Zeile, die als Vergleich diente) ebenfalls in der Spalte B das wort "Bisher" schreibt.
Bringen wir das auch noch hin? Dann bin ich nämlich meinem Ziel extrem nahe und den Rest sollte ich selber hinbekommen....
Vielen Dank!!
Grüsse
Rolf

AW: Makro nur bei eingeblendeten Zeilen ausführen
Nepumuk

Hallo,
wir? Achso, klar du musst schließlich kopieren.
Public Sub Test()
    
    Dim spVergleich As Long
    Dim r As Long, c As Long 'r = Zeile, c = Spalte
    
    With Sheets("Tabelle1")
        
        spVergleich = .Cells(5, .Columns.Count).End(xlToLeft).Column
        
        For r = 6 To .Cells(.Rows.Count, 1).End(xlUp).Row
            
            If Not .Rows(r).Hidden Then
                
                If .Cells(r, 5).Value = .Cells(r + 1, 5).Value Then
                    
                    For c = 4 To spVergleich
                        
                        If .Cells(r, c).Value <> .Cells(r + 1, c).Value Then
                            
                            .Cells(r, 2).Value = "Bisher"
                            .Cells(r + 1, 2).Value = "Neu"
                            .Cells(r + 1, c).Interior.Color = vbRed
                            
                        End If
                    Next
                End If
            End If
        Next
    End With
End Sub

Gruß
Nepumuk

AW: Makro nur bei eingeblendeten Zeilen ausführen
Rolf

Hi
Ja, wir.... Du als könner und ich als kopierer :-)
Super - auch das funktioniert. Ein kleiner Schönheitsfehler hat es noch. In der letzten Zeile, in der gar keine Angaben mehr stehen, steht nun in der Spalte B "neu" statt nichts...
Bekommen "wir" das noch weg? :)
grüsse
Rolf

AW: Makro nur bei eingeblendeten Zeilen ausführen
Nepumuk

Hallo,
das schaffen wir auch noch:
For r = 6 To .Cells(.Rows.Count, 1).End(xlUp).Row - 1
Gruß
Nepumuk

AW: Makro nur bei eingeblendeten Zeilen ausführen
Rolf

Duuuu, das funktioniert, wir haben's geschafft und damit meine ich natürlich dich :-)
Herzlichen dank....
Nun kämpfe ich noch damit, wie man per VBA den Filter auf "görsser als das zweitneuste Datum" setzt. Hatte hier im Forum zwar schon eine Lösung bekommen, die funktioniert aber irendwie nicht:

Dim Datum1 As Long
Dim Datum2 As Long
Datum1 = Application.WorksheetFunction.Large(Worksheets("Vergleich PPM-Liste").Columns("A"), _
1)
Datum2 = Application.WorksheetFunction.Large(Worksheets("Vergleich PPM-Liste").Columns("A"), _
2)
ActiveSheet.Range("$A$1:$A$10000").AutoFilter Field:=1, Criteria1:=">=" & Datum2

Zugegeben, das "Datum1" braucht es eigentlich nicht mehr.
Ach, wenn man nur VBA könnte .-)

AW: Makro nur bei eingeblendeten Zeilen ausführen
Nepumuk

Hallo,
kann ich nicht nachvollziehen. Was heißt denn "funktioniert aber irendwie nicht" ?
Gruß
Nepumuk

Makro nur bei eingeblendeten Zeilen ausführen
Rolf

Hallo zusammen
Mit nachstehendem Code (den ich von hier habe, besten dank!) werden Zeilen miteinander verglichen und bei Änderungen (= ungleicher Wert) farbig markiert.

Dim lzVergleich As Long
lzVergleich = Cells(Rows.Count, "A").End(xlUp).Row
Dim spVergleich As Long
spVergleich = Cells(5, Columns.Count).End(xlToLeft).Column
Dim r, c As Integer 'r = Zeile, c = Spalte
For r = 6 To lzVergleich
With Sheets("Tabelle1")
If .Cells(r, 5).Value = .Cells(r + 1, 5).Value Then
For c = 4 To spVergleich
If .Cells(r, c).Value <> .Cells(r + 1, c).Value Then
.Cells(r + 1, c).Interior.Color = 255
End If
Next
End If
End With
Next
Mein Problem ist nun, dass die Datenbank recht gross wurde und es mit diesem Code immer die kompletten Daten miteinander abgleicht. Dies ist nicht nötig. Es soll daher nur die gefilterten Zeilen vergleichen und die ausgefilterten/ausgeblendeten ignorieren. Wie bekomme ich das hin?
Dass die relevanten Daten eingeblendet bzw. die irelevanten Daten ausgeblende sind, regle ich mit einem separaten vorgängigen Makro.
Danke für deine Hilfe!
Grüsse
Rolf

AW: Makro nur bei eingeblendeten Zeilen ausführen
Nepumuk

Hallo,
so besser?
Public Sub Test()
    
    Dim spVergleich As Long
    Dim r As Long, c As Long 'r = Zeile, c = Spalte
    
    With Sheets("Tabelle1")
        
        spVergleich = .Cells(5, .Columns.Count).End(xlToLeft).Column
        
        For r = 6 To .Cells(.Rows.Count, 1).End(xlUp).Row
            
            If Not .Rows(r).Hidden Then
                
                If .Cells(r, 5).Value = .Cells(r + 1, 5).Value Then
                    
                    For c = 4 To spVergleich
                        
                        If .Cells(r, c).Value <> .Cells(r + 1, c).Value Then _
                            .Cells(r + 1, c).Interior.Color = 255
                        
                    Next
                End If
            End If
        Next
    End With
End Sub

Gruß
Nepumuk

AW: Makro nur bei eingeblendeten Zeilen ausführen
Rolf

Hi Nepumuk
Funktioniert - Danke!!
Nun muss ich es nur noch schaffen, dass er, sobald er in einer Zeile ein Feld farbig markiert, in der Spalte B das Wort "Neu" schreibt und in der darüberliegenden Zeile (in derjenigen Zeile, die als Vergleich diente) ebenfalls in der Spalte B das wort "Bisher" schreibt.
Bringen wir das auch noch hin? Dann bin ich nämlich meinem Ziel extrem nahe und den Rest sollte ich selber hinbekommen....
Vielen Dank!!
Grüsse
Rolf

AW: Makro nur bei eingeblendeten Zeilen ausführen
Nepumuk

Hallo,
wir? Achso, klar du musst schließlich kopieren.
Public Sub Test()
    
    Dim spVergleich As Long
    Dim r As Long, c As Long 'r = Zeile, c = Spalte
    
    With Sheets("Tabelle1")
        
        spVergleich = .Cells(5, .Columns.Count).End(xlToLeft).Column
        
        For r = 6 To .Cells(.Rows.Count, 1).End(xlUp).Row
            
            If Not .Rows(r).Hidden Then
                
                If .Cells(r, 5).Value = .Cells(r + 1, 5).Value Then
                    
                    For c = 4 To spVergleich
                        
                        If .Cells(r, c).Value <> .Cells(r + 1, c).Value Then
                            
                            .Cells(r, 2).Value = "Bisher"
                            .Cells(r + 1, 2).Value = "Neu"
                            .Cells(r + 1, c).Interior.Color = vbRed
                            
                        End If
                    Next
                End If
            End If
        Next
    End With
End Sub

Gruß
Nepumuk

AW: Makro nur bei eingeblendeten Zeilen ausführen
Rolf

Hi
Ja, wir.... Du als könner und ich als kopierer :-)
Super - auch das funktioniert. Ein kleiner Schönheitsfehler hat es noch. In der letzten Zeile, in der gar keine Angaben mehr stehen, steht nun in der Spalte B "neu" statt nichts...
Bekommen "wir" das noch weg? :)
grüsse
Rolf

AW: Makro nur bei eingeblendeten Zeilen ausführen
Nepumuk

Hallo,
das schaffen wir auch noch:
For r = 6 To .Cells(.Rows.Count, 1).End(xlUp).Row - 1
Gruß
Nepumuk

AW: Makro nur bei eingeblendeten Zeilen ausführen
Rolf

Duuuu, das funktioniert, wir haben's geschafft und damit meine ich natürlich dich :-)
Herzlichen dank....
Nun kämpfe ich noch damit, wie man per VBA den Filter auf "görsser als das zweitneuste Datum" setzt. Hatte hier im Forum zwar schon eine Lösung bekommen, die funktioniert aber irendwie nicht:

Dim Datum1 As Long
Dim Datum2 As Long
Datum1 = Application.WorksheetFunction.Large(Worksheets("Vergleich PPM-Liste").Columns("A"), _
1)
Datum2 = Application.WorksheetFunction.Large(Worksheets("Vergleich PPM-Liste").Columns("A"), _
2)
ActiveSheet.Range("$A$1:$A$10000").AutoFilter Field:=1, Criteria1:=">=" & Datum2

Zugegeben, das "Datum1" braucht es eigentlich nicht mehr.
Ach, wenn man nur VBA könnte .-)

AW: Makro nur bei eingeblendeten Zeilen ausführen
Nepumuk

Hallo,
kann ich nicht nachvollziehen. Was heißt denn "funktioniert aber irendwie nicht" ?
Gruß
Nepumuk

Bewerten Sie hier bitte das Excel-Portal