Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1840to1844
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

Array, Index außerhalb gültigem Bereich

Array, Index außerhalb gültigem Bereich
02.08.2021 13:20:29
Jörg
Hallo,
ich raffs mal wieder nicht. Der untere Code ..... die For-Schleife läuft einmal durch und zählt von 0 bis 3 hoch, dann wird RecZeilen um 1 erhöht und beim

ReDim Preserve RecArray(RecZeilen, RecSpalten)
kommt dann der Fehler "Index außerhalb gültigem Bereich". Warum das?
Wenn mir da wer helfen könnte, wäre das super. (Die Variable "ai" ist nur zum Testen)
Gruß Jörg

Dim ai As Integer
Dim RecZeilen As Integer
Dim RecSpalten As Integer
ai = 0
RecZeilen = 0
RecSpalten = 3
ReDim RecArray(RecZeilen, RecSpalten)
Do While Not Rec.EOF And Not Rec.BOF
ReDim Preserve RecArray(RecZeilen, RecSpalten)
For spalte = 0 To RecSpalten
RecArray(RecZeilen, spalte) = ai
'               Debug.Print Rec.Fields(0)
Rec.MoveNext
If Rec.EOF Then
Exit Do
End If
ai = ai + 1
Next
RecZeilen = RecZeilen + 1
Loop

13
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Array, Index außerhalb gültigem Bereich
02.08.2021 13:39:48
Daniel
Hi
beachte, dass du in einem mehrdimensionalen Array mit Redim Preserve immer nur die letzte Dimension verändern darfst und alle anderen unverändert bleiben müssen.
ich vermute mal, dass es daran liegt, das auch mehrdimensionale Arrays inter im Speicher eindimensional abgelegt werden und die Werte an bestimmten Stellen stehen.
bei einer Erweiterung der letzten Dimension reicht es dann aus, weiteren Speicherplatz für das Array frei zu geben, würde auch eine andere Dimension verändert, müssten die bereits vorhandenen Daten alle umstrukturiert und auf neue Plätze innerhalb des Speichers verschoben werden.
kannst du dir im Prinzip so vorstellen:
du hast einen Zollstock, der 1m lang ist und aus 10 Segmenten a 10 cm besteht.
jetzt willst du den Zollstock auf 1,2 m vergrößern. 2 weitere Segmente a 10 cm hinten dran zu hängen ist relativ einfach, jedes der bestehnden 10 Segmente von 10 auf 12 cm zu vergrößern erfordert einen erheblichen aufwand, da ist es einfacher, dann den Zollstock gleich neu aufzubauen.
Gruß Daniel
Anzeige
AW: Array, Index außerhalb gültigem Bereich
02.08.2021 13:44:44
GerdL
Hallo Jörg,
man kann mit Redim Preserve nur die letzte bzw. rechte Dimension eines Arrays erhöhen; bei dir wäre dies RecSpalten.
Also besser gespiegelt einlesen in RecArray( 0 to RecSpalten, 0 To recZeilen).
Für die Weiterbearbeitung wäre das Ergebnis dann ggf. transponiert in einen Variant oder einen Tabellenbeich auszulesen, z.B. mit
WorksheetFunction.Transpose(..) oder Application.Transpose(..).
Gruß Gerd
AW: Array, Index außerhalb gültigem Bereich
02.08.2021 13:54:16
Jörg
Super, vielen Dank für die Erklärungen.
Das wieder spricht zwar meiner inneren Hirnstruktur, weil ich das Array lieber nach unten wachsen lassen würde, aber da muß ich dann wohl durch.
Anzeige
AW: Array, Index außerhalb gültigem Bereich
02.08.2021 17:23:12
Yal
Hallo Jörg,
es ist ja auch die Frage, wenn Du schon einen Recordset hast, warum eine Übertragung in einem Array notwendig sei.
Übrigens: Wenn Du dich innerhalb des Recordset nur mit MoveNext, dann brauchst Du nur EOF ("end of file") aber nie BOF ("beginning og file"), weil Du dich eh in nur eine Richtung bewegst.
Folgende Code sollte genau dasselbe erreichen wie dein:

Sub Array_befüllen()
Dim ai As Integer
Dim i As Long
Dim j As Long
ReDim RecArray(rec.RecordCount, rec.Fields.Count)
For i = LBound(RecArray, 1) To UBound(RecArray, 1)
For j = LBound(RecArray, 2) To UBound(RecArray, 2)
RecArray(i, j) = ai
ai = ai + 1
Next
Next
End Sub
(ungetestet)
VG
Yal
Anzeige
AW: Array, Index außerhalb gültigem Bereich
03.08.2021 07:46:49
Jörg
Hallo Yal,
Deinen Code fand ich interessant und habe -da noch nie gebraucht- mich über LBound und UBound informiert.
Was ich aber mit meinem Code versuche, ist die Herstellung von 4er Blöcken, da ich in jedem Record 4 Felder habe (Ist das richtig ausgedrückt?)
Dein Code erzeugt bei dieser Abfrage:

Debug.Print "Block 1"
Debug.Print RecArray(0, 0)
Debug.Print RecArray(1, 0)
Debug.Print RecArray(2, 0)
Debug.Print RecArray(3, 0)
Debug.Print "Block 2"
Debug.Print RecArray(0, 1)
Debug.Print RecArray(1, 1)
Debug.Print RecArray(2, 1)
Debug.Print RecArray(3, 1)
Diese Ausgabe:

Block 1
0
2
4
6
Block 2
1
3
5
7 
Wenn ich das richtig verstanden habe, müßte aber Rec.Fields.Count doch genau die 4 als Feldanzahl liefern .... und da bin ich jetzt raus.
Ich brauche folgende Zuordnung:

Block 1
0
1
2
3
Block 2
4
5
6
7
wie kann ich das "schön" hinkriegen, ohne da in dem Code durch schlechten Stil rumzupfuschen?
Anzeige
Spielwiese
03.08.2021 09:55:11
Yal
Hallo Jörg,
es freut ich zu sehen, dass Du Interesse hast, die Sache zu verstehen.
Probiere folgende "Spiel-Code"

Sub Array_befüllen()
Dim ai As Integer
Dim i As Long
Dim j As Long
Dim RecArray()
ReDim RecArray(3, 3)
For i = LBound(RecArray, 1) To UBound(RecArray, 1)
For j = LBound(RecArray, 2) To UBound(RecArray, 2)
RecArray(i, j) = ai
ai = ai + 1
Next
Next
Debug.Print String(40, "-")
Debug.Print "Original"
For i = LBound(RecArray, 1) To UBound(RecArray, 1)
For j = LBound(RecArray, 2) To UBound(RecArray, 2)
Debug.Print i; j; RecArray(i, j)
Next
Next
Debug.Print String(40, "-")
Debug.Print "invertierte Zugriff"
For i = LBound(RecArray, 1) To UBound(RecArray, 1)
For j = LBound(RecArray, 2) To UBound(RecArray, 2)
Debug.Print i; j; RecArray(j, i) 'hier ist die Unterschied versteckt!
Next
Next
Debug.Print String(40, "-")
Debug.Print "Transponiert"
RecArray = WorksheetFunction.Transpose(RecArray)
For i = LBound(RecArray, 1) To UBound(RecArray, 1)
For j = LBound(RecArray, 2) To UBound(RecArray, 2)
Debug.Print i; j; RecArray(i, j)
Next
Next
End Sub
Der Transpose führt zu einem Verlust der Array-Index ab 0. Ist aber nicht schlimm, solang man eh mit LBound/UBound arbeitet.
VG
Yal
Anzeige
AW: Spielwiese
04.08.2021 07:50:16
Jörg
Hallo Yal,
diesen Text schreibe ich jetzt zum zweiten Mal .... den Aufbau dieses Forums schnall ich wohl irgendwie auch nicht.
Also, vielen Dank für Deine Mühen!!!
Ich bleibe mal beim Original, für invertieren und transponieren habe ich z.Zt. keine Anwendungc, wodurch mir der Sinn nicht einleuchtet.
Ich habe versucht Deinen Code zu erweitern, da ich nicht nur 4 4er Blöcke einlese sondern so 600 - 800.
Damit das passt, müßte ich mit Redim Preserve .... das Array erweitern und zwar die linke Stelle, also das "i".
Was aber ja nun nicht geht.
Sorry, aber ich kann mir das räumlich nicht vorstellen, weil man sein ganzes Leben lang Listen nach unten erweitert hat :-(
Anzeige
AW: Spielwiese
04.08.2021 08:11:28
Jörg
Ich habe den Code jetzt so verändert, wie ich glaube das es laufen müßte.
Nun, der obere Teil läuft durch, was auch immer er da tut, denn ich kann es mir nicht ansehen, weil bei der Ausgabe ein Fehler "Ungültiger Bereich .." kommt

Sub Array_befüllen()
Dim ai As Integer
Dim i As Long
Dim j As Long
Dim RecArray()
ReDim RecArray(3, 0)
Do While ai 

AW: Spielwiese
04.08.2021 08:17:39
Jörg
Ok, kann nicht gehen.
Zwar wird das Array wohl erweitert, aber ich überschreibe auch immer wieder die alten Werte und hänge nichts an ...... glaube ich
AW: Spielwiese
04.08.2021 10:29:19
Yal

For i = LBound(RecArray, 1) To UBound(RecArray, 1)
For j = LBound(RecArray, 2) To UBound(RecArray, 2)
Debug.Print j; i; RecArray(j, i) '

Anzeige
AW: Array, Index außerhalb gültigem Bereich
04.08.2021 13:50:52
Jörg
Hi,
ich bin auf meinen ursprünglichen Code zurückgesprungen. Trotz aller Bemühungen von Yal verstehe ich nur hier was passiert.
Hier das Ergebnis, falls mal einer sucht:

Dim RecZeilen As Integer
Dim RecSpalten As Integer
RecZeilen = 3
RecSpalten = 0
ReDim RecArray(RecZeilen, RecSpalten)
Do While Not Rec.EOF
ReDim Preserve RecArray(RecZeilen, RecSpalten)
For zeile = 0 To RecZeilen
RecArray(zeile, RecSpalten) = Rec.Fields(0)
Rec.MoveNext
Next
RecSpalten = RecSpalten + 1
Loop
... und diese Abfrage -der Übersicht wegen ohne schleifen-

Debug.Print "Block 1"
Debug.Print RecArray(0, 0)
Debug.Print RecArray(1, 0)
Debug.Print RecArray(2, 0)
Debug.Print RecArray(3, 0)
Debug.Print "Block 2"
Debug.Print RecArray(0, 1)
Debug.Print RecArray(1, 1)
Debug.Print RecArray(2, 1)
Debug.Print RecArray(3, 1)
Debug.Print "Block 3"
Debug.Print RecArray(0, 2)
Debug.Print RecArray(1, 2)
Debug.Print RecArray(2, 2)
Debug.Print RecArray(3, 2)
Debug.Print "Block 4"
Debug.Print RecArray(0, 3)
Debug.Print RecArray(1, 3)
Debug.Print RecArray(2, 3)
Debug.Print RecArray(3, 3)
bringt dieses Ergebnis:

Block 1
502801,870637999
558,668745153333
295,858294
816,4611
Block 2
495013,712937
550,015236596666
321,177255
807,741026
Block 3
496067,869488
551,186521653333
327,102195
782,016924
Block 4
493896,826824
548,774252026667
343,82803
774,825923
genau die Form, die ich brauche, hier jeweils:

Block X
Gesamtzahl seit Zählerstart
Mittelwert
Kleinstwert
Größtwert
Nochmal dank an alle Helfer!
Anzeige
AW: Array, Index außerhalb gültigem Bereich
05.08.2021 11:14:01
Yal
Hallo Jörg,
wenn Du schon diese Daten aus einer Datenbank holst, warum lässt Du nicht diese Kennzahlen in der DB rechnen, anstatt höchst kompliziert in Excel zu übertragen und berechnen (genau gesehen, nicht mal "Excel" sondern im VBA)?
Select Sum(*), Avg(*), Min(*), Max(*)
From Tabxx
Where ...
Aber wenn Du an der Gestaltung eines SQL vorbeigehen möchtest, solltest Du Dir den Power Query anschauen.
VG
Yal
AW: Array, Index außerhalb gültigem Bereich
05.08.2021 11:33:45
Jörg
Hallo Yal,
Ich rechne doch gar nicht. Damit lese ich nur die jeweils 4 Felder eines Eintrages aus der Datenbank aus. Diese Werte werden jetzt an unterschiedlichen Stellen in Tabellen eingetragen und dort dann weiterverarbeitet.
Diese Tabellen stehen schon, werden bisher aber per Copy&paste befüllt. Ich mache nur die Automatik mit der Datenbank.
Was Du geschrieben hast, ist mir schon wieder zu hoch, ich weiß gar nicht, was mit dem Select sum ..... bewirkt wird.
Den SQL-Befehl habe ich bekommen.
Gruß Jörg
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige