VBA – Verschiedene Grundlagen

Datumsfunktionen

Man kommt um die Verwendung eines Datums in der Programmierung nicht drumrum – da ich normalerweise Java programmiere, muss ich in VBA oft die einfachsten Syntaxfragen recherchieren. Diese möchte ich unter anderem in diesem Beitrag dokumentieren, um sie beim „nächsten Mal“ einfach nachschlagen zu könen 🙂

Datum deklarieren

Die Deklaration eines Datums ist denkbar einfach – man deklariert es so wie man es in Excel in eine Zelle eingeben würde:

dim myDate as Date
myDate = „17.01.2019“

RANGE & Co

Von einer Range auf die Spaltennummer konvertieren

dim spaltennr as integer
spaltennr = Columns(„AB“).Column

Zulässige Werte einer Zelle einschränken (Datenschutz)

Um mit VBA zulässige Werte einzuschränken, bedient man sich idealerweise der nachfolgenden Einstellungen:

'Festlegen, dass nur E und T zulässige Eingabewerte sind.
    Range(Cells(x, EMAIL_TELEFON_SPALTE).Address(RowAbsolute:=False, ColumnAbsolute:=False)).Select
    With Selection.Validation
        .Delete
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
        xlBetween, Formula1:="E,T"
        .IgnoreBlank = True
        .InCellDropdown = True
        .InputTitle = ""
        .ErrorTitle = ""
        .InputMessage = ""
        .ErrorMessage = ""
        .ShowInput = True
        .ShowError = True
    End With

VBA – Ein Dictionary aus einem Range kriegen – HashMap-Ersatz

In meinen Tabellen muss ich regelmäßig „Einstellungen“ und valide Werte auslesen.
Anfänglich geschah das mit Einlesen der Werte manuell in ein Array – besser geht es jedoch indem ich mit „Dictionarys“ arbeite.

' Für 2 Dimensionen wird aus angegebenen Startpunkt für die Anzahl der Zeilen ein Range festgelegt
Public Function getDictionaryFromRange(Worksheet As String, rangeValue As String, numberOfLines As Integer) As Scripting.Dictionary
    Dim dict As Scripting.Dictionary
    Set dict = New Scripting.Dictionary
    Dim settingsArray As Variant
    Dim i As Integer
    settingsArray = ThisWorkbook.Sheets(Worksheet).Range(rangeValue).value
    
    For i = 1 To numberOfLines
    Dim key As String
    Dim value As Variant
    
    key = settingsArray(i, 1)
    value = settingsArray(i, 2)
    
    If (isEmpty(key) = False And isEmpty(value) = False) Then
        dict.Add key, value
    End If
    
    Set getDictionaryFromRange = dict
    
    Next
End Function

Für das Funktionieren der Dictionarys ist bei den Verweisen die Microsoft Scripting Runtime erforderlich:

Erforderlicher Verweis zum Verwenden von Dictionarys

Im nachfolgenden Link findet ihr eine gute Anleitung zum Thema Dictionary:

VBA – Excel – Automatische Formelberechnung ein- und ausschalten

Bei komplexen Excel-Tabellen ist es oft nachteilig, wenn während des Schreibens von Daten in das Tabellenblatt die Datenberechnung aktiv ist. S-Verweise und andere Regeln werden mit jedem neuen Datensatz ausgeführt und verlangsamen den Generierungsprozess.

Excel bietet dafür an, die Formelberechnung einfach manuell zu deaktivieren:

Formelberechnung Ein- und Ausschalten

Um die Berechnung vor der automatischen Tabellenbefüllung mit VBA Ein- und Auszuschalten, gibt es ein einfaches Kommando in VBA:

' Einschalten der Formelberechnung

 Application.Calculation = xlCalculationAutomatic 

' Ausschalten der Formelberechnung

 Application.Calculation = xlCalculationManual 

VBA – Neue Email öffnen (nicht senden)

Um eine neue E-Mail zu erstellen aus Excel heraus, kann ein einfache OLE-Objekt erzeugt und angezeigt werden. Vielen Dank wie so oft an Herberts VBA Forum (Quelle)

Sub Mail(ByVal d As String)
    Dim olApp As Object
    Set olApp = CreateObject("Outlook.Application")
    With olApp.CreateItem(0)
        'Empfanger
        .Recipients.Add "empfaenger@domain.de"
        'Betreff
        .Subject = "Betreff der E-Mail"
        'Nachricht
        .Body = "Inhalt der E-Mail"
        'Lesebestätigung aus
        .ReadReceiptRequested = False
        'Anhang
        .Attachments.Add d
        .send

    End With
    Set olApp = Nothing
End Sub

VBA – Datum vergleichen – Tage zwischen zwei Datumsvariablen

Um Datum zu vergleichen, verwende ich bei VBA die Methode DateDiff, mit der ich mit der folgenden Syntax zwei Datumsvariablen vergleichen kann:

DateDiff(interval, date1, date2, [ firstdayofweek, [ firstweekofyear ]] ) 

Für Intervall wird im Excel-üblichen Format angegeben, welchen zeitintervall man haben möchte:

EinstellungBeschreibung
yyyyJahr
qQuartal
mMonat
yTag des Jahres
dTag
wWochentag
wwWoche
hStunde
nMinute
sZweiter

Mein Beispiel im Quelltext sieht so aus:

Dim dateDiffHersteller As Integer
' "d" steht für Intervall Tag
dateDiffHersteller = DateDiff("d", dateStart, dateEnd)

Quelle: https://docs.microsoft.com/de-de/office/vba/language/reference/user-interface-help/datediff-function