Chemische Formeln mit VBA formatieren

Die Sprache VBA ist vielseitig einsetzbar (hat jemand wirklich eine andere Aussage auf einem VBA-Blog erwartet?) und erlaubt neben der klassischen Automatisierung von wiederkehrenden Abläufen, auch die Umsetzung von regelbasierten Formatierungen.

Chemische Formeln in Excel

Damit wir ein schönes praktisches Beispiel haben, werden wir die Formatierung von chemischen Formeln, die in Excel sehr lästig ist, mit Hilfe einer SUB-Routine umsetzen. Es ist gut möglich, dass es für diese Problemstellung bereits vordefinierte Formatierungen gibt, die Excel von Hause aus mitbringt. Aber wozu lange suchen, wenn man es selbst schnell entwickeln kann 🙂

Zumal es bei dieser kleinen Routine eher ums Lernen geht. Deswegen betrachten wir nicht alle Feinheiten von Formelformatierungen, sondern entscheiden uns für eine vereinfachte Variante, indem wir alle Buchstaben in Großbuchstaben umwandeln und alle Ziffern tiefstellen. Darüber hinaus erkläre ich ausführlich den Quellcode, sodass man den auch als absoluter Anfänger gut nachvollziehen und ggf. nach eigenem Bedarf anpassen kann.

VBA-Code

Public Sub TextAlsChemischeFormelFormatieren()

    Dim strZeichen          As String
    Dim intZeichenIndex     As Integer

    ActiveCell.Value = UCase(ActiveCell.Value)
    
    For intZeichenIndex = 1 To Len(ActiveCell.Value)
        
        strZeichen = Mid(ActiveCell.Value, intZeichenIndex, 1)
        
        If IsNumeric(strZeichen) Then
            ActiveCell.Characters(Start:=intZeichenIndex, Length:=1).Font.Subscript = True
        End If
      
    Next intZeichenIndex

End Sub

Erläuterung

Die erste Zeile verrät uns, dass es sich um eine SUB-Routine namens TextAlsChemischeFormelFormatieren handelt, die public ist. In der VBA-Welt werden mit SUB aufrufbare Codebausteine eingeleitet, die eine bestimmte Verarbeitung durchführen und dabei keinen Rückgabewert zurückliefen. Public bedeutet in diesem Fall, dass die Routine aus jedem Modul der Exceldatei aufgerufen werden kann, in der sich diese Routine befindet.

In den Zeilen 3 und 4 deklarieren wir zwei temporäre Variablen:

  • Die Variable strZeichen speichert bei jedem Durchlauf das gerade zu prüfende Zeichen
  • Die Variable intZeichenIndex speichern die Positionsnummer des Zeichens, an der es sich im Inhalt befindet, also beispielsweise 5 für das 5. Zeichen.

Im ersten richtigen Verarbeitungsschritt, in der Zeile 6, wandeln wir den kompletten Inhalt der angeklickten Zelle erstmal in Großbuchstaben um, womit wir schon mal den ersten Teil der Formelformatierung realisiert haben.

Das Tieferstellen der Ziffern erfordert etwas mehr Verarbeitung. Hierfür müssen wir den kompletten Inhalt der angeklickten Zelle Zeichen für Zeichen durchgehen und prüfen, ob es sich dabei um eine Ziffer handelt. Wenn wir identische Abfolge von Befehlen mehrmals ausführen müssen, benötigen wir dafür eine Schleife. Doch welche ist in diesem Fall die richtige? In VBA und nahezu allen mir bekannten Sprachen, gibt es einen bunten Strauß an unterschiedlichen Schleifenarten, wie zum Beispiel:

  • For-Schleifen
  • For-Each-Schleifen
  • Kopfgesteuerte Do-Schleifen
  • Fußgesteuere Do-Schleifen

Als Faustregel (natürlich gibt es davon auch Ausnahmen) lässt sich folgendes sagen – wenn vor der eigentlichen Verarbeitung die Anzahl der notwendigen Schleifendurchläufe automatisch ermittelt werden kann, dann ist die For-Schleife die richtige Schleifenart. So ist es in diesem Fall auch. Da wir jedes Zeichen des Inhaltes durchsuchen müssen, können wir die durch die Funktion Len(ActiveCell.Value) die Anzahl der Zeichen in der angeklickten Zelle ermitteln und wissen somit, wie häufig die Schleife durchlaufen muss.

Innerhalb der Schleife (Zeile 10) lesen wir mit Hilfe der Mid Funktion das jeweils nächste Zeichen für die Prüfung aus. Dieser Funktion übergeben wir insgesamt 3 Parameter:

  • den Inhalt der angeklickten Zelle selbst ActiveCell.Value
  • den Index des jeweils auszulesenden Zeichens intZeichenIndex
  • die Länge der Teilzeichenkette (in unserem Fall ist es 1, weil die Teilzeichenkette immer ein einzelnes Zeichen sein soll)

Die Prüfung des Zeichens erfolgt mit Hilfe der Funktion isNumeric die uns entweder true oder false zurückgibt, je nach dem ob es sich um eine Ziffer handelt oder nicht. Ist das Zeichen tatsächlich eine Ziffer, dann wird diese in der Zeile 13 tiefergestellt. Dabei legen wir zuerst fest, ab welchem Zeichen (Start:=intZeichenIndex) und für wie viele Zeichen (Length:=1) die Tieferlegung gelten soll. Die darauffolgende Anweisung Font.Subscript = True stellt das zuvor selektierte Ziffer tief.

Einsatz in der Praxis

Damit die programmierte Routine in der Praxis einsetzbar ist, fehlt nur noch eine Kleinigkeit. Wir hinterlegen eine Tastenkombination, um diese Routine schnell starten zu können. Hierfür rufen wir in Excel Ansicht->Makros->Makros anzeigen auf, wählen die Routine aus und legen in Optionen fest, dass diese beispielsweise durch die Tastenkombination Strg+h aufzurufen ist.

Anschließend schreiben wir in eine Zelle beispielsweise den Inhalt Al2O12S3 rein und führen die Tastenkombination aus. Daraufhin läuft unsere Verarbeitung los, welche den bisherigen Inhalt zu Al2O12S3 umformatiert.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.