Hauptseite >Tips zu VB5/6 >  Wert in einem unsortierten Array suchen, Boolean- und Schleifen-Optimierung
 
Wenn Sie wissen wollen, ob und wenn ja, an welcher Position ein bestimmter Wert in einem Array enthalten ist, bleibt Ihnen nichts anderes übrig, als durch alle einzelnen Feldelemente zu iterieren und die Werte zu vergleichen, sofern das Array nicht sortiert ist. Häufig wird dies etwa auf folgende Art realisiert:

Public Function UnsortedArrayPosLong _
  (ByVal SearchedValue As Long, theArray() As Long) As Long

Dim l As Long, u As Long, i As Long, Found As Boolean

Found = False
l = LBound(theArray())
u = UBound(theArray())
  For i = l To u
    If theArray(i) = SearchedValue Then
      UnsortedArrayPosLong = i
      Found = True
      Exit For
    End If
  Next

  If Found = False Then
    UnsortedArrayPosLong = l - 1
  End If
End Function
            
Das ist schon mal nicht schlecht; die Funktion liefert für ein Array von 0 bis x den Wert -1 zurück, wenn das Element nicht enthalten ist, ansonsten seine Position.

Die Funktion kann jedoch optimiert werden. So ist die Zeile

Found = False
            
überflüssig, da VB eine Boolean-Variable ohnehin mit dem Wert False initialisiert. Ausserdem kann die Zeile

  If Found = False Then
            
ein wenig optimiert werden, indem man stattdessen schreibt:

  If Not Found Then
            
Letztlich ist die Variable Found aber völlig überflüssig, wenn man das Verhalten einer For ... Next-Schleife konsequent ausnutzt.

Zur Erinnerung: Trifft das Programm erstmals auf For, wird zunächst die Zählervariable (Iterator) initialisiert (im Beispiel: i = l). Dann wird geprüft, ob der Iterator (i) kleiner oder gleich der Obergrenze (u) ist. Wenn nein, wird die Schleife erst gar nicht ausgeführt; wenn ja, wird der Schleifenkörper durchlaufen und der Iterator i am Ende (Next) um 1 erhöht (im Standardfall, wenn keine Step-Klausel angegeben ist). Nun wird wieder geprüft, ob der Iterator kleiner oder gleich der Obergrenze ist. Wenn nein, wird die Schleife nicht mehr weiter ausgeführt, das Programm springt zur nächsten Anweisung nach Next.

Daraus folgt, dass der Iterator nach Abarbeitung der For ... Next-Schleife um 1 höher ist als die Obergrenze, wenn die Schleife nicht vorzeitig verlassen wurde (Exit For). Dieses Verhalten macht sich folgende Variante der obigen Routine zunutze und kommt dabei ohne die Boolean-Variable Found aus:
Public Function UnsortedArrayPosLong _
  (ByVal SearchedValue As Long, theArray() As Long) As Long

Dim l As Long, u As Long, i As Long

l = LBound(theArray())
u = UBound(theArray())
  For i = l To u
    If theArray(i) = SearchedValue Then
      UnsortedArrayPosLong = i
      Exit For
    End If
  Next

  If i > u Then
    UnsortedArrayPosLong = l - 1
  End If
End Function
            
Hauptseite >  Tips zu VB5/6 >  diese Seite