Home > Artikel > Ausgabe 7/2012 > Binärzahlen in VBA-Eigenschaften

Binärzahlen in VBA-Eigenschaften

Achtung: Sie sind nicht angemeldet. Wenn Sie Abonnent sind und sich anmelden, lesen Sie den kompletten Artikel, laden das PDF herunter oder probieren die Beispieldatenbank aus (sofern vorhanden).

Jede VBA-Eigenschaft enthält oder erwartet nur einen einzigen Wert. Manchmal handelt es sich dabei jedoch um Zahlenwerte, die mehr als einen Eigenschaftswert repräsentieren. Ein gutes Beispiel dafür ist die MsgBox-Anweisung, für die Sie mit einem einzigen Zahlenwert gleichzeitig die anzuzeigenden Schaltflächen und das Symbol festlegen. Diese Festlegung ist einfach – schwieriger wird es, wenn Sie solche Eigenschaften auswerten müssen. Dieser Artikel liefert das notwendige Know-how zu diesem Thema.

Beispieldatenbank

Die Beispiele dieses Artikels finden Sie in der Datenbank 1207_Binaerzahlen.mdb.

Was sind Binärzahlen?

Im Gegensatz zu den hierzulande gebräuchlichen Dezimalzahlen, die mit Ziffern von 0 bis 9 zusammengesetzt werden, gibt es im Binärsystem nur die beiden Zahlen 0 und 1. Wie im Dezimalsystem entscheidet die Stelle über die Wertigkeit des jeweiligen Teils. 123 entspricht einem Hunderter, zwei Zehnern und drei Einern. Im Binärsystem gibt es Zahlen wie 1101. In diesem Fall heißt dies: Ein Achter, ein Vierer, kein Zweier und ein Einer, in Summe: 13. Jede Stelle wird also gegenüber der Stelle rechts davon nicht um den Faktor 10, sondern lediglich um den Faktor 2 erhöht.

Was soll man als Access-Entwickler damit anfangen? Die Frage ist berechtigt, denn in den meisten Fällen werden solche Zahlenwerte als Parameter für VBA-Funktionen verwendet oder als Ergebnisse von Eigenschaften geliefert – und zwar gut kaschiert.

Binärzahlen als Parameter der MsgBox-Anweisung

Ein gutes Beispiel ist die MsgBox-Anweisung (siehe Artikel Meldungsfenster anzeigen und auswerten). Diese Funktion erwartet als zweiten Parameter Informationen darüber, welche Schaltflächen es anzeigen soll, welches Icon erscheint und welche Schaltfläche als Standardschaltfläche markiert wird.

Ein Beispiel ist die folgende Anweisung:

MsgBox "Beispielmeldung", vbOKCancel + vbCritical + vbDefaultButton2

Wie nur ermittelt VBA nun, welche Schaltflächen und Icons angezeigt werden und welche Schaltfläche als Standardschaltfläche dient? Es ist ganz einfach: Jeder der Ausdrücke, also vbOKCancel, vbCritical oder vbDefaultButton2, entspricht einem Zahlenwert. Durch den Plus-Operator (+) werden die Zahlenwerte addiert und später von VBA wieder auseinandergenommen. Damit dies funktioniert, dürfen die Zahlenwerte jedoch nicht willkürlich eingesetzt werden.

Die Zahlenwerte hinter vbDefaultButton1 bis vbDefaultButton4 lauten beispielsweise 0, 256, 512 und 768. Die Schaltflächen geben Sie mit diesen Werten an:

  • vbOKOnly: 0
  • vbOKCancel: 1
  • vbAbortRetryIgnore: 2
  • vbYesNoCancel: 3
  • vbYesNo: 4
  • vbRetryCancel: 5

Fehlen noch die Icons, die durch folgende Konstanten angegeben werden:

  • vbCritical: 16
  • vbQuestion: 32
  • vbExclamation: 48
  • vbInformation: 64

Wenn Sie nun etwa ein Meldungsfenster mit den Schaltflächen OK und Abbrechen, der zweiten Schaltfläche als Standardschaltfläche und dem Icon mit dem Fragezeichen (vbQuestion) anzeigen möchten, verwenden Sie als zweiten Parameter diesen Ausdruck:

vbOKCancel + vbDefaultButton2 + vbQuestion

Dies entspricht wiederum den folgenden Zahlenwerten:

1 + 256 + 32

Sie könnten also auch schreiben:

MsgBox "Beispielmeldung", 289

Statt dem Plus-Zeichen können Sie auch den Operator Or verwenden:

vbOKCancel Or vbDefaultButton2 Or vbQuestion

Das Plus-Zeichen hat die gleiche Bedeutung wie Or? Wäre hier nicht eher And das passende Pendant? Nein – dies können Sie leicht prüfen. Wenn Sie das Ergebnis von der Variante mit Or im Direktfenster ausgeben, erhalten Sie dieses Ergebnis:

  vbOKCancel Or vbDefaultButton2 Or vbQuestion

289

Die And-Variante liefert hingegen:

  vbOKCancel And vbDefaultButton2 And vbQuestion

0

Was führt zu diesen Ergebnissen für Or und And? Nun: Or steht für eine logische Disjunktion. Hier wird jede Position der binären Zahlen miteinander verglichen und mit Or verknüpft. Dabei gilt:

  • 1 Or 1= 1
  • 1 Or 0 = 1
  • 0 Or 1= 1
  • 0 Or 0 = 0

Um dies für das obige Beispiel umzusetzen, berechnen Sie zunächst die Binärzahlen:

1 + 32 + 256 entspricht somit 1 + 100000 + 100000000. Dies ergibt 100100001, umgerechnet 289.

Die And-Verknüpfung wiederum entspricht einer logischen Konjunktion, das heißt, dass nur solche Bits erhalten bleiben, die in allen verknüpften Zahlen vorkommen. Hier lauten die Regeln:

  • 1 And 1= 1
  • 1 And 0 = 0
  • 0 And 1= 0
  • 0 And 0 = 0

Deshalb ergibt auch 1 + 32 + 256, also 1 + 100000 + 100000000, den Wert 0.

Nun wissen Sie, wie sich der Wert für die Konfiguration des Meldungsfensters zusammensetzt. Wie aber ermittelt VBA, welche Schaltflächen und welche Icons anzuzeigen sind?

Dazu wird der mit Or zusammengestellte Wert per And-Operator mit allen verfügbaren Einzelwerten verglichen. Das einfachste Beispiel sind die Schaltflächen. VBA wird etwa wie folgt vorgehen und nacheinander alle Werte von 0 bis 5 mit dem übergebenen Wert vergleichen. Angenommen, der zweite Parameter hat den Wert 1, was der Konstanten vbOKCancel entspricht.

Die folgende Beispielfunktion verdeutlicht dies:

Public Function SchaltflaechenAuswerten( _

         intParameter As VbMsgBoxStyle) As Integer

     Dim intTemp As Integer

     If (intParameter And 1) = 1 Then _

         intTemp = intTemp + 1

     If (intParameter And 2) = 2 Then _

         intTemp = intTemp + 2

     If (intParameter And 3) = 3 Then _

         intTemp = intTemp + 3

     If (intParameter And 4) = 4 Then _

         intTemp = intTemp + 4

     If (intParameter And 5) = 5 Then _

         intTemp = intTemp + 5

     If intTemp > 5 Then intTemp = 0

     SchaltflaechenAuswerten = intTemp

End Function

Die Prozedur nimmt eine Konstante für die Meldungs­fens­ter­konfiguration entgegen, also beispielsweise v­bOK­Cancel mit dem Wert 1. Sie verarbeitet aber auch Parameter wie vbOKCancel Or vbDefaultButton2 (mit dem Wert 257). Beim Durchlaufen der Prozedur wird die erste If...Then-Bedingung erfüllt, denn 1 ist binär in 257 enthalten. Die übrigen Bedingungen werden nicht erfüllt und die Funktion gibt den Wert 1 für die zu verwendende Kombination von Schaltflächen zurück. Wenn der Benutzer versehentlich vbOKCancel und vbAbortRetryIgnore angibt (Wert 1 + 2 = 3), interpretiert die Funktion dies genau wie die MsgBox-Funktion als vbYesNoCancel (Wert 3).

Attribute aus Zahlwerten ermitteln

Ein Beispiel kommt aus dem Umgang mit der Dir-Funktion. Diese liefert, wenn man sie mit einem Verzeichnisnamen und dem Parameter vbDirectory ausstattet, das erste Unterelement des Verzeichnisses und für alle weiteren Aufrufe ohne Verwendung von Parametern alle Elemente, die sich in einem Verzeichnis befinden.

Interessant ist es hier, zu ermitteln, ob es sich bei dem Element um eine Datei oder um ein weiteres Verzeichnis handelt.

Dies finden Sie mit der Funktion GetAttr heraus, der Sie den kompletten Namen der Datei oder des Verzeichnisses inklusive Pfad übergeben. Die Funktion GetAttr liefert jedoch nicht etwa den Wert True oder False zurück und teilt damit mit, ob es sich um eine Datei oder ein Verzeichnis handelt, sondern sie liefert einen Zahlenwert, in dem sich einer oder mehrere Zahlenwerte befinden können.

So liefert GetAttr für das Verzeichnis c:\ beispielsweise folgendes Ergebnis:

  GetAttr("c:\")

22

Was bedeutet dies? Es gibt die folgenden Konstanten beziehungsweise Zahlenwerte, aus denen sich das Ergebnis von GetAttr zusammensetzen kann:

  • vbNormal (0)
  • vbReadOnly (1)
  • vbHidden (2)
  • vbSystem (4)
  • vbDirectory (16)
  • vbArchive (32)
  • vbAlias (64)

Der Wert 22 teilt sich auf in 16 + 4 + 2, das Verzeicnis ist also ein verstecktes Systemverzeichnis.

Wie ermitteln Sie aber nun, ob ein Element ein Verzeichnis ist? Dazu vergleichen Sie den zurückgelieferten Zahlenwert mit dem Wert 16, der die Konstante vbDirectory repräsentiert und somit angibt, dass es sich bei dem übergebenen Element um ein Verzeichnis handelt. Auch dies geschieht mithilfe der logischen Konjunktion. Wenn das Ergebnis der logischen Konjunktion etwa von 22 und 16 dem Wert 16 entspricht, dann handelt es sich um ein Verzeichnis.

Der notwendige Ausdruck sieht wie folgt aus:

Sie haben das Ende des frei verfügbaren Teil dieses Artikels erreicht!

Wenn Sie mehr lesen und auf viele weitere Artikel zugreifen möchten, melden Sie sich als Abonnent unter Login an. Falls nicht, bestellen Sie doch einfach ein Jahresabonnement!