VBA Code Erklärung
Guten Abend zusammen. Könnte mir jemand weiterhelfen bei diesem Code. Was macht er genau in Excel? Also Die einzelnen Schritte die er durchläuft,.
Option Explicit
Public Sub Double_Red()
Dim lngZeile As Long
Dim lngZeilenSprung As Long
Dim strSuchwert As String
lngZeile = Cells(Rows.Count, 4).End(xlUp).Row
For lngZeilenSprung = lngZeile To 1 Step -1
strSuchwert = Cells(lngZeilenSprung, 4).Value
If Application.WorksheetFunction.CountIf(Range(Cells(1, 4), Cells(lngZeile, 4)), strSuchwert) <> 1 Then
Cells(lngZeilenSprung, 4).Interior.ColorIndex = 3
End If
Next lngZeilenSprung
End Sub
2 Antworten
ausgehend von der letzten Zeile, Spalte4=D wird der letzte Eintrag gesucht und dessen Zeile in lngZeile festgehalten. Der Suchwert wird diesem Eintrag gleichgesetzt in strSuchwert
Nach oben wird nun JEDE (Step=-1) Zelle abgeprüft, ob =Zählenwenn(D1:D-letzterEintrag) Wiederholungen findet und diese dann rot eingefärbt.
Dabei ist zu beachten, dass auch mehrere leere Zellen als Wiederholung gesehen werden.
Im Prinzip geht es um die Markierung von Doppeln.
Anm: die Formulierung
For lngZeilenSprung = lngZeile To 1 Step -1
ist mir neu, aber sie funktioniert.
Tipp: füge vor der If-Zeile folgenden Code ein:
Debug.Print lngZeile & " " & lngZeilenSprung & " strSuchwert: " & strSuchwert
und nach End If dann zusätzlich noch
Debug.Print Application.WorksheetFunction.CountIf(Range(Cells(1, 4), Cells(lngZeile, 4)), strSuchwert)
Das druckt den jeweiligen Stand der Variablen bzw das Formelergebnis von Countif() [=Zählenwenn()] im "Direktfenster" aus, so dass Du Schleife für Schleife die Entwicklung verfolgen und Fehler finden kannst!
Sinnvoll könnte auch sein, die Definition
strSuchwert = Cells(lngZeile, 4).Value
zu setzen, dann würde nur der letzte Eintrag auf die Existenz eines Doppels geprüft.
interessant ist bei diesem Code auch, dass
lngZeile = Cells(Rows.Count, 4).End(xlUp).Row
nur eine gedachte Cursorbewegung ist, keine wirkliche (da wird nichts ausgewählt, aktiviert oder versetzt. So gehts am schnellsten!).
Ich bevorzuge allerdings der Klarheit wegen genauere Bezeichnungen, zB.
Activesheet.Cells(...,...).End(xlUp).row
Dazu noch eine Besonderheit: es heißt:
.End(xlToRight) und .End(xlToLeft), aber wieder .End(xldown),
weil nämlich xlLeft und xlTop schon belegt sind für anderes.
Die Hilfe bieter nur recht dürftige Auskunft zu solchen ähnlich-Fragen und gar keine zu Gegensatz- bzw invers-Ausdrücken!
vergiss den letzten Absatz, da hab ich mich vertan!. Dazu müsste man wohl eine weitere Variable einführen.
Ich würde sagen, er überspringt eine Zeile oder schreibt etwas in eine Zeile.
Wow! Vielen Dank genau so hab ich es mir vorgestellt hat mir sehr geholfen =)