Verwendung Integrierter Funktionen
Swipe um das Menü anzuzeigen
VBA wird mit mehreren hundert integrierten Funktionen ausgeliefert, von denen die meisten selten verwendet werden. Die folgenden Funktionen sind jedoch in der Geschäftsautomatisierung besonders häufig im Einsatz – zur Bereinigung von Texten, zur Arbeit mit Datumsangaben und zur Typkonvertierung.
Datumsfunktionen
Debug.Print Now() ' current date and time
Debug.Print Date ' today's date only
Debug.Print DateAdd("d", 30, Date) ' 30 days from today
Debug.Print DateDiff("d", #01/09/2023#, Date) ' days since hire date
Debug.Print Format(Date, "dd/mm/yyyy")
Now() und Date sehen ähnlich aus, beantworten aber unterschiedliche Fragen – Now() enthält die aktuelle Uhrzeit bis zur Sekunde (nützlich zur Zeitstempelung, wann ein Makro ausgeführt wurde), während Date nur das Kalenderdatum liefert, was für Fälligkeiten oder Altersberechnungen benötigt wird. DateAdd und DateDiff sind Gegenstücke: DateAdd verschiebt ein Datum vorwärts oder rückwärts um eine bestimmte Einheit ("d" für Tage, aber auch "m" für Monate und "yyyy" für Jahre), während DateDiff die Differenz zwischen zwei bestehenden Daten misst.
VBA-Datumsliterale – alles, was zwischen #-Symbolen steht, wie #01/09/2023# – verwenden intern immer die Reihenfolge MM/DD/YYYY, unabhängig von den Windows-Regionseinstellungen oder der System-Sprache. Daher bedeutet #01/09/2023# 9. Januar 2023 und nicht 1. September, selbst für Lernende, deren übliches Datumsformat TT/MM/JJJJ ist. Dies unterscheidet sich von der Eingabe in eine Arbeitsblattzelle, bei der die Regionseinstellungen gelten – das #...#-Literalformat ist eine VBA-spezifische Regel, die immer gleich bleibt, egal wo der Code ausgeführt wird.
Textfunktionen
Debug.Print UCase("wireless mouse") ' WIRELESS MOUSE
Debug.Print LCase("WIRELESS MOUSE") ' wireless mouse
Debug.Print Left("P001", 1) ' P
Debug.Print Right("P001", 3) ' 001
Debug.Print Mid("P001", 2, 3) ' 001
Debug.Print Trim(" Keyboard ") ' Keyboard
Debug.Print Len("Laptop Stand") ' 12
Debug.Print InStr("Wireless Mouse", "Mouse") ' 10 (position found)
UCase und LCase werden verwendet, um Vergleiche ohne Berücksichtigung der Groß-/Kleinschreibung durchzuführen, zum Beispiel: If UCase(category) = UCase("electronics") Then funktioniert unabhängig davon, wie die Kategorie ursprünglich eingegeben wurde. Left, Right und Mid extrahieren jeweils einen Teil eines Strings, unterscheiden sich aber darin, von wo gezählt wird: Left und Right zählen von den beiden Enden, während Mid eine Startposition und eine Länge benötigt. Deshalb liefern Mid("P001", 2, 3) und Right("P001", 3) im Beispiel das gleiche Ergebnis – "P001" hat nur ein Präfix-Zeichen, sodass "ab Position 2" und "die letzten 3 Zeichen" auf denselben Teilstring zeigen. Trim entfernt unauffällig führende und nachfolgende Leerzeichen – eine unscheinbare Funktion, die bei kopierten Daten mit uneinheitlichen Abständen oft hilfreich ist. InStr sucht einen String in einem anderen und gibt die Position zurück, an der er gefunden wurde (oder 0, falls nicht vorhanden). Damit lässt sich prüfen, ob ein Produktname das Wort "Mouse" enthält, ohne eine exakte Übereinstimmung zu benötigen.
Numerische Funktionen
Debug.Print Round(24.996, 2) ' 25
Debug.Print Abs(-15) ' 15
Debug.Print Int(7.9) ' 7
Round und Int verkleinern beide eine Zahl, aber auf unterschiedliche Weise – Round(24.996, 2) rundet auf den nächsten Wert mit 2 Dezimalstellen (25,00, angezeigt als 25), während Int(7.9) immer auf die nächstkleinere Ganzzahl abrundet, unabhängig davon, wie nah die Dezimalstelle am Aufrunden ist, und ergibt 7 statt 8. Diese Verwechslung ist eine häufige Fehlerquelle bei Preisberechnungen: Das Runden eines Preises auf den nächsten Cent sollte fast immer mit Round erfolgen, nicht mit Int, sonst wird systematisch bei jeder Transaktion ein Bruchteil eines Cents zu wenig berechnet.
Typkonvertierung
Wichtig beim Auslesen von Werten aus einem Arbeitsblatt, da Zellwerte oft als Variant ankommen:
Dim priceText As String
priceText = "39.50"
Dim price As Double
price = CDbl(priceText) ' text → number
Dim stockValue As Variant
stockValue = "44"
Dim stockCount As Integer
stockCount = CInt(stockValue)
CDbl konvertiert zu Double, CInt zu Integer, CStr zu String und CDate zu einem gültigen Date-Wert.
Warum nicht einfach VBA automatisch konvertieren lassen? Das funktioniert meistens, ist aber fehleranfällig: Eine Zelle, die wie eine Zahl aussieht, aber tatsächlich als Text eingegeben oder importiert wurde, kann dazu führen, dass ein Vergleich oder eine Berechnung fehlschlägt oder unerwartet funktioniert. Die explizite Konvertierung erkennt solche Fehler frühzeitig – mit einer Fehlermeldung genau an der Zeile mit den fehlerhaften Daten, statt erst mehrere Schritte später.
Aufgabe
- Eine Zeile schreiben, die mit
Midnur den numerischen Teil von "P003" extrahiert (Tipp: Beginne bei Position 2). - Eine Zeile schreiben, die den extrahierten Text mit
CIntoderCLngin eine echte Zahl umwandelt. - Mit
DateDiffberechnen, wie viele Tage seit der Einstellung von Emma Davis vergangen sind (15.03.2020) im Vergleich zu heute.
1. Den numerischen Teil extrahieren
Midbenötigt drei Angaben: den eigentlichen String, die Startposition und wie viele Zeichen übernommen werden sollen.- "P003" besteht aus einem Buchstaben, gefolgt von drei Ziffern — der Buchstabe "P" soll übersprungen und alles danach übernommen werden.
- Startposition 2 bedeutet "beginne beim zweiten Zeichen" — zähle "P003" an den Fingern ab, um zu bestätigen, dass Position 2 die erste "0" ist.
2. In eine echte Zahl umwandeln
- Was
Midzurückgibt, ist weiterhin Text, auch wenn es wie eine Zahl aussieht. - Die gesamte
Mid(...)-Ausgabe inCInt(...)oderCLng(...)einbetten — so wird das Ergebnis einer Funktion mit einer anderen konvertiert. - Erinnerung aus einem früheren Kapitel:
CInt/CLngwandeln Text in eine Ganzzahl um; verwendeCLng, falls die Zahl eventuell größer sein könnte.
3. Tage seit dem Einstellungsdatum
DateDiffbenötigt drei Angaben: die Einheit der Messung ("d" für Tage), ein Anfangsdatum und ein Enddatum.- Die Herausforderung ist, ein Datums-Literal in VBA zu schreiben — dieses wird mit
#-Symbolen umschlossen, z. B.#03/15/2020#. Innerhalb von#...#erwartet VBA immer die Reihenfolge Monat/Tag/Jahr, unabhängig von den regionalen Einstellungen — also ist der 15. März#03/15/2020#, nicht#15/03/2020#. - Für "heute" muss kein Datum eingegeben werden — es gibt ein Schlüsselwort aus Abschnitt 2.3, das immer das aktuelle Datum zurückgibt.
- Beide Daten in
DateDiffin der richtigen Reihenfolge angeben — zuerst das frühere Datum — sonst erhältst du eine negative Zahl.
Danke für Ihr Feedback!
Fragen Sie AI
Fragen Sie AI
Fragen Sie alles oder probieren Sie eine der vorgeschlagenen Fragen, um unser Gespräch zu beginnen