Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
980to984
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
980to984
980to984
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Array und Datentypen

Array und Datentypen
Werner
Excel-LEvel: mittelgut
Hallo liebe Forumsmitglieder,
die folgende Frage würde ich selbst mit "nein" beantworten. Ich stelle sie nur, weil es wider Erwarten
manchmal eben doch Möglichkeiten gibt, die einem nicht bekannt sind:
Bei einem zwei- oder mehrdimensionalen Array, z. B. einem mit
Dim (1 To 3, 1 To 5) dimensionierten zweidimensionalen Array, müssen offenbar alle Dimensionen den gleichen Datentyp haben. Oder kann man z.B. die erste Dimension einer zweidimensionalen Arrays als "String", die zweite als "Integer" dimensionieren? Wenn ja, wie geht das? Dank im voraus!
Werner R.

12
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
AW: Array und Datentypen
03.06.2008 12:42:00
Rudi
Hallo,
das geht nicht.
Gruß
Rudi

AW: Array und Datentypen
03.06.2008 12:46:00
Tobias
Hallo Werner!
Ich habe folgenden Code bereits früher gepostet und ihn jetzt etwas modifiziert. Du kannst Ihn gerne ausprobieren und wirst feststellen, dass es mit Var-Arrays schon geht. Vielleicht gibt es aber auch eine Möglichkeit Dein Problem ohne Var-Arrays zu lösen.
Option Explicit
Option Base 1 '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Sub ArrayArrays()
Dim i As Long, j As Long
Dim var1() As Variant
Dim var2() As Variant
Dim var3() As Variant
Dim var() As Variant
ReDim var1(2)
ReDim var2(3)
ReDim var(2)
var(1) = var1
var(2) = var2
For i = LBound(var) To UBound(var)
For j = LBound(var(i)) To UBound(var(i))
var(i)(j) = i * j
Next
Next
For i = LBound(var) To UBound(var)
For j = LBound(var(i)) To UBound(var(i))
Debug.Print var(i)(j)
Next
Next
ReDim Preserve var1(3)
var(1) = var1
var(1)(1) = "a"
var(1)(2) = "b"
var(1)(3) = "c"
For i = LBound(var) To UBound(var)
For j = LBound(var(i)) To UBound(var(i))
Debug.Print var(i)(j)
Next
Next
End Sub


Schönen Gruß, Tobi
www.tobiasschmid.de

Anzeige
AW: Array und Datentypen
03.06.2008 12:49:12
Tobias
Den Code kennst Du sogar ganz bestimmt. War ja auch Deine Anfrage zu Dynamischen Arrays. :-)

Klammerausdrücke unklar
Werner
Hallo Tobias,
das ist sicherlich die indirekte Lösung vom absoluten Fachmann.
Ich frage mich aber, ob es anderen Forumsteilnehmern, ausser natürlich den Spezialisten, nicht auch wie mir ergeht: Man kennt die Anweisungen fast alle, aber was das Programm genau macht, bleibt unklar.
Doch wäre meinem Verständnis schon etwas geholfen, wenn ich wüsste, warum in dem Code an vier
Stellen zwei Klammerausdrücke (und nicht nur einer) auf die Variablenbezeichnung "var" folgen. Vielleicht
kannst du uns das mal in zwei, drei Sätzen erklären. Herzlichen Dank!!
Werner R.

Anzeige
AW: Klammerausdrücke unklar
03.06.2008 13:14:00
Tobias
Die zwei Klammern kommen daher, dass der Code eine fürchterliche Lösung ist ;-).
Das 1. Array ist eigentlich eindimensional. Enthält aber (als eindimensionales Array) den Datentyp Variant. Das ist der Trick und gleichzeitig das Übel.
Mit Var(1) rufst Du also in Deinem eindimensionalen Array das 1. Element auf. Also eine Variable mit dem Datentyp Variant.
Und dieser Variant (=Var(1)) ist eigentlich auch eine Liste, nämlich var1. Du kannst die Element übrigens auch direkt mit var1(1) und var1(2) ansprechen.
Um nun das Element 1,1 aufzurufen musst Du Var(1)(1) angeben. Var(1) gibt dir var1 zurück und die zweite Klammer wird benötigt, um das erste Element von var1 aufzurufen.
Ich hoffe ich konnte trotz der vielen var's den Code halbwegs verständlich erklären.

Anzeige
Allgemeines zu Array und den bösen Variants
03.06.2008 13:25:00
Tobias
Noch ein kleiner Nachtrag.
Wenn man seine ersten Programme mit VBA erstellt, meist mit dem Macro-Recorder, verwendet man etwa in 8 0 % seines Quellcodes die Befehle Select und Activate. Ein sehr unschöner und wenig guter Programmierstil.
Nach einigen Programmen, Schwierigkeiten, Erfahrungen und Lernen versucht man Select und Activate möglichst zu vermeiden. Man arbeitet mit Option Explicit, deklariert Variablen und arbeitet mit Arrays. Das ist schon deutlich besser. Der Programmcode wird sehr sauber und lesbar.
Den Datentyp Variant verwende ich nur ungern, da der Quellcode wieder chaotisch wird. Ohne gute Dokumentation weiß keiner was nun wo gespeichert wird. Besser sind Workarounds mit den "klassischen" Arrays und "richtigen" Datentypen.
Die wichtigste Verwendung für Variant ist der schnelle Import von Excel-Daten nach VBA. Wie der Import und Export von Daten mit VBA und ohne .Range("A1").value.... geht habe ich unter anderem auf meiner Seite erklärt http://schmid.tobi.googlepages.com/variantdatenimport .
Ansonsten würde ich möglichst die Finger von Variant lassen.

Anzeige
Option-Deklarationen
Werner
Hallo Tobias,
Dank f. die Hinweise. Habe mir Deine Website notiert, falls ich mich mal zu Variants informieren muss.
Deklarieren mit Option Explicit ist sehr wichtig. Auch Option Base 1 verwende ich. Man muss dabei
aber aufpassen, dass sich diese Anweisung auf ein ganzes Modul bezieht und nicht nur auf die
Prozedur, an der man gerade arbeitet. Werner R.

eine einfache Notlösung
Werner
Hallo Tobias, hallo Rudi,
Da raucht einem ja der Kopf! Vielleicht von meiner Seite noch eine Notlösung für dieses Problem:
Man konstruiert einfach zwei Arrayvariablen, eine vom Typ String, die andere vom Typ Integer, und redimensioniert sie parallel zueinander. Dann kann man die eine mit Strings, die andere mit Integers
füllen.
Aus praktischer Sicht ist das vielleicht am einfachsten (dieser Gedanke ist mir gerade erst gekommen).
Trotzdem vielen Dank an euch beide! Werner R.

Anzeige
AW: Array und Datentypen
03.06.2008 13:14:17
Rudi
Hallo,

Du kannst Ihn gerne ausprobieren und wirst feststellen


dass er fehlerhaft ist.
Gruß
Rudi

AW: Array und Datentypen
03.06.2008 13:28:00
Tobias
Hast Du Option Base 1 angegeben?

Übersehen, sorry owT
03.06.2008 13:36:00
Rudi

Also wie erwartet
Werner
Hallo Rudi,
dann habe ich also richtig gelegen. Jetzt weiss ich es wenigstens sicher. Herzl. Dank!!
Grüße
Werner R.

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige