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

Inderx außerhalb ... ich finde den Fehler nicht

Inderx außerhalb ... ich finde den Fehler nicht
21.06.2018 09:05:25
Lutz
Hallo,
folgender Code funktioniert, wenn ich die Daten aus ARR02 an ARR03 übergebe:
ARR03Dat(COUNTER, 1) = ARR02Dat(i, 1)
Aber wenn ich die Daten von ARR01 an ARR03 übergeben will:
ARR03Dat(COUNTER, 1) = ARR01Dat(i, 1)
bekomme ich den Laufzeitfehler 9.
Die Ursprungsdaten, die ich in die Arrays ARR01Dat und ARR02Dat einlese sind idenditisch.
Wer findet den Fehler? Danke und Gruß vom Lutz

Sub test01()
Dim i As Long
Dim COUNTER As Long
COUNTER = 1
' ARR01 zur Aufnahme der Daten aus tbl daten1 '
Dim ARR01Dat As Variant
Dim ARR01Zmax As Long
Dim ARR01Smax As Long
' maximale Anzahl Spalten '
ARR01Smax = 8
' Ermittlung Anzahl Zeilen '
tbl01.Activate
Range("A1").End(xlDown).Activate
ARR01Zmax = ActiveCell.Row
Application.Goto Reference:=Range("A1"), Scroll:=True
' Array mit Daten befüllen ohne Überschrift '
With tbl01
ARR01Dat = .Range(.Cells(2, 1), .Cells(ARR01Zmax, ARR01Smax))
End With
' ARR02 zur Aufnahme der Daten aus tbl daten2 '
Dim ARR02Dat As Variant
Dim ARR02Zmax As Long
Dim ARR02Smax As Long
' maximale Anzahl Spalten '
ARR02Smax = 8
' Ermittlung Anzahl Zeilen '
tbl02.Activate
Range("A1").End(xlDown).Activate
ARR02Zmax = ActiveCell.Row
Application.Goto Reference:=Range("A1"), Scroll:=True
' Array mit Daten befüllen ohne Überschrift '
With tbl02
ARR02Dat = .Range(.Cells(2, 1), .Cells(ARR02Zmax, ARR02Smax))
End With
' leeres ARR03 anlegen mit fester Größe: 20.000 Zeilen und 8 Spalten '
Dim ARR03Dat(1 To 20000, 1 To 8) As Variant
' Anzahl Zeilen im Direktbereich ausgeben '
Debug.Print UBound(ARR01Dat)
Debug.Print ARR01Zmax
Debug.Print UBound(ARR02Dat)
Debug.Print ARR02Zmax
Debug.Print UBound(ARR03Dat)
Debug.Print "counter alt: " & COUNTER
' Daten aus ARR01 an ARR03 übergeben '
For i = 1 To ARR01Zmax Step 1
ARR03Dat(COUNTER, 1) = ARR01Dat(i, 1)
COUNTER = COUNTER + 1
Next i
Debug.Print "counter neu: " & COUNTER
' Daten in tbl ausgabe löschen '
With tbl03
.Range(.Cells(2, 1), .Cells(20000, 8)).ClearContents
End With
' Daten in tbl ausgabe ausgeben '
With tbl03
.Range(.Cells(2, 1), .Cells(ARR01Zmax, ARR01Smax)).Value = ARR01Dat
End With
tbl03.Activate
End Sub

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Inderx außerhalb ... ich finde den Fehler nic
21.06.2018 09:32:31
Daniel
Hi
der Index eines Arrays, welches aus einem Zellbereich gelesen wird, beginnt immer mit 1.
wenn du jetzt mit dem Einlesen des Arrays nicht in Zeile 1 beginnst sondern erst in Zeile 2, enthält das Array weniger Zeilen als die Tabelle und damit entspricht dann auch der höchste Index nicht der letzten Zeilennummer in der Tabelle.
dh wenn dein ARR01Zmax = 100 ist, dann ist der größte Index im Array nicht 100, sondern 99.
wenn man Schleifen über solche Arrays laufen lässt, sollte man den höchsten Index immer mit Ubound aktuell ermitteln lassen, dann bist du auf der sicheren Seite und brauchst diese Werte nicht in einer Variablen mitführen:
For i = 1 To Ubound(ARR01Dat, 1) Step 1
gilt theoretisch auch für den Startindex, den man mit LBOUND ermitteln kann, aber hier gilt ja bei Automatisch dimensionierten Arrays je nach Quelle die 0 oder die 1 als kleinster Index
Gruß Daniel
Anzeige
AW: Inderx außerhalb ... ich finde den Fehler nic
21.06.2018 09:42:17
Lutz
Super, Danke.
AW: Index außerhalb
21.06.2018 09:33:02
Nepumuk
Hallo Lutz,
in dieser Zeile:
Dim ARR01Dat(1 To 20000, 1 To 8) As Variant

legste du die Größe des Arrays fest. Wenn du mehr als 20.000 Einträge in ARR01Dat hast läufst du in den Fehler. Dimensioniere ARR01Dat so:
Dim ARR03Dat()
ReDim ARR03Dat(1 To UBound(ARR01Dat), 1 To 8) As Variant

Gruß
Nepumuk
AW: Inderx außerhalb ... ich finde den Fehler nicht
21.06.2018 09:52:59
UweD
Hallo

For i = 1 To ARR01Zmax Step 1
ARR03Dat(COUNTER, 1) = ARR01Dat(i, 1)
COUNTER = COUNTER + 1
Next i
- Dabei ist ARR01Zmax ja die letzte belegte Zeile
- Array beginnen aber immer mit 0
- angenommen, letzte Zeile wäre 20, dann wäre ARR01Dat(0, 1) bis ARR01Dat(19, 1) zulässig
- Du willst aber dann ARR01Dat(20, 1) ansprechen.
....
LG UweD
Anzeige
Array-startindex ist nicht immer 0
21.06.2018 11:05:24
Daniel
nope.
Arrays können mit jedem beliebigen Index beginnen.
bei von System automatisch dimensinierten Arrays kommt sowohl die 0 als auch die 1 vor, je nach Quelle:
0-Basiert: Listbox.List, das durch SPLIT erzeuge Array
1-Basiert: Objektlisten wie (heets(...), das durch Zuweisung aus einem Zellbereich erzeugte Array
dimensioniert man selber, kann man Start- und Endindex frei wählen, so was ist möglich:
dim X(100 to 200)
Gruß Daniel
AW: Inderx außerhalb .. ja wo denn?
21.06.2018 09:57:31
mmat
Hallo,
es ist natürlich schwierig ohne die Daten etwas zu analysieren. Spontan neige ich dazu, der Aussage, dass der Input identisch ist, keinen Glauben zu schenken :-)
Es bleibt nix anderes übrig, als im Trüben zu fischen:
- Bei welchem Counter tritt der Fehler auf?
- Wie sind tbl01/2/3 deklariert?
... und "gute" Ratschläge, nach denen du garnicht gefragt hast zu erteilen: :-)
Diese Sequenz
   Range("A1").End(xlDown).Activate
ARR02Zmax = ActiveCell.Row
Application.Goto Reference:=Range("A1"), Scroll:=True
lässt sich ersetzen durch:
ARR02Zmax=Range("A1").End(xlDown).row

Anzeige
AW: Inderx außerhalb .. ja wo denn?
21.06.2018 11:10:24
Lutz
Super Tip! Danke.
Wie kann ich jetzt dann ARR03, welches ja 20.000 Zeilen groß ist,
dann auf die tatsächlich benötigten Zeilen kürzen?
AW: Inderx außerhalb .. ja wo denn?
21.06.2018 11:27:42
Daniel
Hi
wenn du die Daten aus Arr1 und Arr2 im Arr3 zusammenfassen willst, musst du so vorghen.
1. befüllte Arr1 und Arr2
2. ermittle die Anzahl der benötigten Gesamteinträge, hierzu kannst du Ubound(arr1, 1) und Ubound(arr2, 1) zusammendaddieren.
3. redimensionierte das Arr3 entsprechend
4. befülle das Arr3.
als Code im Prinzip so:

arr1 = tab01.Range(...).Value
arr2 = tab02.Range(...).Value
redim arr3(1 to Ubound(arr1, 1) + Ubound(arr2, 1), 1 to 8)
Counter = 0
for i = 1 to ubound(arr1, 1)
Counter = Counter + 1
arr3(Counter, 1) = arr1(i, 1)
next
for i = 1 to ubound(arr2, 1)
arr3(Counter , 1) = arr2(i, 1)
Next
Gruß Daniel
Anzeige
AW: Inderx außerhalb .. ja wo denn?
21.06.2018 11:50:09
Lutz
Das ganze ist "nur" eine Testumgebung.
Später kommen unterschiedlich viele Daten aus verschiedenen Dateien in das Array (hier ARR03) rein und ich muß das entsprechend groß Vordimmensionieren.
Vor der Ausgabe möchte ich dann aber das Array auf die dann nur tatsächlich verwendete Größe eindampfen - wenn das geht.
Sollte dieser Schritt aber keine "Laufzeiteinspaarung" bringen, kann ich das auch weglassen.
AW: Inderx außerhalb .. ja wo denn?
21.06.2018 13:01:56
mmat
Der Trick besteht darin - wie Daniel schrieb -: erst gucken wieviel du brauchst und dann dimensionieren.
Mit einer Laufzeiteinsparung würde ich dabei nicht rechnen. Die Genauigkeit an dieser Stelle ist nur erforderlich, wenn Gefahr besteht, an Speichergrenzen zu stossen.
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige