Schriftarten im VBA-Editor

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

Sie programmieren viel unter VBA und scrollen fortwährend in den Modulfenstern Ihre Augen werden immer schlechter und die Dioptrien der Lesebrille erhöhen sich Dann wird es möglicherweise Zeit, sich mit der Schriftart zu beschäftigen, die Sie für Ihren Code verwenden. Denn Courier New ist keineswegs das Maß aller Dinge, und es gibt zahlreiche Alternativen, deren Erprobung sich lohnen könnte.

Schriftarten einstellen

In der Regel macht man sich beim Programmieren wenig Gedanken über die Gestalt der Entwicklungsumgebung und nimmt die Vorgaben klaglos hin. Schreiben Sie Texte unter Word, so ist das Einstellen einer passenden Schriftart eine Selbstverständlichkeit. Beim Programmieren unter VBA hingegen wird die vorgegebene Schriftart meist unbesehen übernommen. Und die hört auf den schönen Namen Courier New in der Größe 10 Punkt. Nun existiert VBA schon seit zwei Jahrzehnten, ohne dass sich an dieser Tatsache etwas geändert hätte. Dabei verwenden andere Code-Fenster von Microsoft, wie die des aktuellen Visual Studio, die zweifellos günstigere Schriftart Consolas. Also könnte man einfach unter VBA ebenfalls diese Schriftart verwenden. Doch Gemach! Es gibt inzwischen noch viele weitere freie Schriftarten, die speziell für das Programmieren entwickelt wurden. Deshalb lohnt sich ein Blick auf diese unbedingt, und wir haben sie mithilfe eines Test-Sets, das Sie in der Beispieldatenbank finden, einer Prüfung unterzogen.

Manuell stellen Sie die Schriftart der Code-Fenster unter VBA über das Menü Extras|Optionen…|Editorformat ein. Im dabei erscheinenden Dialog können Sie für verschiedene Schriftstile, die auf der linken Seite aufgelistet sind (siehe Bild 1), die Vorder- und Hintergrundfarbe festlegen, aber auch die Schriftarten samt Schriftgröße. Zum Ausprobieren verschiedener Schriftarten ist das vor allem deshalb unpraktisch, weil das Kombinationsfeld zur Font-Auswahl nur wenige Zeilen ausklappt. Zudem unterscheidet VBA hier nicht zwischen geeigneten und ungeeigneten Schriftarten. Ungeeignet sind die sogenannten Proportionalen Schriften, bei denen jedes Zeichen eine unterschiedliche angepasste Breite einnimmt. Darunter würde die Lesbarkeit erheblich leiden. Der Name einer Schrift wiederum sagt nichts über deren Charakter aus, so dass Sie auf externe Anwendungen angewiesen sind, um überhaupt die proportionalen von den nichtproportionalen Schriften unterscheiden zu können.

über die Optionen der VBA-Umgebung lassen sich mehrere Schriftarten und Stile einstellen

Bild 1: über die Optionen der VBA-Umgebung lassen sich mehrere Schriftarten und Stile einstellen

Nun gibt es API-Routinen, über die man die Schriftarten des Systems durchlaufen und zusätzlich nach Eigenschaften filtern kann. Nur gibt es leider keine einfache Methode, um eine Schriftart dann auch per VBA zu setzen. Zumindest haben wir keine gefunden. Die Auswahl einer Schriftart über den Optionen-Dialog wirkt sich nach Bestätigung über OK sofort aus. Programmtechnisch können wir hierfür keinen Ersatz anbieten, sondern nur einen Workaround, der im Folgenden noch beschrieben wird.

Einstellung per VBA selbst

Die Einstellung der Schriftart speichert VBA nämlich in der Registry ab. Zu finden ist der Eintrag im Zweig

HKEY_CURRENT_USER\Software\Microsoft\VBA\7.0\Common.

Dort steht für den Schriftartnamen der Schlüssel FontFace und für die Größe der Schlüssel FontHeight. Da sich der Zweig im User-Bereich befindet, können die Werte auch ohne administrative Rechte programmatisch geändert werden. Die schlechte Nachricht ist, dass VBA die Schlüssel zur Laufzeit ignoriert und es auch nicht so etwas, wie einen Reload gibt, um es zu zwingen, die Schlüssel neu einzulesen. Die einzige Möglichkeit scheint ein kompletter Neustart von Access oder einer anderen Office-Anwendung zu sein. Der allerdings kann sehr wohl von einer Routine ausgelöst werden.

Das Setzen der neuen Werte übernimmt eine ziemlich einfache Prozedur, die Listing 1 abbildet. Sie übergeben ihr als Parameter den Namen der Schriftart, sowie optional ihre Größe, die sonst auf 10 Punkt festgelegt wird. Zum Beschreiben der Registry benutzen wir ein Objekt WshShell, welches sich in der Bibliothek Windows Script Host Model (wshom.ocx) verbirgt, die unter Windows immer installiert ist, falls nicht ein allzu sicherheitsbeflissener Administrator sie deaktiviert hat. Diese Bibliothek nehmen Sie in die Verweise des VBA-Projekts auf. Die Methode ist übrigens unter VBA generell die mit Abstand einfachste, um in die Registry zu schreiben.

Private Sub ChangeVBAFont(ByVal FontName As String, Optional FontSize As Long = 10)
     Dim oReg As WshShell
     Set oReg = New WshShell
     oReg.RegWrite "HKEY_CURRENT_USER\Software\Microsoft\VBA\7.0\Common\FontFace", FontName
     oReg.RegWrite "HKEY_CURRENT_USER\Software\Microsoft\VBA\7.0\Common\FontHeight", FontSize
End Sub

Listing 1: über diese Prozedur lässt sich eine neue Schriftart für den VBA-Editor einstellen

Einmal gesetzt, müssen Sie anschließend Access zu einem Neustart bewegen. Das erledigen Sie etwa mit den folgenden Zeilen:

Dim sApp As String
  sApp = """" & SysCmd(acSysCmdAccessDir) & "msaccess.exe" & """"
Shell sApp & " " & """" & CurrentDb.Name & """" & " /CMD NoStartDlg"
Application.Quit

SysCmd ermittelt den Pfad der Access-Applikation. Den Namen der ausführenden Datei hängen Sie an. Der Shell-Anweisung übergeben Sie anschließend diesen Pfad und zusätzlich den Dateinamen der aktuellen Datenbank, die sich aus CurrentDb.Name ergibt. Den Sinn der angehängten CMD-Anweisung werden wir gleich erläutern. Die Pfade sollten Sie immer in Anführungszeichen einbinden, damit Shell sie etwa bei Leerzeichen im Pfad nicht fehlinterpretiert. Sie starten damit also eine neue Instanz der Datenbank und beenden die aktuelle über Quit. Das Ganze erfolgt in der Regel so schnell, dass es kaum wahrnehmbar ist. Allerdings sollten Sie dann in der neuen Instanz auch den gleichen Zustand wiederherstellen, der vor dem Beenden der aktuellen zu sehen war. In der Demo-Anwendung geschieht das über einen Code des Startformulars frmIntro. Dort finden sich im Ereignis Beim Laden die folgenden Zeilen:

If Command = "NoStartDlg" Then
     DoCmd.Close acForm, Me.Name
     DoCmd.OpenForm "frmFonts"
     DoCmd.OpenModule "mdlFonts", "GetFontsAsCollection"
End If

Ausgewertet wird hier zunächst die Command-Funktion von VBA. Sie gibt einen String aus, der über den Kommandozeilenparameter CMD gesetzt werden kann. Normalerweise ist das ein Leer-String. Wir aber haben diesen zuvor in der Prozedur mit dem Wert NoStartDlg versehen. Also werden die weiteren Zeilen ausgeführt, das Intro-Formular geschlossen und stattdessen das Formular frmFonts geladen und zusätzlich das Modul mdlFonts geöffnet, in dem außerdem die Prozedur GetFontsAsCollection angesprungen wird. Dies ist bereits ein Vorgriff auf die Funktionalität des Formulars frmFonts.

Einstellen der VBA-Schriftart über ein Formular

Das Formular frmFonts öffnet sich in der Demo automatisch, nachdem Sie das Intro-Formular schließen. Oder eben, nachdem die vorher beschriebene Prozedur aufgerufen wurde. Dann präsentiert es sich wie in Bild 2.

Das Formular frmFonts zeigt einen Pseudo-Editor mit einstellbarer Schriftart mit Beispielcode an

Bild 2: Das Formular frmFonts zeigt einen Pseudo-Editor mit einstellbarer Schriftart mit Beispielcode an

Den größten Teil nimmt die Textbox ein, in der ein Beispiel-Code abgebildet wird. Es handelt sich dabei übrigens nicht um eine normale Access-Textbox, sondern um ein ActiveX-Steuerelement, die MSForms-Variante, welche mehr Steuerungsmöglichkeiten zulässt. Die Schriftart können Sie über das Kombinationsfeld oben ebenso ändern, wie die Schriftgröße. Statt des Beispiel-Codes können Sie über die Optionsgruppe auch alle Zeichen des Zeichensatzes als Block in die Textbox holen (siehe Bild 3).

Alternativ kann im Editorfenster auch der komplette Zeichensatz der Schrift angezeigt werden

Bild 3: Alternativ kann im Editorfenster auch der komplette Zeichensatz der Schrift angezeigt werden

Sagt Ihnen der Font zu, so legen Sie ihn in der Registry über Klick auf den Button Setzen! fest. Access wird dann, wie beschrieben, neu gestartet und das Formular erneut zur Ansicht gebracht. Gleichzeitig wird der VBA-Editor aktiviert und ebenfalls angezeigt, so dass Kontrolle über die neu gesetzte Schriftart besteht. Es hängt von Ihrem System ab, wie das abläuft: Entweder Sie haben zwei Monitore, wobei Access auf dem einen, die VBA-Umgebung auf dem anderen dargestellt wird. Oder Sie haben einen ziemlich großen Monitor, auf dem Sie beides nebeneinander platzieren. Ansonsten überdeckt nun VBA das Access-Fenster. Dargestellt wird aber immer das Modul mdlFonts, in dem die Prozedur GetFontsAsCollection ins Zentrum gebracht ist. Das also ist der Workaround, der leider nötig wird, weil wir keine andere Methode fanden, um das Verhalten des Optionen-Dialogs nachzustellen.

Wie ist das Formular nun aufgebaut Beteiligt an ihm sind drei weitere Elemente, das Modul mdlFonts und die Tabellen tblFonts, tblFontsDimensions. Die Routinen des Moduls ermitteln über API-Funktionen die Schriftarten des Systems und filtern diese nach ihrem Stil, damit nur die für unsere Zwecke benötigten nicht-proportionalen Schriften (Monospace) übrigbleiben.

Diese werden dann in der Tabelle tblFonts abgelegt. Im zweiten Schritt errechnen weitere Prozeduren die Ausdehnung der jeweiligen Schrift und speichern Breite (LineWidth), wie Höhe (LineHeight), einer vorgegebenen Code-Zeile in der Tabelle tblFontDimensions ab.

Zusätzlich wird aus diesen beiden Parametern die von der Zeile eingenommene Fläche (Area) berechnet, damit die Tabelle später direkt nach dem Raumbedarf der Schrift sortiert werden kann. Die dafür herangezogene willkürliche Beispiel-Code-Zeile lautet:

Private Declare Function SendMessage Lib ""user32"" _
     Alias ""SendMessageA"" (ByVal hwnd As Long, ByVal wMsg _
     As Long, ByVal wParam As Long, lParam As Long) As Long

Die beiden Tabellen sind 1:n miteinander verknüpft, weil zu einer Schriftart jeweils mehrere Größen berechnet werden. Die zweite dient dann als Unterdatenblatt für die erste – siehe Bild 4. FontSize ist die für die Schrift eingestellt Größe in Punkt. Die anderen Angaben sind Pixel-Größen.

In der Tabelle tblFonts finden sich alle installierten Monospace-Schriften mit ihren Abmessungen

Bild 4: In der Tabelle tblFonts finden sich alle installierten Monospace-Schriften mit ihren Abmessungen

Schriftgrößen

Aus den Tabellen geht, wie Sie sehen können, hervor, dass die Punkt-Größen keineswegs unmittelbar mit den resultierenden Pixel-Größen korrelieren. Eine 14-Punkt-Schrift etwa ist meist mehr, als doppelt so hoch, wie eine 7-Punkt-Schrift. Gleiches gilt für die horizontale Ausdehnung. Hier besteht kein linearer Zusammenhang und es ist das Geheimnis eines jeden Fonts, wie genau er gerendert wird.

Doch wozu sind all diese Nachforschungen gut Einmal wird deutlich, dass verschiedene Schriftarten in der gleichen Punkt-Größe reell zu unterschiedlichen Zeilenhöhen und -breiten führen. Um also die Lesbarkeit eines Fonts mit der eines anderen vergleichen zu können, müssen unter Umständen abweichende Font-Größen verwendet werden. Aus der Abbildung können Sie ablesen, dass etwa Liberation Mono in der Größe 8 Punkt mit 12 Pixeln die gleiche Höhe besitzt, wie Lucida Console in 9 Punkt. (Das Unterdatenblatt ist hier übrigens nach LineWidth absteigend sortiert.) Folglich sollte ein visueller Vergleich zwischen beiden Schriftarten einmal mit 8 Punkt, einmal mit 9 Punkt erfolgen.

Weiter lässt sich aus LineWidth unmittelbar ablesen, wie viele Zeichen sich im Modulfenster darstellen lassen. Sicher ist in Ihrem Interesse, dass möglichst viele in ihren Editor passen und sie auch lange Code-Zeilen ohne horizontales Scrollen überblicken können. Aus der Abbildung allerdings ist die Analyse zunächst nicht ersichtlich, da hier alle drei Schriftarten dieselbe horizontale Ausdehnung aufweisen.

Deshalb verwenden Sie die Abfragen qry_LineWidth und qry_LineHeight in der Demo-Datenbank, die alle Schriftarten und alle Größen aufsteigend nach Zeilenhöhe und -breite ausgeben. Filtern Sie das Ergebnis etwa nach allen Schriften, die in einer Zeilenhöhe von 12 Pixel resultieren, so finden Sie Schriften in der Spanne von 7 bis 11 Punkt vor! Filtern Sie nach der festen Breite von 1099 Pixel, so stellen sich gar Fonts in der Größe zwischen 7 und 13 Punkt ein. Es gibt also extreme Unterschiede in der Laufweite der einzelnen Fonts.

Noch aussagekräftiger wäre eigentlich die Eigenschaft Area, weil diese Auskunft darüber gibt, wie viele Zeichen insgesamt in das Rechteck eines Code-Fensters passen. Die Abfrage qry_Area gibt das aus, wobei hier zur leichteren Filterung die Werte für Area gerundet gruppiert sind. Filtern Sie diese Abfrage in der Datenblattansicht etwa nach 10 Punkt, so bekommen Sie für die Schrift ProggyTinyTT eine Zeilenfläche von 6200 Pixeln heraus, für Source Code Pro ExtraLight eine von 21200 Pixeln. Das bedeutet, dass sich im Code-Fenster mit der ersten Schrift über dreimal mehr Zeichen darstellen lassen, wie mit der zweiten! Aus der Spalte LineHeight der Abfrage geht allerdings hervor, dass die erste Schriftart das vornehmlich durch eine sehr geringe Höhe von 9 Pixeln erreicht, während die zweite eine von 17 aufweist (siehe Bild 5). Beide lassen dich demzufolge nicht direkt miteinander vergleichen.

Ergebnis der nach FontSize 10 gefilterten Abfrage qry_Area

Bild 5: Ergebnis der nach FontSize 10 gefilterten Abfrage qry_Area

Natürlich können Sie die Abfrage weiter filtern und etwa nur Zeilenhöhen von 12 Pixeln zulassen, sowie Font-Größen von 9 bis 11. Damit wären die Schriften tatsächlich vergleichbar. Mit Terminal bekommen Sie dann eine Fläche von 8300 Pixeln heraus, mit ProggyCleanTT eine von 11600 Pixeln. Also scheint Terminal der Favorit zu sein

Eindeutig nein! Denn für die Beurteilung einer Schriftart sind weit mehr Faktoren zu berücksichtigen, als allein die Laufweite und die Zeilenhöhe. Die Lesbarkeit hängt stark von der Gestalt der Zeichen ab. Zudem ist es auch Geschmackssache, ob Sie Serifen– oder serifenlose Schriften bevorzugen. Auch das Antialiasing spielt eine gewichtige Rolle. Auf diese Faktoren kommen wir später zu sprechen. Doch zurück zum Formular und seinen Komponenten!

Schriften enumerieren und analysieren

Die Prozeduren des Moduls mdlFonts stellen wir hier nicht komplett in Listings dar, denn diesen Code werden Sie eher selten in Ihren eigenen Datenbanken benötigen. Deshalb handeln wir die Sache lediglich in Stichpunkten ab.

Die für das Auslisten der installierten Schriften verantwortliche Funktion ist GetFontsAsCollection. Sie bedient sich der API-Funktion EnumFontFamilies, welche ihrerseits schrittweise die Callback-Funktion EnumFontsProc aufruft.

Die ermittelten Schriftnamen sammeln sich in der Collection colFonts. Damit nur nichtproportionale Schriften ins Ergebnis gelangen, errechnet eine weitere Hilfsfunktion IsNonProportional, ob bestimmte Schriftparameter der Struktur NEWTEXTMETRIC zutreffen. Weitere Prozeduren helfen bei der Analyse der Schriftparameter.

Die Funktionen sind umfangreicher, als es für unsere Zwecke nötig wäre. Aber vielleicht benötigen Sie das Modul einmal für ganz andere Aufgaben, wie das Auflisten von Serifenschriften in einem Kombinationsfeld, und dann könnten Sie dies ebenfalls über diese Funktionen erreichen.

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