Thema Datum  Von Nutzer Rating
Antwort
16.04.2012 18:36:29 Spooor
NotSolved
16.04.2012 19:34:25 Till
NotSolved
19.04.2012 13:52:57 Gast2867
NotSolved
Blau Eine Spalte auf Symmetrie prüfen
19.04.2012 19:43:49 Till
****
Solved
23.04.2012 00:05:59 Gast74927
Solved

Ansicht des Beitrags:
Von:
Till
Datum:
19.04.2012 19:43:49
Views:
1771
Rating: Antwort:
 Nein
Thema:
Eine Spalte auf Symmetrie prüfen
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


Ihre Antwort
  • Bitte beschreiben Sie Ihr Problem möglichst ausführlich. (Wichtige Info z.B.: Office Version, Betriebssystem, Wo genau kommen Sie nicht weiter)
  • Bitte helfen Sie ebenfalls wenn Ihnen geholfen werden konnte und markieren Sie Ihre Anfrage als erledigt (Klick auf Häckchen)
  • Bei Crossposting, entsprechende Links auf andere Forenbeiträge beifügen / nachtragen
  • Codeschnipsel am besten über den Code-Button im Text-Editor einfügen
  • Die Angabe der Emailadresse ist freiwillig und wird nur verwendet, um Sie bei Antworten auf Ihren Beitrag zu benachrichtigen
Thema: Name: Email:



  • Bitte beschreiben Sie Ihr Problem möglichst ausführlich. (Wichtige Info z.B.: Office Version, Betriebssystem, Wo genau kommen Sie nicht weiter)
  • Bitte helfen Sie ebenfalls wenn Ihnen geholfen werden konnte und markieren Sie Ihre Anfrage als erledigt (Klick auf Häckchen)
  • Bei Crossposting, entsprechende Links auf andere Forenbeiträge beifügen / nachtragen
  • Codeschnipsel am besten über den Code-Button im Text-Editor einfügen
  • Die Angabe der Emailadresse ist freiwillig und wird nur verwendet, um Sie bei Antworten auf Ihren Beitrag zu benachrichtigen

Thema Datum  Von Nutzer Rating
Antwort
16.04.2012 18:36:29 Spooor
NotSolved
16.04.2012 19:34:25 Till
NotSolved
19.04.2012 13:52:57 Gast2867
NotSolved
Blau Eine Spalte auf Symmetrie prüfen
19.04.2012 19:43:49 Till
****
Solved
23.04.2012 00:05:59 Gast74927
Solved