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]
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]
OptionExplicit
'--------------------------------------------------------------------------
' Module : Module1
' Procedure : Main
' Author : Case (Ralf Stolzenburg)
' Date : 14.05.2013
' Purpose : Variablendeklaration...
'--------------------------------------------------------------------------
SubMain()
DimlngColumn'As Long
DimlngRow'As Long
DimrngRange1'As Range
DimrngRange'As Range
DimshpShape'As Shape
DimobjShape'As Object
DimstrTMP'As String
DimvarArr'As Variant
DimvarArr1(5)'As Variant
DimobjPicture1'As OLEObject
DimobjPicture'As Object
DimchtChart'As ChartObject
' Auch sowas ist möglich..., aber eher nicht praktikabel :-)
DimDonauDampfschifffahrtsgesellschaftskapitaenspatentunterschriftAsString
OnErrorGoToFin
' 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
SetrngRange=Range("A1:C10")
' Das "erste" Shape wird der Objektvariablen zugewiesen
SetshpShape=Sheet1.Shapes(1)
' Das "erste" Shape wird der Objektvariablen zugewiesen
SetobjShape=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
SetobjPicture1=Sheet1.OLEObjects(1)
' Hier nochmal statt mit OLEObjects mit der Shapesauflistung
SetobjPicture=Sheet1.Shapes(1)
' Objektvariable mit ChartObjects-Auflistung (1) belegt
SetchtChart=Sheet1.ChartObjects(1)
' Code stoppt hier automatisch
Stop
Fin:
' Objektvariablen leeren
SetchtChart=Nothing
SetobjPicture=Nothing
SetobjPicture1=Nothing
SetrngRange=Nothing
SetshpShape=Nothing
SetobjShape=Nothing
' Eventuell auftretenden Fehler ausgeben
IfErr.Number<>0ThenMsgBox"Error: "&_
Err.Number&" "&Err.Description
EndSub
SubMain_1()
DimlngColumnAsLong
DimlngRowAsLong
' 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
DimrngRange1'As Range
DimrngRangeAsRange
DimshpShapeAsShape
DimobjShapeAsObject
DimstrTMPAsString
DimvarArrAsVariant
DimvarArr1(5)AsVariant
DimobjPicture1AsOLEObject
DimobjPictureAsObject
DimchtChartAsChartObject
DimDonauDampfschifffahrtsgesellschaftskapitaenspatentunterschriftAsString
OnErrorGoToFin
lngColumn=Columns.Count
lngRow=Rows.Count
rngRange1=Range("A1:C10")
SetrngRange=Range("A1:C10")
SetshpShape=Sheet1.Shapes(1)
SetobjShape=Sheet1.Shapes(1)
strTMP="Test"
varArr=Range("A1:C10")
varArr1(1)=Range("A1")
SetobjPicture1=Sheet1.OLEObjects(1)
SetobjPicture=Sheet1.Shapes(1)
SetchtChart=Sheet1.ChartObjects(1)
Stop
Fin:
SetchtChart=Nothing
SetobjPicture=Nothing
SetobjPicture1=Nothing
SetrngRange=Nothing
SetshpShape=Nothing
SetobjShape=Nothing
IfErr.Number<>0ThenMsgBox"Error: "&_
Err.Number&" "&Err.Description
EndSub