Variablendeklaration...

Frage: Immer wieder taucht die Frage auf - wie deklariere ich meine Variablen richtig, bzw. wie dimensioniere ich ausreichend ohne immer Variant zu verwenden?
z. B. über den Objektkatalog (F2 im VBA Editor). Oder man schreibt einen kleinen Code und deklariert die Variable nicht (z. B. Dim strTMP). Wenn nun mit der Taste F8 Schritt für Schritt der Code ausgeführt wird sieht man im Lokalfenster die richtige Dimensionierung vorgegeben (z. B. Variant/Long). Wobei Variant der momentane Wert der Variablen ist (weil nicht dimensioniert), Long von MS vorgegeben wird.

Again and again the question arises - how do I declare my variables correctly, and how do I dimension sufficient without ever Variant to use?
eg, using the Object Browser (F2 in the VBA editor). Or you can write a little code and the variable is not declared (eg Dim strTMP). Now, if the F8 key step by step the code is executed you can see the correct dimensions specified in the local window (eg Variant / Long). Wherein said variant is the current value of the variable (because not dimensioned) Long MS is preset.

Zu Lokalfenster siehe / Locals window to see:
Lokalfenster / Locals window

Hier noch eine Beispieldatei / Here's a sample file.
Nur Excel >= 2007, da XLSB-Datei / Only Excel >= 2007 because XLSB file:
Variablendeklaration...[XLSB 3 MB]

Option Explicit
'--------------------------------------------------------------------------
' Module    : Module1
' Procedure : Main
' Author    : Case (Ralf Stolzenburg)
' Date      : 14.05.2013
' Purpose   : Variablendeklaration...
'--------------------------------------------------------------------------
Sub Main()
    Dim lngColumn   'As Long
    Dim lngRow      'As Long
    Dim rngRange1   'As Range
    Dim rngRange    'As Range
    Dim shpShape    'As Shape
    Dim objShape    'As Object
    Dim strTMP      'As String
    Dim varArr      'As Variant
    Dim varArr1(5)  'As Variant
    Dim objPicture1 'As OLEObject
    Dim objPicture  'As Object
    Dim chtChart    'As ChartObject
    ' Auch sowas ist möglich..., aber eher nicht praktikabel :-)
    Dim DonauDampfschifffahrtsgesellschaftskapitaenspatentunterschrift As String
    On Error GoTo Fin
    ' Anzahl der Spalten
    lngColumn = Columns.Count
    ' Anzahl der Zeilen
    lngRow = Rows.Count
    ' Ohne Set und als Variant deklariert wird ein Array draus
    rngRange1 = Range("A1:C10")
    ' Der Bereich A1:C10 wird der Objektvariablen zugewiesen
    Set rngRange = Range("A1:C10")
    ' Das "erste" Shape wird der Objektvariablen zugewiesen
    Set shpShape = Sheet1.Shapes(1)
    ' Das "erste" Shape wird der Objektvariablen zugewiesen
    Set objShape = Sheet1.Shapes(1)
    ' Die Stringvariable wird gefüllt
    strTMP = "Test"
    ' Das Array wird gefüllt
    varArr = Range("A1:C10")
    ' Das zweite Feld des mit 6 Feldern vorbelegten Arrays wird gefüllt
    varArr1(1) = Range("A1")
    ' Die Objektvariable wird mit einem OLEObjekt,
    ' hier ein Imageelement, belegt
    Set objPicture1 = Sheet1.OLEObjects(1)
    ' Hier nochmal statt mit OLEObjects mit der Shapesauflistung
    Set objPicture = Sheet1.Shapes(1)
    ' Objektvariable mit ChartObjects-Auflistung (1) belegt
    Set chtChart = Sheet1.ChartObjects(1)
    ' Code stoppt hier automatisch
    Stop
Fin:
    ' Objektvariablen leeren
    Set chtChart = Nothing
    Set objPicture = Nothing
    Set objPicture1 = Nothing
    Set rngRange = Nothing
    Set shpShape = Nothing
    Set objShape = Nothing
    ' Eventuell auftretenden Fehler ausgeben
    If Err.Number <> 0 Then MsgBox "Error: " & _
        Err.Number & " " & Err.Description
End Sub
Sub Main_1()
    Dim lngColumn   As Long
    Dim lngRow      As Long
    ' Wenn das Kommentarzeichen vor "As Range" entfernt wird,
    ' läuft der Code auf einen Fehler, denn "rngRange1" muss als
    ' Objektvariable mit Set belegt werden.
    ' Oben funktioniert das noch, da es Variant ist,
    ' ergibt aber das "falsche" Ergebnis, da dann ein Array erzeugt wird
    Dim rngRange1   'As Range
    Dim rngRange    As Range
    Dim shpShape    As Shape
    Dim objShape    As Object
    Dim strTMP      As String
    Dim varArr      As Variant
    Dim varArr1(5)  As Variant
    Dim objPicture1 As OLEObject
    Dim objPicture  As Object
    Dim chtChart    As ChartObject
    Dim DonauDampfschifffahrtsgesellschaftskapitaenspatentunterschrift As String
    On Error GoTo Fin
    lngColumn = Columns.Count
    lngRow = Rows.Count
    rngRange1 = Range("A1:C10")
    Set rngRange = Range("A1:C10")
    Set shpShape = Sheet1.Shapes(1)
    Set objShape = Sheet1.Shapes(1)
    strTMP = "Test"
    varArr = Range("A1:C10")
    varArr1(1) = Range("A1")
    Set objPicture1 = Sheet1.OLEObjects(1)
    Set objPicture = Sheet1.Shapes(1)
    Set chtChart = Sheet1.ChartObjects(1)
    Stop
Fin:
    Set chtChart = Nothing
    Set objPicture = Nothing
    Set objPicture1 = Nothing
    Set rngRange = Nothing
    Set shpShape = Nothing
    Set objShape = Nothing
    If Err.Number <> 0 Then MsgBox "Error: " & _
        Err.Number & " " & Err.Description
End Sub

Beliebte Posts aus diesem Blog

Formeln - auch Array - per VBA eintragen...

Alle Dateien eines Ordners - Optional mit Unterordner

Excel -> Word in Textmarken (Bookmarks)...