Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Anzeige
Inhaltsverzeichnis

Laufzeitfehler 9

Forumthread: Laufzeitfehler 9

Laufzeitfehler 9
27.03.2025 12:30:35
Georg
Liebe Mitglieder, ich bekomme beim Ausführen immer den Fehler
Laufzeitfehler 9 - Index außerhalb des gültigen Bereichs
Der Fehler taucht hier auf:
If arrGI(i, 1) = arrB(j, 1) Then ' Vergleich von G und B
ich verstehe nicht warum. Danke für eure Hilfe
Hier die Beispielsdatei
https://www.herber.de/bbs/user/176451.xlsm

Sub VergleicheUndSchreibeAngepasst()

Dim ws As Worksheet
Dim lastRowB As Long, lastRowG As Long
Dim arrB() As Variant, arrGI() As Variant
Dim i As Long, j As Long

' Arbeitsblatt festlegen
Set ws = ThisWorkbook.Worksheets("AbgleichGeneral") 'AbgleichUser_vs_Personalliste

' Letzte Zeilen in den jeweiligen Spalten ermitteln
lastRowB = ws.Cells(ws.Rows.Count, 2).End(xlUp).Row
lastRowG = ws.Cells(ws.Rows.Count, 7).End(xlUp).Row

' Dynamische Arrays füllen
arrB = ws.Range("B9:D" & lastRowB).Value ' Bereich für B bis D
arrGI = ws.Range("G9:I" & lastRowG).Value ' Bereich für G bis I

' Werte vergleichen und Ergebnisse schreiben
For i = 9 To lastRowG ' Schleife für jede Zeile in Spalte G
For j = 9 To lastRowB ' Schleife für jede Zeile in Spalte B
If arrGI(i, 1) = arrB(j, 1) Then ' Vergleich von G und B
arrGI(i, 3) = arrB(j, 3) ' Wert aus Spalte D in Spalte I schreiben
Exit For ' Schleife abbrechen, wenn Übereinstimmung gefunden
End If
Next j
Next i

' Ergebnisse zurückschreiben
ws.Range("G9:I" & lastRowG).Value = arrGI
End Sub
Anzeige

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

Betreff
Datum
Anwender
Anzeige
AW: Laufzeitfehler 9
27.03.2025 13:00:35
RPP63
Moin!
Wenn Du ein Variant-Array mittels Range().Value füllst, ist dies 1-basiert!
B9:D17 ergibt arr(1 to 9, 1 to 3)
Daher laufen die Variablen, die ab 9 beginnen, schnell in besagten LZF

Gruß Ralf
AW: Laufzeitfehler 9
27.03.2025 13:47:33
Daniel
Hi

Wie Ralf schon schrieb: wenn du die Werte in ein Array schreibst, dann bist du vom Zellbereich und dessen Zeilennummern unabhängig.

Die Array-Zeilen beginnen immer mit 1, egal aus welchem Zellbereich du die übernommen hast.

Um für eine Schleife die auch die letzte Array-Zeile oder Spalte zu ermitteln , kannst du UBound verwenden:

For i = 1 To UBound(arrGI, 1)

For j = 1 to UBound(arrB, 1)

Im zweiten Parameter steht die 1 für "höchster Zeilenindex" und die 2 für "höchster Spaltenindex.

Gruß Daniel

Anzeige
AW: Laufzeitfehler 9
27.03.2025 13:56:58
Onur
Wenn du z.B. den Bereich ab C4 bis D6 in eine Variable packst, bedeutet es, dass das Array immer mit Arr(1,1) anfängt und nicht mit Arr(4,3). Soll heissen - die Zeilennummern und Spaltennummern gehen verloren., da sie nirgendwo erfasst werden.
Da du ja...
27.03.2025 20:03:14
Case
Moin Georg, :-)

... "Tabellen/ListObjects" nutzt, kannst du es auch so angehen (nur Ansatz): ;-)
Option Explicit

Public Sub Main()
Dim varArrB As Variant
Dim varArrG As Variant
With ThisWorkbook.Worksheets("AbgleichGeneral")
Debug.Print "Adresse des ListObject: " & .ListObjects("tblPersis").Name & " = " & .ListObjects("tblPersis").DataBodyRange.Address
varArrB = .ListObjects("tblPersis").DataBodyRange
Debug.Print "Adresse des ListObject: " & .ListObjects("tblstCat").Name & " = " & .ListObjects("tblstCat").DataBodyRange.Address
varArrG = .ListObjects("tblstCat").DataBodyRange
Debug.Print "Anzahl Zeilen des ListObject: " & .ListObjects("tblPersis").Name & " = " & .ListObjects("tblPersis").ListRows.Count
Debug.Print "Anzahl Zeilen des ListObject: " & .ListObjects("tblstCat").Name & " = " & .ListObjects("tblstCat").ListRows.Count
Debug.Print "In welcher Zeile sitzt das ListObject: " & .ListObjects("tblPersis").Name & " = " & .ListObjects("tblPersis").Range.Row
Debug.Print "In welcher Zeile sitzt das ListObject: " & .ListObjects("tblstCat").Name & " = " & .ListObjects("tblstCat").Range.Row
Debug.Print "In welcher Spalte sitzt das ListObject: " & .ListObjects("tblPersis").Name & " = " & .ListObjects("tblPersis").Range.Column
Debug.Print "In welcher Spalte sitzt das ListObject: " & .ListObjects("tblstCat").Name & " = " & .ListObjects("tblstCat").Range.Column
End With
End Sub

In den Listobjects sind alle Informationen über Zeilen und Spalten gespeichert. Damit kannst du deine Schleifen und die Ausgabe auch aufbauen. ;-)

Servus
Case
Anzeige
AW: Laufzeitfehler 9
28.03.2025 11:56:08
Marc
Deine Arrays gehen von 1 bis 9

deine Schleifen beginnen aber erst bei 9 ...

das heißt 1x geht es gut ,danach sind die Arrays zu ende...

also entweder Schleifen bei 1 beginnen
oder Schleifen statt Step +1 auf Step -1 setzen (dann zählt er runter..
AW: Laufzeitfehler 9
27.03.2025 14:23:22
Onur
Aber warum VBA?
Eine Formel reicht doch völlig.
Und wenn du dich wunderst, dass z.B. der erste Name nicht gefunden wurde, dann schau dir die beiden Vornamen mal GENAU an.
https://www.herber.de/bbs/user/176454.xlsm
Anzeige
AW: Laufzeitfehler 9
27.03.2025 16:32:16
Georg
Wollte etwas mehr über arrays verstehen und lernen, und das Beispiel kam mir gerade recht. G
AW: Laufzeitfehler 9
27.03.2025 13:12:48
Georg
Danke Ralf, ich bin in arrays leider nicht so firm. Hab zwar so ungefähr verstanden was du meinst, aber was muss ich ändern? 1 to lastrowG? Danke Georg
AW: Laufzeitfehler 9
27.03.2025 13:19:16
RPP63
Korrekt, Georg!
For i = 9 - 8 To lastRowG - 8

For j = 9 - 8 To lastRowB - 8

Statt 9 - 8 kannst Du natürlich auch 1 schreiben. ;)
Dient hier nur dazu, dass bei beiden Werten 8 abgezogen werden muss.
Anzeige
AW: Laufzeitfehler 9
27.03.2025 14:07:03
GerdL
Moin,

wenn du bei Schleifenanfängen u. -enden nicht rechnen willst.
Sub VergleicheUndSchreibeAngepasst()

Dim ws As Worksheet
Dim lastRowB As Long, lastRowG As Long
Dim arrB() As Variant, arrGI() As Variant
Dim i As Long, j As Long

' Arbeitsblatt festlegen
Set ws = ThisWorkbook.Worksheets("AbgleichGeneral") 'AbgleichUser_vs_Personalliste

' Letzte Zeilen in den jeweiligen Spalten ermitteln
lastRowB = ws.Cells(ws.Rows.Count, 2).End(xlUp).Row
lastRowG = ws.Cells(ws.Rows.Count, 7).End(xlUp).Row

' Dynamische Arrays füllen
arrB = ws.Range("B9:D" & lastRowB).Value ' Bereich für B bis D
arrGI = ws.Range("G9:I" & lastRowG).Value ' Bereich für G bis I

' Werte vergleichen und Ergebnisse schreiben
For i = LBound(arrGI, 1) To UBound(arrGI, 1) ' Schleife für jede Zeile in arrGI
For j = LBound(arrB, 1) To UBound(arrB, 1) ' Schleife für jede Zeile in arrB
If arrGI(i, 1) = arrB(j, 1) Then ' Vergleich von G und B
arrGI(i, 3) = arrB(j, 3) ' Wert aus "Spalte D" in "Spalte I" schreiben
Exit For ' Schleife abbrechen, wenn Übereinstimmung gefunden
End If
Next j
Next i

' Ergebnisse zurückschreiben
ws.Range("G9:I" & lastRowG).Value = arrGI
End Sub


Jedes Datenfeld hat Untergrenzen(LBound) und Obergrenzen(Ubound) mit nix oder (... ,1) in der 1. Dimension("Zeilen") u. mit (... , 2) in der 2. Dimension("Spalten").
Gruß Gerd
Anzeige

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige