Was können Felder eigenlich aufnehmen?
Nun, so ziemlich alles.
Ist ja nur eine Frage, als was ich diese deklariere.
In der Regel versucht man auch hier, typensicher zu deklarieren, d.h. den Typ festzulegen, der in die einzelnen Indizes geschrieben werden kann.
Also Dim fMeinFeld(2) as Long für Long Werte, as Object für Objekte as ...
Aber gerade in Excel werden wir häufig auf das ansonsten ungeliebte Variant zugreifen.
Warum?
Stellen Sie einfach im Aktiven Tabellenblatt folgendes her:
Probieren wir nun folgenden Code aus:
Public Sub FeldTest5a()
Dim fMeinFeld(1 To 2) As Long
fMeinFeld(1) = Cells(1, 1)
fMeinFeld(2) = Cells(2, 1)
End Sub
Und schon sehen wir das Desaster. Bei der zweiten Anweisung fängt VBA an zu spucken. Ist auch klar, Haus ist nunmal
kein Long sondern ein String.
Wir ändern dies ein wenig und lassen uns aber auch gleich die Typen der einzelnen Felder ausgeben:
Public Sub FeldTest5b()
Dim fMeinFeld(1 To 2) As Variant
fMeinFeld(1) = Cells(1, 1)
fMeinFeld(2) = Cells(2, 1)
MsgBox TypeName(fMeinFeld(1))
MsgBox TypeName(fMeinFeld(2))
fMeinFeld(2) = Cells(1, 1)
MsgBox TypeName(fMeinFeld(2))
End Sub
Das schauen wir uns mal genauer an:
Hier habe ich mein Feld als Variant deklariert, kann also alle Typen aufnehmen.
Nach den Zuweisungen, lassen wir uns ausgeben, was für ein Typ der einzelne Index in unserm Feld kurzfristig annimmt.
Interessant ist dabei die Veränderung von fMeinFeld(1,1).
Erst war es Double und dann wird es zu String. Im Hintergrund ist es aber natürlich immer noch Variant!
Ich möchte jetzt nicht alle Typen aufzählen, die ein Feld aufnehmen kann, probieren Sie es einfach immer selbst.
Aber denken Sie daran, dass es auch Objekte aufnehmen kann, also ein Rangeobjekt oder ein Worksheetobjekt oder was weiß ich. Hier fängt Ihre eigene Fantasie an.
Trotzdem noch etwas, was vielleicht nicht ganz klar ist:
Felder können auch Felder aufnehmen. Und da es vielleicht nicht klar ist, wie man diese dann wieder zurückbekommt, hier ein kleines Beispiel:
(Auch wenn es nicht sehr oft Sinn dafür gibt und wir etwas aufpassen müssen, dass wir nicht auf einmal irrsinnige Speicherplatzreservierung haben. Die Technik ansich will ich Ihnen wenigstens gezeigt haben.)
Public Sub FeldTest6()
Dim fMeinFeld(1 To 2) As Variant
Dim fAnderesFeld(1 To 2, 1 To 3) As Long
fAnderesFeld(1, 2) = 15
fAnderesFeld(2, 3) = 20
fMeinFeld(1) = fAnderesFeld
MsgBox fMeinFeld(1)(1, 2)
MsgBox fMeinFeld(1)(2, 3)
End Sub
Beachten Sie die Ausgabeart.
Vielleicht noch ein besseres Beispiel zum Verständnis und was man damit machen kann:
Public Sub FeldTest7()
Dim fMeinFeld(1 To 2) As Variant, i As Long
Dim fAnderesFeld(1 To 2, 1 To 3) As Long
For i = 1 To 2
fMeinFeld(i) = fAnderesFeld
Next i
fMeinFeld(1)(2, 3) = 5
fMeinFeld(2)(2, 3) = 6
MsgBox fMeinFeld(1)(2, 3)
MsgBox fMeinFeld(2)(2, 3)
MsgBox fAnderesFeld(2, 3)
End Sub
Hier initialisieren wir praktisch jedes fMeinFeld mit fAnderesFeld.
Beachten Sie hier, dass im Code die Zuweisung direkt in das fMeinFeld erfolgt und das fAnderesFeld nicht berührt wird!!