Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1952to1956
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
Inhaltsverzeichnis

VBA 2D- oder 3D-Array?

VBA 2D- oder 3D-Array?
29.11.2023 08:36:48
Joschi Witchcraft
Hallo Forum.

Ich bin gerade dabei, eine neue Funktion zu entwickeln. Diese wird von verschiedenen Stellen aufgerufen. Im Normalfall reicht ein 2D-Array. Doch es gibt auch Situationen, in denen ein 3D-Array erforderlich ist, weil Informationen zu mehr als einem Ereignis übergeben werden. Und pro Ereignis sind aktuell 14 Elemente vorgesehen.

Ungern möchte ich grundsätzlich ein 3D-Array vorschreiben.

Mein Problem: wie kann ich - ohne "on Error" - feststellen, ob ein 2D oder ein 3D-Array übergeben wurde?

Gruß Joschi

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA 2D- oder 3D-Array?
29.11.2023 10:44:09
daniel
Hi

Statt 2- und 3- dimensional könntest du das ganze auch eindimensional aufbauen.

Dh das Basis-Array ist immer eindimensional
Wenn man eine zweite Dimension benötigt, dann "füttert" man das Basis-Array nicht mit einem Einzelwert, sonden wiederum mit einem Array.
Also nicht: arr(1) = "x"
Sondern arr(1) = Array("x", "y", "z")

Um die dritte Dimension erzeugen, wird dann das das Array der zweiten Ebene nicht mit Einzelwerten, sondern mit Arrays bestückt.

So kann man beliebig viele Dimensionen erzeugen.

Vorstellen kannst du dir das so:
Bisherige Methode:

Einzelwert = Perle
Eindimensionalen Array = Perlenschnur
Zweidimensionale Array = Perlenteppich
Dreidimensionales Array = Perlenwürfel

Neue Methode:
Einzelwert = Perle
Eindimensionalen Array = Perlenschnur
Zweidimensionales Array = Perlenschnur, die nicht aus Einzelperlen, sondern aus weiteren Perlenschnüren besteht

Um in diesem Konstrukt herauszufinden, ob du ein 2- oder 3-d-array hast, kannst du den Variablentyp eines Elements der zweiten Ebene abfragen. [vartype(x(0)(0))]
Ist dieser ein Einzelwert, hast du nur zwei Dimensionen, ist dieser ein Array, eine dritte.

Allerdings muss man sich hierfür in das Konstrukt: "Mehrdimensionalität durch Verketten von Eindimensionalitäten erzeugen", hineindenken, was schon sehr abstrakt ist.

Also doch besser "on Error" 😉


Gruß Daniel

Anzeige
AW: VBA 2D- oder 3D-Array?
29.11.2023 09:07:59
Joschi Witchcraft
Hallo Fennek.

vielen Dank für Deine Antwort.

Bei der Google-Suche hängt der Erfolg immer damit zusammen, den passenden Suchbegriff zu finden. Mir ist das nicht gelungen.

Wenn ich mir den Code anschaue, dann ist eine Lösung mit "on Error" das kleinere Übel.

"on Error" wird meine Lösung.

Gruß Joschi
AW: VBA 2D- oder 3D-Array?
29.11.2023 09:19:29
Alwin Weisangler
Hallo,

wenn du in VBA eine 3. Dimension oder besser 2+ benötigst, dann wäre das beim Dimensionieren so beispielhaft erzeugt - X Achse 5 Zellen / Y1 2 Zellen Y2 3 Zellen:
ReDim arr(1 To 5, 1 To 2, 1 To 3)
Die "3. Dimension" stellt hier eine Erweiterung in die Tiefe der 2. Dimension dar - hat vielleicht sinnbildlich ein ähnliches Verhalten wie Redim Preserve nur mit Erzeugung einer neuen Unterdimension der letzten Dimension statt mit Änderung der Zellen der 2. Dimension.

Wenn nur die X- und Y- Achse benötigt wird dann beispielhaft so:
ReDim arr(1 To 5, 1 To 2)

Wenn du eine Unterscheidung von : ReDim arr(1 To 5, 1 To 2, 1 To 3) und ReDim arr(1 To 5, 1 To 2) benötigst, braucht es nur ein Bolean um das jeweils gewünschte Array zu erzeugen.

Eine Echte 3. Dimension kann VBA nicht. In wie weit man mit API Zugriff dies verbiegen kann, habe ich mich auch noch nicht damit beschäftigt.

Eine Bemerkung zu On Error.

Benutze bei Verwendung von Arrays dies nur, wenn es keinen anderen Weg gibt. Also nicht benutzen, weil es immer einen anderen Weg gibt.
Arrays sind schön zickig und verlangen vom Anwender einen exakt berechneten Umgang, was zur Genauigkeit zwingt. Willst du dies mir On Error aushebeln?

Gruß Uwe
Anzeige
AW: VBA 2D- oder 3D-Array?
29.11.2023 09:50:25
Joschi Witchcraft
Hallo Uwe.

Auch Dir meinen Dank für Deinen Beitrag.

Da habe ich wohl 3D mit 2D verwechselt. Normalerweise erwarte ich (aktuell) 14 Informationen. In Ausnahmefällen jedoch dies x-mal. Und in den Ausnahmefällen ist die Anzahl der zusätzlichen Informationen bekannt. Deshalb treten die bekannten Erweiterungsprobleme in diesem Fall nicht auf, weil die Array gleich richtig dimensioniert werden kann.

Die Verwendung von "on Error" in diesem Zusammenhang bezieht sich lediglich auf die Ermittlung der Dimension. Ich habe in der Zwischenzeit bereits einen Test-Code dafür erstellt und erfolgreich getestet:

Dim TVRepArr As Variant
Dim Dimens As Integer
Dim DimStufe As Integer

ReDim TVRepArr(1 To 14, 1 To 6) ', 1 To 3) ' (3. Parameter für Test von 3D
On Error Resume Next
For DimStufe = 1 To 5
Dimens = DimStufe + (UBound(TVRepArr, DimStufe) - UBound(TVRepArr, DimStufe))
Next DimStufe
On Error GoTo 0
Debug.Print Dimens

Der doppelte Bezug zu UBound() hebt sich gegenseitig auf, und übrig bleibt der Wert "DimStufe", falls "on Error" das nicht verhindert.

Gruß Joschi

Anzeige
AW: VBA 2D- oder 3D-Array?
29.11.2023 10:32:10
Yal
Hallo Joschi,

da das Begriff "On Error" nur innerhalb einer Sub/Function, ist es zu empfehlen, genau wie in dem Stack Overflow dargestellt, in einer separate Function abzulegen:

Function getDimension(var As Variant) As Long

Dim i As Long
Dim tmp As Long

On Error GoTo Err
For i = 1 To 20
tmp = UBound(var, i)
Next
Err:
getDimension = i - 1
End Function


Dein Code würde dann wie folgt aussehen:

Sub Test()

Dim TVRepArr As Variant

'Test "null-D"
Debug.Print "Test 0D: ", getDimension(TVRepArr)
'Test von 2D
ReDim TVRepArr(1 To 14, 1 To 6)
Debug.Print "Test 2D: ", getDimension(TVRepArr)
'Test von 3D
ReDim TVRepArr(1 To 14, 1 To 6, 1 To 3)
Debug.Print "Test 3D: ", getDimension(TVRepArr)
End Sub


VG
Yal
Anzeige
AW: VBA 2D- oder 3D-Array?
29.11.2023 09:59:19
Yal
Hallo Uwe,

die Aussage "Eine Echte 3. Dimension kann VBA nicht" lässt mich stützen.
Genau gesehen ist der Speicher eines Rechners nur linear (1-dimensional): nach der 4te Stelle kommt die 5te. Eine zwei- oder mehr-dimensionale Dekalaration eines Arrays ist nur eine programmatorische Abstraktion:
Arr( 1 To 3, 1 To 5 )
bedeutet das Element Arr(2,1) ist an der 2 Stelle des Speichers zu finden, das Element Arr(2,2) ist an der 5te Stelle, usw.

Dementsprechend ist es möglich, mehrere Dimensionen in VBA zu implementieren: Arr( 9, 9, 9, 9) für einem 4-dim Array mit 10.000 "Plätze".

Das Begriff "echte Dimension" (wahrscheinlich im Sinne der Räumlichkeit gemeint) kann man keinen Computer zuschreiben. Digitale Bilder sind auch keine echte Bilder, sondern eine lineare Einreihung von Zahlen, die Farbe bedeuten und 2-dimensional dargestellt werden. Beim Film kommt eine Einreihung der Bilder dazu, was als dritte Dimension vorstellbar ist.

VG
Yal

Anzeige
AW: VBA 2D- oder 3D-Array?
29.11.2023 10:03:03
Alwin Weisangler
Hallo,

änder so:

If DimStufe = 2 Then Dimens = DimStufe + (UBound(TVRepArr, DimStufe) - UBound(TVRepArr, DimStufe))
dann braucht es das on Error nicht.

Gruß Uwe
AW: VBA 2D- oder 3D-Array?
29.11.2023 10:36:33
Joschi Witchcraft
Hallo Uwe.

Dein Code (ohne "on Error") läuft auf einen Laufzeitfehler 9, wenn nur eine 1D-Array bereitgestellt wird. Ich setze deshalb auch weiterhin meinen bisherigen Code ein.

Gruß Joschi

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige