Benutzerdefinierte Formatierung

Lies diesen Artikel und viele weitere mit einem kostenlosen, einwöchigen Testzugang.

Für Datum, Uhrzeit, Währung et cetera ist dies ein alter Hut: Der Benutzer kann das gewünschte Anzeigeformat in der Systemsteuerung systemweit festlegen. Für andere, anwendungsspezifische Zahlenwerte legt üblicherweise der Entwickler die Formatierung fest. Der Kunde oder Benutzer kann höchstens Vorgaben machen. Wie wäre es aber, wenn Sie den Benutzer Ihrer Anwendung selbst Formate festlegen lassen Wir zeigen, wie das funktioniert.

Wenn Sie dem Benutzer Ihrer Anwendung die Möglichkeit bieten wollen, dass dieser Zahlenformatierungen ähnlich wie in der Systemsteuerung von Windows festlegen kann (siehe Bild 1), brauchen Sie prinzipiell folgende Elemente:

pic001.png

Bild 1: ändern der Zahlenformate in der Systemsteuerung von Windows XP

  • eine oder mehrere Tabellen, welche die Formatangaben speichern,
  • ein Formular, mit dem der Benutzer die änderungen vornimmt,
  • und Techniken, mit denen Sie den betroffenen Zahlenwerten die Formate zuweisen – diese treten überall auf, wo die Zahlen angezeigt werden, also beispielsweise in Abfragen, Formularen und Berichten.

Datenmodell

Bevor wir die Tabellen erstellen, formulieren wir die Wünsche an unsere Formatierungs-Lösung. Am besten verwenden wir für die Formatausdrücke die gleichen Regeln, die auch die Format-Funktion von VBA einsetzt – dazu später mehr.

Damit ein nachträgliches Ergänzen der Formatvorgaben später durch einfaches Anlegen weiterer Datensätze erfolgen kann, können wir bereits drei Felder für unsere Tabelle vormerken:

  • FormatID: Primärschlüsselfeld
  • Formatbezeichnung: Bezeichnung des Formats
  • Formatdefinition: Formatierungsausdruck, kompatibel zur Format-Funktion von VBA

Um den praktischen Nutzen zu erweitern, soll der Benutzer außerdem einen Beispielausdruck eingeben können, der im Formular zur Definition der Formatausdrücke zu Testzwecken eingesetzt wird.

Die Tabelle sieht im Entwurf nun wie in Bild 2 aus und heißt tblFormate.

pic002.png

Bild 2: Die Tabelle zum Speichern der Formatangaben in der Entwurfsansicht

Formular zum Definieren der Eingabeformate

Das Formular besitzt die Abfrage qryFormate als Datenherkunft. Diese Abfrage erledigt etwa mehr als nur die Sortierung der Formate nach der Formatbezeichnung: Sie steuert auch noch ein Feld bei, das den Beispielausdruck mit dem im Feld Formatdefinition angegebenen Ausdruck formatiert (siehe Bild 3).

pic004.png

Bild 3: Diese Abfrage sortiert die Formatierungsangaben nach dem Alphabet und fügt eine formatierte Fassung des Beispielausdrucks hinzu.

Das Formular sieht schließlich wie in Bild 4 aus. Es zeigt die Daten in der Endlosansicht an, weshalb Sie die Eigenschaft Standardansicht auf Endlosformular einstellen.

pic003.png

Bild 4: Das Formular zur Anzeige der Formatangaben in der Entwurfsansicht

Wenn Sie nun in die Formularansicht wechseln und eine Formatbezeichnung, eine Formatdefinition sowie einen Beispielausdruck eingeben, passiert natürlich noch nichts Weltbewegendes.

Es gibt an dieser Stelle ja auch nur eine Anforderung: Das Feld Beispielausdruck soll in dem Format angezeigt werden, das im Feld Formatdefinition angegeben wurde. Perfekt wäre es natürlich, wenn der Benutzer gleich beim Eingeben des Formatausdrucks ein Ergebnis sähe.

Dazu brauchen wir ein paar Zeilen VBA-Code, der durch das Ereignis Bei änderung des Felds mit der Formatdefinition ausgelöst wird. Vorher jedoch stellen wir die Namen der Textsteuerelemente um, indem wir jedem das Präfix txt voranstellen (also txtFormatID, txtFormatbezeichnung und so weiter).

Die Ereignisprozedur sieht wie folgt aus:

Private Sub txtFormatdefinition_Change()
    Me!txtBeispielausdruck.Format =
    Nz(Me!txtFormatdefinition.Text)
    End Sub

Wenn Sie nun einen Ausdruck in das Textfeld txtBeispielausdruck eingegeben haben und den Wert im Textfeld txtFormatdefinition ändern, wird der Inhalt von txtFormatierterBeispielausdruck entsprechend formatiert.

Sie werden allerdings feststellen, dass sich die Einfügemarke bei jeder änderung an das Ende des in txtFormatdefinition enthaltenen Texts bewegt, was auf Dauer stört.

Erweitern wir die Prozedur also so, dass die Einfügemarke nach dem ändern des Formats wieder dort landet, wo sie sich vorher befunden hat:

Private Sub txtFormatdefinition_Change()
    Dim intSelStart As Integer
    intSelStart = Me!txtFormatdefinition.SelStart
    Me!txtFormatierterBeispielausdruck.Format =
    Nz(Me!txtFormatdefinition.Text)
    Me!txtFormatdefinition.SelStart = intSelStart
    End Sub

Die neu hinzugefügten Zeilen lesen vor dem ändern des Formats mit der Eigenschaft SelStart des Steuerelements die Position der Einfügemarke aus und schreiben diese anschließend wieder zurück.

Wenn Sie das Steuerelement txtBeispieleingabe mit dem gleichen Komfort ausstatten möchten, verwenden Sie eine ähnliche Ereignisprozedur, die durch die entsprechende Ereigniseigenschaft von txtBeispieleingabe ausgelöst wird und wie folgt aussieht:

Private Sub txtBeispielausdruck_Change()
    Dim intSelStart As Integer
    intSelstart = Me!txtBeispielausdruck.SelStart
    DoCmd.RunCommand acCmdSaveRecord
    Me.txtBeispielausdruck.SetFocus
    Me!txtBeispielausdruck.SelStart = intSelstart
    End Sub

Der kleine, notwendige Unterschied ist der, dass wir dem Textfeld txtFormatierterBeispielausdruck nicht einfach den Wert von txtBeispielausdruck zuweisen können.

Das Textfeld ist bereits an das Feld FormatierterBeispielausdruck der Datenherkunft gebunden und kann daher nicht durch eine Wertzuweisung geändert werden.

Dies erledigen wir indirekt, indem wir den aktuellen Datensatz nach der Eingabe jedes einzelnen Buchstabens in txtBeispielausdruck speichern und so für eine Aktualisierung von txtFormatierterBeispielausdruck sorgen. Auch hier ist das vorherige Merken und anschließende Wiederherstellen der Cursor-Position nötig. In der Formularansicht sieht frmFormate nun wie in Bild 5 aus.

pic005.png

Bild 5: Das Formular zur benutzerdefinierten Definition von Formaten in Aktion

Formate definieren

Nachdem wir die Grundlage für das Auswählen verschiedener Formatdefinitionen geschaffen haben, schauen wir uns die entsprechenden Möglichkeiten an – am einfachsten gelingt dies mit ein paar Beispielen.

Zunächst jedoch eine grundlegende Information: Es gibt einige Zeichen, die in Zusammenhang mit der Format-Eigenschaft eine spezielle Bedeutung haben.

Dies ist zum Beispiel beim Buchstaben h in Zusammenhang mit Datumsangaben der Fall: Er steht hier stellvertretend für die in der Datumsangabe enthaltenene Stundenzahl. So liefert der folgende Ausdruck beispielsweise die Stunde für die aktuelle Uhrzeit:

Format(Time, "h")

Wenn dieser Ausdruck nun automatisch den Buchstaben h als Zusatz enthalten soll, müssen Sie diesen durch ein vorangestelltes Backslash-Zeichen (\) besonders kennzeichnen. Der nächste Ausdruck liefert das Ergebnis 19h (vorausgesetzt, die volle Stunde lautet gerade 19):

Format(Time, "h\h")

Gleiches gilt für alle Zeichen, die spezielle Funktionen haben, wie die folgende Auflistung zeigt:

  • Backslash: hebt die Format-Funktion des folgenden Zeichens auf. Zwei Backslashes hingegen liefern einen Backslash.
  • d (Tag), m (Monat), y (Jahr), w (Woche) und q (Quartal) kennzeichnen Datumsbestandteile.
  • Desweiteren ist der Schrägstrich (/) der Platzhalter für das in den Systemeinstellungen festgelegte Datumstrennzeichen (in Deutschland normalerweise der Punkt). Wenn Sie statt des Punkts einen Schrägstrich anzeigen möchten, ohne dies in den Systemeinstellungen festzulegen, müssen Sie dieses Zeichen durch Voranstellen eines Backslashs erzwingen: Format(Date, "dd\/mm\/yyyy")
  • h (Stunde), n (Minute) und s (Sekunde) kennzeichnen Uhrzeitbestandteile.
  • Desweiteren ist der Doppelpunkt der Platzhalter für das Uhrzeittrennzeichen (hierzulande ebenfalls der Doppelpunkt – Sie brauchen dieses Zeichen also nicht zu erzwingen, es erscheint von allein).
  • # (eine oder keine Zahl), 0 (eine Zahl oder 0), % (multipliziert Prozentzahlen mit 100), E und e (wissenschaftliche Darstellung von Zahlen), Komma (als Tausendertrennzeichen) und Punkt (als Dezimaltrennzeichen)

Zahlen formatieren

Für das Formatieren von Zahlen gibt es ein paar kleine Regeln, die voraussetzen, dass der zu formatierende Ausdruck tatsächlich eine nackte Zahl ist.

Es gibt prinzipiell zwei Platzhalter für Ziffern: die 0 und das Raute-Zeichen (#). Der Unterschied zwischen den beiden ist, dass die 0 nicht nur als Platzhalter fungiert, sondern auch ausgegeben wird, wenn an der entsprechenden Stelle gar keine Ziffer vorliegt. Beispiel:

Format(123, "00000")

gibt den Ausdruck 00123 aus. Da die angegebene Zahl nicht alle Stellen ausfüllt, werden die fehlenden mit 0 aufgefüllt. Der folgende Ausdruck hingegen gibt einfach 123 aus:

Format(123, "#####")

Da dies auch geschieht, wenn man den Format-Befehl weglässt: Warum verwendet man das Raute-Zeichen dann überhaupt

Nun, zum Beispiel für das Einfügen von Tausendertrennzeichen. Der folgende Ausdruck liefert beispielsweise 1.234 zurück:

Format(1234, "#.###")

Bei einer Zahl, die den Tausenderbereich nicht erreicht, fällt das Tausendertrennzeichen einfach weg – Folgendes liefert so einfach die Zahl 12:

Format(12, "#.###")

Die 0 als Platzhalter ist hingegen sinnvoll, wenn Sie bei einer Dezimalzahl eine bestimmte Anzahl Stellen hinter dem Komma anzeigen möchten.

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

Testzugang

eine Woche kostenlosen Zugriff auf diesen und mehr als 1.000 weitere Artikel

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar