Option Explicit
Sub Test()
Dim SpaltenNummer&
Dim Spalte As Range
Set Spalte = Range("A1")
SpaltenNummer = Spalte.Column
SymetrieSpalte SpaltenNummer
End Sub
Private Sub SymetrieSpalte(C As Long)
Dim R&, I&, E&
Dim V, V2$() 'V2 ist ein Variant, Variants können Arrays sein bzw. werden, V2 ist als String-Array definiert
V = Range(Cells(1, C), Cells(Rows.Count, C).End(xlUp)).Value 'V wird eine range zugewiese, _
da V kein Range Object ist und das Erkennungsword "set" nicht verwendet wird erstellt VBA automatisch ein 2 dimensionales Variant-Array
E = UBound(V) 'Obergrenze der ersten Dimension des Arrays _
(Anzahl der Zeilen trifft in diesem Fall zu, muss aber nicht da ein Array von n-n dimensioniert werden kann, _
treffender wäre "E = UBound(V)-LBound(V) zu bestimmung der Anzahl der Zeilen)
ReDim V2(E - 1) 'das Array hat genau so viele Zeilen wie V, da die automatische Untergrenze bei 0 liegt und _
nicht bei 1 wie bei V, muss die Obergrenze auch um 1 niedriger sein
For R = 1 To E
If Not IsError(V(R, 1)) Then 'Fehlercodes ignorieren
If V(R, 1) <> "" Then 'neues Array ohne Leerzeilen erstellen
V2(I) = V(R, 1)
I = I + 1
End If
End If
Next
E = I - 1 'falls Leerzeilen vorhanden waren, wird das Array V2 nicht ganz gefüllt sein und darf nur bis zum letzten _
gefüllten Platz ausgelesen werden, ansonsten wird die Spalte fälschlich als nicht symetrisch aufgebaut erkannt
For R = 0 To E 'Bereinigtes Array durchlaufen...
If V2(R) <> V2(E - R) Then 'verlassen wenn Werte sich unterscheiden...
Exit For
ElseIf R + 1 > (E - R) + 1 Then 'kleine Verbesserung: _
Nach der Hälfte wurden alle Zellen bereits verglichen, Schleife kann beendet werden, Schleifenvariable wird auf E+1 gesetzt, _
um zu kennzeichnen, dass die Schleife erfolgreich beendet wurde
R = E + 1
Exit For
End If
Next
If R > E Then 'wenn Schleife nicht aufgrund von Ssymetrie vorzeitig abgebrochen wurde...
MsgBox "Die Spalte ist symetrisch aufgebaut.", vbInformation
Else 'ansonsten:
MsgBox "Die Spalte ist nicht symetrisch aufgebaut.", vbCritical
End If
End Sub
Ich habe mal ein paar Kommentare hinzugefügt...
Zu Frage 1:
Nö, die Schleifenvariable hat nach Durchlaufen der Schleife immer den Wert n+1. Ansonsten würde das Ganze auch nicht funktionieren, weil man so nicht festellen könnte, ob die letzte Zeile korrekt ist (was in diesem Beispiel allerdings egal ist).
Zu Frage 2:
Unverträgliche Typen? Kann eigentlich nur an Fehlercode in der Spalte liegen, entweder in Zelle 18 oder ihrem Gegenstück. In der neuen Version werden Fehlercodes ignoriert. In dem Fall solltest du aber trotzdem darauf achten das keine Fehlercodes im Sheet stehen.
Gruß
Till
|