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

Laufzeitfehler 91

Forumthread: Laufzeitfehler 91

Laufzeitfehler 91
19.06.2025 22:41:29
Andreas
Hallo,

ich scheitere wohl schon am Anfang meines Programmierziels. Naja jedenfalls bei meinem erst sehr kurzen Code kommt eine Laufzeitfehler, wo ich nicht erkenne kann, wo der Fehler liegt.



Sub Firma()
Dim i As Integer
Dim rng As Range

For i = 6 To 20000
Set rng = Worksheets("Firmenstammdaten").Range("A1:A100").Find(what:=ActiveSheet.Cells(i, 2).Value, LookAt:=xlWhole)
MsgBox rng.Offset(0, 1).Value
Next i
End Sub


In Tabellenblatt "Firmenstammdaten" stehen in Spalte A Firmen-IDs, in Spalte B der Firmenname
Ausgeführt wird das Makro in Tabellenblatt "Tabelle 1" als activeSheet

Kann jemand den Fehler von Euch erkennen?

Danke schonmal für Eure Hilfe.
Anzeige

15
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Laufzeitfehler 91
19.06.2025 22:54:32
{Boris}
Hi,

der Fehler zeigt an, dass die Objektvariable rng nicht gefüllt (sondern Nothing) ist, weil die vorherige Suche erfolglos war.
Und auf eine nicht gefüllten Objektvariable kann man - in Deinem Fall - nicht die Offset-Methode anwenden.

Fazit: Check, warum die Suche erfolglos war.

VG, Boris
Anzeige
AW: Laufzeitfehler 91
20.06.2025 00:22:57
Piet
Hallo Andreas

mir fällt in deinem Code etwas auf, den solttest du bitte noch mal überdenken!
Ich sehe in Stammdaten den Range("A1:A100"), der 20000 mal durchsucht wird!
Sinnvoller ist es, in einem Range von 20.000 Zeilen die Daten von A1:A100 zu suchen!

mögliche Fehlerquelle: --> Find(what:=ActiveSheet.Cells()
Wenn das ActiveSheet gewechselt wird erfolgt die Suche im falschen Sheet!

mfg Piet

Anzeige
AW: Laufzeitfehler 91
20.06.2025 19:55:33
Piet
Hallo

vielleicht hast du schon eine eigene Lösung gefunden, würde mich freuen. Hier mal meine Lösung.
Mich interessiert vor allem, um wieviel sie schneller ist?? Ich hoffe du verstehst meine Kommentare.

mfg Piet

Sub Firma_neu()

Dim AC As Range, Adr1 As String, Edr As String
Dim FSTD As Worksheet, rng As Range, zz, lz3
Set FSTD = Worksheets("Firmenstammdaten")
Application.ScreenUpdating = False

With Worksheets("Bericht 1")
'End Adresse Bericht Spalte B, LastCell Spalte AD
Edr = .Cells(Rows.Count, 2).End(xlUp).Address
lz3 = .Cells(Rows.Count, 30).End(xlUp).Row
'Stammdaten durchsuchen und einfügen
For Each AC In FSTD.Range("A1:A200")
'Suche Daten in Bericht1, Spalte B
Set rng = .Range("B1", Edr).Find(what:=AC, MatchCase:=False, LookAt:=xlWhole)
If Not rng Is Nothing Then
Adr1 = rng.Address '1.Adresse notieren
Do 'Schleife für alle Stammdaten
If .Cells(rng.Row, 30) = Empty Then
.Cells(rng.Row, 30) = AC.Offset(0, 1).Value
.Cells(rng.Row, 31) = "1"
End If
Set rng = .Range("B1", Edr).FindNext(rng)
Loop Until rng.Address = Adr1
End If 'Aussprung wenn Spalte AD voll ist!
If .Cells(1, 30).End(xlDown).Row >= lz3 Then Exit For
Next AC

If .Cells(1, 30).End(xlDown).Row = lz3 Then
MsgBox "Spalte AD vollständig ausgefüllt!"
Else
MsgBox "Spalte AD ist nicht vollständig ausgefüllt!", vbCritical
End If
End With
End Sub
Anzeige
AW: Laufzeitfehler 91
20.06.2025 15:45:17
Andreas
Hallo Piet,

Danke für den Hinweis. Ich bin sehr dankbar für solche Anregungen und Ideen. Oft denk man erst am Ende: "Hätte ich mal, ...", aber dann den ganzen Quellcode umzubauen hat man auch keinen Nerv mehr.

Viele Grüße

Andreas
AW: Laufzeitfehler 91
22.06.2025 12:08:23
schauan
Hallöchen,

also, Zitat
Ich sehe in Stammdaten den Range("A1:A100"), der 20000 mal durchsucht wird!
Sinnvoller ist es, in einem Range von 20.000 Zeilen die Daten von A1:A100 zu suchen!

Jupp :-)
Man könnte das weiter beschleunigen, wenn man mit Arrays und Collections arbeitet. Voraussetzung bei dieser Variante mit der Collection ist ein Suchbegriff, der in den Stammdaten eindeutig ist.

Sub Firma_neu2()

'Variablendeklarationen
Dim arr1, arr2, arr3, iCnt As Long
Dim col3 As New Collection
'Flackern aus
Application.ScreenUpdating = False
'Mit dem Datenblatt Tabelle1
With Sheets("Tabelle1")
'Daten in Array arr1 uebernehmen
arr1 = .Range(.Cells(1, 1), .Cells(.Cells(Rows.Count, 1).End(xlUp).Row, 1))
'Ergebnisarray arr3 entsprechend Datenarray dimensionieren
ReDim arr3(1 To UBound(arr1))
'Mit dem Stammdatenblatt Bericht
With Sheets("Bericht")
'Stammdaten in Array arr2 uebernehmen
arr2 = .Range(.Cells(1, 1), .Cells(.Cells(Rows.Count, 2).End(xlUp).Row, 2))
'Ende Mit dem Stammdatenblatt Bericht
End With
'Schleife ueber alle Daten in arr2
For iCnt = LBound(arr2) To UBound(arr2)
'Stammdaten in Collection uebernehmen. Key ist der Suchbegriff
col3.Add arr2(iCnt, 2), arr2(iCnt, 1)
'Ende Schleife ueber alle Daten in arr2
Next
'bei Fehler weiter mit naechster Anweisung (Fehler = Eintrag nicht in Stammdaten)
On Error Resume Next
'Schleife ueber alle Daten
For iCnt = LBound(arr1) To UBound(arr1)
arr3(iCnt) = col3.Item(arr1(iCnt, 1))
'Ende Schleife ueber alle Daten
Next
'Ende bei Fehler weiter mit naechster Anweisung (Fehler = Eintrag nicht in Stammdaten)
On Error GoTo 0
'Spalte C auf Tabelle 1 mit Ergebnisarray ausfuellen
.Range(.Cells(1, 3), .Cells(UBound(arr1), 3)).Value = WorksheetFunction.Transpose(arr3)
'Ende Mit dem Datenblatt Tabelle1
End With
'Flackern an
Application.ScreenUpdating = True
End Sub


Interessant wäre sicher auch das Ziel der Aktion. Wenn bei den 20.000 Daten bei Treffern das hinzugefügt werden soll, was da im Offset steht, könnte man ggf. auch mit einem SVERWEIS arbeiten und anschließend die Formel durch die Werte ersetzen.




Anzeige
AW: Laufzeitfehler 91
19.06.2025 22:56:35
{Boris}
Hi,

den Fehler fängt man übrigens so ab:

Sub Firma()

Dim i As Integer
Dim rng As Range

For i = 6 To 20000
Set rng = Worksheets("Firmenstammdaten").Range("A1:A100").Find(what:=ActiveSheet.Cells(i, 2).Value, LookAt:=xlWhole)
If Not rng Is Nothing Then
MsgBox rng.Offset(0, 1).Value
Else
MsgBox "Suchbegriff nicht gefunden"
End If
Next i
End Sub
Anzeige
Ne 20000er-Schleife ist aber sicher nicht im Sinne des...oT
19.06.2025 22:58:04
{Boris}
VG, Boris
AW: Laufzeitfehler 91
20.06.2025 10:40:02
Marc
oder nit:

 

Public Sub Test()

'sicherer Code

On Error Goto Fehler
'unsicherer Code

'sicherer Code
On Error GotTo 0

Exit Sub
Fehler:
MsgBox Err.Description,vbokOnly 'Ausgabe Fehler
Resume Next 'es wird mit dem nächsten Element weiter gemacht, oder dem nächsten Code

End Sub



beide Varianten können wunderbar kombiniert werden.
Und On Error kann auch mehrfach verwendet werden..
z.B. 1x für normalem VBA Code, 1x für Datenbank Code etc.., da gibt es viele Möglichkeiten
Anzeige
AW: Laufzeitfehler 91
20.06.2025 15:38:51
Andreas
Hallo Boris,

sehr, sehr cool!!! es zeigte sich wieder: das Problem sitzt vor dem Bildschirm :). Dank deiner Hilfe und mit deinem Code konnte ich den Fehler beheben.
Vielen, vielen Dank!

Viele Grüße, Andreas
AW: Laufzeitfehler 91
20.06.2025 14:07:27
{Boris}
Hi,

um zu prüfen, ob ne Objektvariable gefüllt ist oder nicht, würde ich aber immer erst mal auf Nothing prüfen, denn die Set-Zuweisung selbst ist ja erstmal unkritisch.

VG, Boris
Anzeige
AW: Laufzeitfehler 91
23.06.2025 20:09:49
Marc
Da hast du natürlich recht..
Immer diese negative Denkweise, @Boris!
19.06.2025 23:13:44
RPP63
Moin Boris!
Wenn man nur von 5 % Trefferquote ausgeht und ein Wegklicken einer MsgBox 3 Sekunden dauert (weil man ja auch lesen will, was angezeigt wird) …
… ist das Makro doch schon nach 50 Minuten Geschichte.
;)

Gruß Ralf
AW: Ne 20000er-Schleife ist aber sicher nicht im Sinne des...oT
20.06.2025 15:40:01
Andreas
... ja, war ja noch nicht fertig :)
Anzeige
AW: Ne 20000er-Schleife ist aber sicher nicht im Sinne des...oT
20.06.2025 15:48:24
Andreas
... achso, Du meinst so ne umfangreiche Schleife sollte man gar nicht machen.
Okay. Ich werde es umbasteln, so wie Piet vorgeschlagen hat.
;-)))) oT
20.06.2025 13:52:49
{Boris}
VG, Boris
Anzeige
Anzeige
Live-Forum - Die aktuellen Beiträge
Datum
Titel
14.05.2026 13:31:09
14.05.2026 09:50:42
13.05.2026 19:14:18