Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: VBA: zweidimensionale Variablen (Array)

VBA: zweidimensionale Variablen (Array)
02.12.2007 10:13:28
Dirk
Hallo,
ich verzweifle gerade an einem (eher leichten) VBA-Problem:
irgendwas stimmt an der unteren Schleife nicht(relevanter Code-Ausschnitt); VBA kompiliert zwar, aber die Berechnung im Excel-Sheet funktioniert nicht: #WERT!)
Ich erläre kurz, was ich mit dieser Schleife bezwecken will. zz soll eine zweidimensionale Variable sein:
zz (i, j). Dieser Variablen sollen in zwei verschachtelten Schleifen (äußere Schleife i, innere Schleife j) die jeweiligen Werte zugewiesen und erst mal dort (bei zz(i, j) ) abgelegt werden . Diese berechneten Werte heißen zi (1. Dimension) bzw. zj (2. Dimension). Diese wurden zuvor jeweils aus ui bzw uj berechnet ("InvNorm" ist eine zuvor definierte benutzerdef. Funktion). kn und ks snd eigtl. nur Konstanten. Das Besondere ist eben nur, dass ui und damit auch zi von i bzw. number_of_paths abhängt und uj bzw. zj von j bzw. steps_per_path. Wenn ui und uj von einer einheitlichen Größe abhängen würde (z.B. von number_of_paths) , wäre es leicht. Hoffentlich kann mir jemand helfen.
ReDim zz(1 To number_of_paths, 1 To steps_per_path)
ui = 0
uj = 0
For i = 1 To number_of_paths
ui = (i - 1 + kn) / number_of_paths
zi = InvNorm(ui)
For j = 1 To steps_per_path
uj = (j - 1 + ks) / steps_per_path
zj = InvNorm(uj)
zz(zi, zj) = Array(zi, zj)
Next j
Next i
Vielen Dank vorab!!!!
Dirk

Anzeige

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

Betreff
Datum
Anwender
Anzeige
AW: VBA: zweidimensionale Variablen (Array)
02.12.2007 14:42:56
Daniel
Hi
woher nimmst du die gewissheit,daß der Fehler in diesem Abschnitt des Codes liegt?
was machst du im Anschluss mit der Array-Variable ZZ ?
bei der Weiterverarbeitung solltest du ggf bedenken, daß jeder Einzelwert von ZZ kein Wert, sondern selbst wieder ein eindimensionales Array-Feld mit 2 Werten ist.
Sollte die Zeile, in der die Werte zugewiesen werden, nicht besser so aussehen:

zz(i, j) = Array(zi, zj)


Gruß, Daniel

Anzeige
AW: VBA: zweidimensionale Variablen (Array)
02.12.2007 14:48:00
Harry
Hallo Dirk,
ich weiß nicht, ob ich dein Problem richtig verstanden habe bzw. ich verstehe die dahinterstehende Aufgabenstellung nicht. Die Syntax ist prinzipiell richtig, aber:
1. Du arbeitest nicht mit einem 2-dimensionalen Array, sondern mit einem 3-dimensionalen
Du definierst zwar zz(1 to.., 1 to..) grundsätzlich 2-dimensional, aber durch die Zuweisung

zz(zi, zj) = Array(zi, zj)


wird jedem dieser Felder statt eines Wertes ein Array zugeweisen.
2. Ist dies so dein Wunsch? Wenn ja, was ist dein Problem? Der Zugriff auf ein einzelnes Element
Falsch sind


Dim a as integer
a=zz(1,2) 'Falsch, da hier ein ganzes Array zugewiesen würde
oder
Range("A1")=z(3,4) 'Falsch, da hier ein ganzes Array zugewiesen würde 


Korrekt wäre


Dim a as integer
a=zz(1,2)(0) 'zi-Wert des Feldes deines 2-dim. Array's
oder
Range("A1")=z(3,4) 'zj-Wert des Feldes deines 2-dim. Array's


Ich lass mal offen, falls ich dich mißverstanden habe.
Gruß
Harry

Anzeige
AW: VBA: zweidimensionale Variablen (Array)
02.12.2007 16:13:00
Dirk
Hallo zusammen,
ich wollte eigentlich nur die jeweiligen zi's der ersten Schleife als erste Dimension und die zj's der zweiten inneren Schleife als zweite Dimension in der zz-Variablen ablegen. Das war's schon. Aber wie geht das?
Bsp.: i = 1 to 2; die daraus resultierenden zi-Werte lauten 5 (für i=1) und 8 (für i=2).
Für die zi's gibt's eine Formel (vgl. Code).
j = 1 to 3; die daraus resultierenden zj-Werte lauten z.B. 3 (für j=1), 6 (für j=2) und 11 (für j=3).
Für die zj's gibt's eine Formel (vgl. Code).
So, und jetzt hätte ich gerne 2 x 3 = insges. 6 zz-Werte (und zwar als Array-Variable):
1) zz(1,1) = (5,3)
2) zz (1,2) = (5,6)
3) zz(1,3) = (5,11)
4) zz(2,1) = (8,3)
5) zz(2,2) = (8,6)
6) zz(2,3) = (8,11).
Nicht mehr und nicht weniger!
Wie bekomme ich nun diese zweidimensionale Variable (wie oben dargestellt) in meinem Original-Beispiel-Code gefüttert?
PLEASE HELP ME!!!
Gruß
Dirk

Anzeige
AW: VBA: zweidimensionale Variablen (Array)
02.12.2007 16:17:00
Dirk
Sorry, die Frage ist natürlich noch offen!

AW: VBA: zweidimensionale Variablen (Array)
02.12.2007 16:20:00
Daniel
Hi
dimensionier ZZ als das was es ist, ein 3-dimensionales Array-Feld und bau den Code so um:
ReDim zz(1 To number_of_paths, 1 To steps_per_path, 1 to 2)
ui = 0
uj = 0
For i = 1 To number_of_paths
ui = (i - 1 + kn) / number_of_paths
zi = InvNorm(ui)
For j = 1 To steps_per_path
uj = (j - 1 + ks) / steps_per_path
zj = InvNorm(uj)
zz(i, j, 1) = zi
zz(i, j, 2) = zj
Gruß, Daniel

Anzeige
AW: VBA: zweidimensionale Variablen (Array)
02.12.2007 16:32:00
Dirk
Hallo Daniel,
danke für deinen Vorschlag. Aber wenn du dir mein Beispiel von vorhin anschaust, dann sind es doch eigentlich nur 2 Dimensionen (i und j). Als solche soll sie im weiteren Verlauf dann auch nochmals verwendet werden , da gibt's dann nochmals eine j-Schleife und eine äußere i-Schleife.
Wieso muss ich denn hier eine (fiktive) dritte Dimension verwenden? Diese kommt doch im Beispiel auch nicht vor. Oder geht das wirklich nicht anders?
DANKE!
Gruß
Dirk

Anzeige
AW: VBA: zweidimensionale Variablen (Array)
02.12.2007 16:34:06
Dirk
Frage ist noch offen.

AW: VBA: zweidimensionale Variablen (Array)
02.12.2007 16:36:28
Daniel
Hi
es kommt darauf an, was du haben willst.
soll die Einzelvariable ZZ(x,y) ein normaler Zahlenwert sein oder ein Array-Feld mit 2 Werten?
in deinem Eingangsbeispiel weist du ja den ZZ(x,y)-Werten ein Array-Feld zu, dadurch bringst du die 3. Dimension rein
Gruß, Daniel

Anzeige
AW: VBA: zweidimensionale Variablen (Array)
02.12.2007 16:47:00
Harry
Hallo Dirk,
Daniel hat im Parallelthread recht, vielleicht nur als Hinweis von mir

So, und jetzt hätte ich gerne 2 x 3 = insges. 6 zz-Werte (und zwar als Array-Variable):
1) zz(1,1) = (5,3)
2) zz (1,2) = (5,6)
3) zz(1,3) = (5,11)
4) zz(2,1) = (8,3)
5) zz(2,2) = (8,6)
6) zz(2,3) = (8,11).


Falsch, du hast hier nicht 6 zz-Werte, sondern 6 Wertpaare (UNTERSCHIED)
D.h. entweder du verhältst dich so, wie von mir oder Daniel vorgeschlagen, oder du kriegst nix vom Nikolaus.
Aber Alternative: Du hast keine 6 Werte, sondern im Beispiel nur 5, nämlich für zi nur 5 und 8 und für zj nur 3,6,11 und daraus resultieren 6 eindeutige Wertkombinationen.
Nimm also zwei 1-dimensionale Array's und fülle sie so


ReDim zzi(1 To number_of_paths)
ReDim zzj(, 1 To steps_per_path)
ui = 0
uj = 0
For i = 1 To number_of_paths
ui = (i - 1 + kn) / number_of_paths
zi = InvNorm(ui)
zzi(i)=zi
Next i
For j = 1 To steps_per_path
uj = (j - 1 + ks) / steps_per_path
zj = InvNorm(uj)
zzj(i)=zj
Next j

Dann kannst du alle Wertpaare über die Kombination zzi(x), zzj(y) abgreifen.
Dies entspricht inhaltlich dem bereits genannten zz(x,y)(0 oder 1).
Gruß
Harry

Anzeige
;
Anzeige
Anzeige

Infobox / Tutorial

VBA: Zweidimensionale Variablen (Array) korrekt nutzen


Schritt-für-Schritt-Anleitung

Um eine zweidimensionale Array-Variable in VBA korrekt zu verwenden, folge diesen Schritten:

  1. Definiere die Array-Variable: Erstelle eine zweidimensionale Variable mit ReDim.

    Dim zz() As Variant
    ReDim zz(1 To number_of_paths, 1 To steps_per_path)
  2. Setze die Schleifen auf: Verwende zwei verschachtelte Schleifen, um die Werte zu berechnen und in das Array einzufügen.

    For i = 1 To number_of_paths
       ui = (i - 1 + kn) / number_of_paths
       zi = InvNorm(ui)
       For j = 1 To steps_per_path
           uj = (j - 1 + ks) / steps_per_path
           zj = InvNorm(uj)
           zz(i, j) = Array(zi, zj)
       Next j
    Next i
  3. Zugriff auf die Werte: Wenn du auf die Werte zugreifen möchtest, verwende die Indizes und achte darauf, dass zz(i, j) tatsächlich ein Array ist.

    Dim a As Variant
    a = zz(1, 1)(0) ' Zugriff auf zi-Wert

Häufige Fehler und Lösungen

  • Fehler bei der Zuweisung: Stelle sicher, dass du die Array-Variable korrekt zuweist.

    ' Falsch:
    zz(zi, zj) = Array(zi, zj) ' Dies führt zu Verwirrung, da es den Index falsch verwendet.
    
    ' Richtig:
    zz(i, j) = Array(zi, zj) ' Hier wird die Schleifenvariable verwendet.
  • Zugriff auf ein Element: Wenn du versuchst, auf ein Element des Arrays zuzugreifen, verwende den richtigen Index:

    ' Falsch:
    a = zz(1, 2) ' Versucht, ein ganzes Array zu lesen.
    
    ' Richtig:
    a = zz(1, 2)(0) ' Zugriff auf den ersten Wert des Arrays.

Alternative Methoden

Wenn du die Struktur deines Codes anpassen möchtest, kannst du auch zwei eindimensionale Arrays verwenden, um die Werte zu speichern. Hier eine mögliche Vorgehensweise:

Dim zzi() As Double
Dim zzj() As Double
ReDim zzi(1 To number_of_paths)
ReDim zzj(1 To steps_per_path)

For i = 1 To number_of_paths
    ui = (i - 1 + kn) / number_of_paths
    zzi(i) = InvNorm(ui)
Next i

For j = 1 To steps_per_path
    uj = (j - 1 + ks) / steps_per_path
    zzj(j) = InvNorm(uj)
Next j

Mit dieser Methode kannst du die Werte über Kombinationen von zzi(x) und zzj(y) abgreifen.


Praktische Beispiele

Hier ein Beispiel zur Veranschaulichung, wie du mit einer zweidimensionalen Array-Variable arbeiten kannst:

Dim zz(1 To 2, 1 To 3) As Variant
zz(1, 1) = Array(5, 3)
zz(1, 2) = Array(5, 6)
zz(1, 3) = Array(5, 11)
zz(2, 1) = Array(8, 3)
zz(2, 2) = Array(8, 6)
zz(2, 3) = Array(8, 11)

' Zugriff auf die Werte
Debug.Print zz(1, 1)(0) ' Gibt 5 aus
Debug.Print zz(2, 3)(1) ' Gibt 11 aus

Tipps für Profis

  • Array-Initialisierung: Achte darauf, dass du die Größe deines Arrays korrekt definierst, bevor du darauf zugreifst.
  • Fehlersuche: Verwende Debug.Print, um die Werte während der Berechnung zu überprüfen. Dies hilft, Probleme frühzeitig zu erkennen.
  • Dokumentation: Kommentiere deinen Code gut, insbesondere bei komplexen Berechnungen.

FAQ: Häufige Fragen

1. Kann ich ein zweidimensionales Array in VBA verwenden? Ja, du kannst in VBA ein zweidimensionales Array verwenden, um Werte in einer Matrixstruktur zu speichern, indem du die Dimensionen beim Deklarieren angibst.

2. Wie greife ich auf die Werte in einem Array zu? Du kannst auf die Werte in einem Array zugreifen, indem du die Indizes der Dimensionen angibst. Achte darauf, dass du die richtige Syntax verwendest, um auf die Elemente zuzugreifen.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige