Platzbedarf für Text ermitteln

Gelegentlich möchte man Steuerelemente in Formularen und Berichten an den tatsächlich von ihnen benötigten Platz anpassen. Access liefert keine offizielle Funktion, um für einen gegebenen Text mit einer bestimmten Schriftgröße und -breite den Platzbedarf in Höhe und Breite zu liefern. Grund genug, auf eine nicht dokumentierte Funktion zuzugreifen und diese entsprechend zu wrappen …

Die versteckte Wizhook-Klasse liefert immer wieder nützliche Funktionen (siehe auch Shortlink 358). Gleichwohl sind diese Funktionen mit Vorsicht zu genießen, denn diese Klasse mit ihren Elementen ist nicht dokumentiert und könnte in zukünftigen Versionen von Access einfach verschwinden. Doch wie das Beispiel der MsgBox-Funktion beim Wechsel von Access 97 zu Access 2000 zeigt, haben auch dokumentierte VBA-Funktionen nicht unbedingt den Anspruch, für alle Ewigkeiten gleich zu arbeiten.

Also ran an die nützlichen Diener der Wizhook-Klasse, in diesem Fall die Funktion TwipsFromFont. Diese wird von der Funktion GetTextSize gekapselt, sodass die Eingabe der Parameter und das Auswerten des Ergebnisses etwas leichter als mit dem Original fällt – außerdem berücksichtigt diese Funktion auch Zeilenumbrüche (s. Listing 1).

Listing 1: Die Funktion GetTextSize ermittelt die Abmessungen von Texten in Abhängigkeit von deren Inhalt, der Schriftgröße, der Schriftart und weiteren Eigenschaften.

Function GetTextSize(strText As String, FontName As String, FontSize As Long, _
    Optional IsBold As Boolean, Optional IsItalic As Boolean) As TSize
    Dim H As Long, W As Long, WMax As Long
    Dim vText() As String
    Dim n As Long, i As Long
    On Error GoTo Fehler
    WizHook.Key = 51488399
    vText = Split(strText, vbCrLf)
    n = UBound2(vText)
    For i = 0 To n
        WizHook.TwipsFromFont FontName, FontSize, 400 + (IsBold * 300), IsItalic, _
        False, 0, vText(i), 0, W, H
        If W > WMax Then WMax = W
    Next i
    GetTextSize.y = H * (n + 1)
    GetTextSize.x = WMax
    Ende:
    Exit Function
    Fehler:
    MsgBox "Fehler-Nr: " & Err & vbcrlf & "Fehler-Beschreibung: " & Err.Description
    Resume Ende
End Function

Der Rückgabewert der Funktion hat den Datentyp TSize, der benutzerdefiniert ist und entsprechend entweder öffentlich oder, wenn privat, dann zumindest im gleichen Modul wie die Funktion GetTextSize definiert werden muss. Der benutzerdefinierte Typ sieht wie folgt aus und enthält zwei Elemente, nämlich die Variablen x und y als Breite und Höhe des gelieferten Ergebnisses:

Public Type TSize
x As Long
y As Long
End Type

Die Funktion erwartet die folgenden Parameter:

  • strText: Zu untersuchender Text, gegebenenfalls auch mit Zeilenumbrüchen
  • FontName: Bezeichnung der Schriftart
  • FontSize: Schriftgröße
  • IsBold: Optionale Angabe, ob die Schrift fett ist
  • IsItalic: Optionale Angabe, ob die Schrift kursiv ist

Für den Aufruf der Funktion gibt es zwei Möglichkeiten: Entweder man deklariert zuvor eine passende Variable für den Rückgabewert oder man greift direkt auf die einzelnen Elemente des Ergebnisses zu. Die erste Variante sieht wie folgt aus:

Dim TTextabmessungen As TSize
TTextabmessungen = _
GetTextSize("Dies ist ein Beispieltext", _
"Tahoma", "12", False, False)
Debug.Print "X-Abmessung: " & TTextabmessungen.x
Debug.Print "Y-Abmessung: " & TTextabmessungen.y

Die zweite Variante kann auch außerhalb von Prozeduren aufgerufen werden, erfordert aber den wiederholten Aufruf der GetTextSize-Funktion für jede Komponente (jeweils in einer Zeile):


Nur für Abonnenten

Ab hier wird’s wirklich spannend – der Rest ist exklusiv für Abonnenten.

Mit dem Abo von Access im Unternehmen bekommst du den kompletten Artikel – inklusive vollständigem Code, Beispieldatenbank und Schritt-für-Schritt-Erklärung.

So sparst du dir stundenlanges Herumprobieren, vermeidest teure Fehler in deiner Access-Anwendung und kannst Lösungen direkt in deinem Unternehmen einsetzen, statt nur darüber zu lesen.

Teste Access im Unternehmen jetzt 4 Wochen lang kostenlos: Voller Zugriff auf alle Artikel, Downloads und Beispieldatenbanken. Kein Risiko – wenn es für dich nicht passt, kündigst du einfach innerhalb der ersten vier Wochen.

Bereits Abonnent? Hier einloggen


Kostenlos & unverbindlich

Oder hast Du eine konkrete Frage zu Deiner eigenen Access-Anwendung?

Vielleicht stellt Deine Anwendung Dich vor eine Herausforderung, zu der Du bisher keine Lösung findest. Schlechte Performance, kein ausreichender Zugriffsschutz, Du bist unsicher über Dein Datenmodell oder Dein Code liefert unerklärliche Fehler?

In unserem kostenlosen Access-Audit schaut sich André Minhorst persönlich gemeinsam mit Dir Deine Lösung per Zoom an – und zeigt Dir, wo Datenmodell, VBA-Code, Ergonomie und Sicherheit Optimierungspotenzial bieten.

Jetzt kostenloses Access-Audit anfordern →

Schreibe einen Kommentar