Live-Forum - Die aktuellen Beiträge
Datum
Titel
24.04.2024 19:29:30
24.04.2024 18:49:56
Anzeige
Archiv - Navigation
1080to1084
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

Laufzeitfehler 91

Laufzeitfehler 91
16.06.2009 11:14:04
schneewittchen123
Hallo an alle VBA-Spezies,
ich habe ein Problem mit Laufzeitfehler 91 "Objektvariable oder With-Blockvariable nicht festgelegt". Erklärung weiter unten im Code..
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Weiter, lngZeile As Long, rngZelle As Range, bolUeberschreiben As Boolean, lngZeile1 As Long
Dim bolUeberschreiben1 As Boolean, rngZelle1 As Range, lngZeile2 As Long, rngZelle2 As Range, lngZeile3 As Long, rngZelle3
Dim rngZelle4 As Range, lngZeile4 As Long
Dim wksSchrott As Worksheet, wksSP As Worksheet, wkbSP As Workbook
... (anderer Code)
If Target.Column = 11 Then
If Cells(Target.Row, 11).Value = "" Then
Exit Sub
Else:
If Cells(Target.Row, 4).Value <> "" And Cells(Target.Row, 8).Value <> "" Then
Set wksSchrott = Worksheets("Material verschrotten")
'Nächste leere Zeile in "Material verschrotten"
With wksSchrott
lngZeile = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
End With
bolUeberschreiben = False
'Prüfen, Eintrag bereits vorhanden
If Application.CountIf(wksSchrott.Range("A:A"), Cells(Target.Row, 1).Value) > 0 Then
Set wksSchrott = Worksheets("Material verschrotten")
With wksSchrott
Set rngZelle2 = .Columns(1).Find(what:=Cells(Target.Row, 1).Value, LookIn:=xlValues, lookat:=xlWhole)
->->-> hier entsteht das Problem, weil rngZelle2 keinen Zellinhalt bekommt - Wert = "Nothing"
lngZeile2 = rngZelle2.Row
->->-> und dann kommt Laufzeitfehler 91, weil er zum Zelleninhalt "Nothing" natürlich auch keine passende Zeile finden kann.
End With
Weiter = MsgBox("Achtung, Eintrag bereits vorhanden. " & vbLf _
& " Möchten Sie den vorhandenen Eintrag überschreiben?" & vbLf _
& "Eintrag lautet: " & wksSchrott.Cells(lngZeile2, 2).Value & vbLf _
& "Menge: " & wksSchrott.Cells(lngZeile2, 3).Value & vbLf _
& "Wert: " & wksSchrott.Cells(lngZeile2, 4).Value & "EUR", vbYesNo)
If Weiter = vbYes Then
bolUeberschreiben = True
End If
If bolUeberschreiben = True Then
With wksSchrott
Set rngZelle = .Columns(1).Find(what:=Cells(Target.Row, 1).Value, LookIn:=xlValues, _
lookat:=xlWhole)
lngZeile = rngZelle.Row
End With
wksSchrott.Cells(lngZeile, 2).Value = Cells(Target.Row, 11).Value
wksSchrott.Cells(lngZeile, 3).Value = Cells(Target.Row, 20).Value
wksSchrott.Cells(lngZeile, 4).Value = Cells(Target.Row, 42).Value
wksSchrott.Cells(lngZeile, 8).Value = Cells(Target.Row, 20).Value
wksSchrott.Cells(lngZeile, 9).Value = Cells(Target.Row, 21).Value
wksSchrott.Cells(lngZeile, 10).Value = Cells(Target.Row, 22).Value
wksSchrott.Cells(lngZeile, 11).Value = Cells(Target.Row, 23).Value
wksSchrott.Cells(lngZeile, 12).Value = Cells(Target.Row, 24).Value
wksSchrott.Cells(lngZeile, 13).Value = Cells(Target.Row, 4).Value
wksSchrott.Cells(lngZeile, 14).Value = Cells(Target.Row, 8).Value
wksSchrott.Cells(lngZeile, 15).Value = Cells(Target.Row, 7).Value
Else:
MsgBox ("Wert wird zurückgesetzt")
Cells(Target.Row, 11).Value = ""
End If
Else:
wksSchrott.Cells(lngZeile, 1).Value = Cells(Target.Row, 1).Value
wksSchrott.Cells(lngZeile, 2).Value = Cells(Target.Row, 11).Value
wksSchrott.Cells(lngZeile, 3).Value = Cells(Target.Row, 20).Value
wksSchrott.Cells(lngZeile, 4).Value = Cells(Target.Row, 42).Value
wksSchrott.Cells(lngZeile, 8).Value = Cells(Target.Row, 20).Value
wksSchrott.Cells(lngZeile, 9).Value = Cells(Target.Row, 21).Value
wksSchrott.Cells(lngZeile, 10).Value = Cells(Target.Row, 22).Value
wksSchrott.Cells(lngZeile, 11).Value = Cells(Target.Row, 23).Value
wksSchrott.Cells(lngZeile, 12).Value = Cells(Target.Row, 24).Value
wksSchrott.Cells(lngZeile, 13).Value = Cells(Target.Row, 4).Value
wksSchrott.Cells(lngZeile, 14).Value = Cells(Target.Row, 8).Value
wksSchrott.Cells(lngZeile, 15).Value = Cells(Target.Row, 7).Value
End If
Else:
MsgBox ("Bitte füllen Sie die Spalten D und H aus.")
Cells(Target.Row, 11).Value = ""
Cells(Target.Row, 11).Select
End If
End If
End If
.... (anderer Code)
Wäre für den "entscheidenden Tipp" sehr dankbar.
LG,
Melanie

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Laufzeitfehler 91
16.06.2009 11:31:36
ChrisL
Hallo Melanie
Ungetestet:
If Not rngZelle2 Is Nothing Then ...
cu
Chris
AW: Laufzeitfehler 91
16.06.2009 11:42:06
schneewittchen123
Hallo Chris,
meinst Du das mit dem "If not..." statt
Set rngZelle2 = .Columns(1).Find(what:=Cells(Target.Row, 1).Value, LookIn:=xlValues, lookat:=xlWhole)
?
Verstehe ich nicht - mein Problem ist ja, dass er die Variable rngZelle2 FÄLSCHLICHERWEISE als Nothing bezeichnet. Eigentlich müsste für diese Variable ein Wert gefunden werden....
VG,
Melanie
AW: Laufzeitfehler 91
16.06.2009 12:16:48
ChrisL
Hallo Melanie
Jetzt sehe ich es erst. Wenn du schon mit...
If Application.CountIf(wksSchrott.Range("A:A"), Cells(Target.Row, 1).Value) > 0 Then
... geprüft hast, dann darf das Ergebnis aus...
Set rngZelle2 = .Columns(1).Find(what:=Cells(Target.Row, 1).Value, LookIn:=xlValues, lookat:=xlWhole)
... auch nicht Nothing sein.
Auf den ersten Blick sehe ich auch nicht wo der Fehler liegt. Klar ist, dass du mit den Variablen für Tabellenblätter und With-Anweisungen ein Durcheinander hast (teilw. mehrfach definiert). Würde in diesem Fall empfehlen einmal mit Set die beiden Tabellenblätter definieren und dann für den Moment auf die With-Blöcke verzichten.
Da der gesuchte Wert vorhanden sein muss und es vermutlich keine doppelten Einträge gibt, würde ich anstelle von Find die Vergleichs-Methode verwenden d.h. analog der Tabellenfunktion VERGLEICHEN, in VBA verwendet: Application.Match()
cu
Chris
Anzeige
führende Null?
16.06.2009 12:07:48
schneewittchen123
Hallo zusammen,
habe in diesem Zusammenhang festgestellt, dass die Application.CountIf keine Probleme mit einer "führenden Null" hat (z.B. 050525 wird als 050525 gezählt) aber bei der Suche nach rngZelle2 wird nach 50525 gesucht und nicht gefunden (weil eben 050525 da steht).
Wie kriege ich denn hier Äpfel und Birnen zusammen?
VG,
Melanie
AW: Laufzeitfehler 91
16.06.2009 12:32:18
Luschi
Hallo Melanie,
der Find-Befehl sucht wahrscheinlich in der falschen Tabelle.
Set rngZelle2 = .Columns(1).Find(what:=Cells(Target.Row, 1).Value, LookIn:=xlValues, lookat:=xlWhole)
Da Cells ohne Tabellenbezug steht, wird in der aktuellen Tabelle (also in der, die gerade auf dem Bildschirm sichtbar ist) gesucht.
Auch wenn es zufällig die richtige Tabelle sein sollte, so ist eine Prüfung, ob der gesuchte Wert gefunden wurde, immer sinnvoll. Den Ansatz dazu hatte ja schon Chris geschrieben.
Wenn der gesuchte (Zahlen)Wert formatiert ist, dann ist auch folgende Einstellung sinnvoll:
LookIn:=xlFormulas
Gruß von Luschi
aus klein-Paris
Anzeige
xlFormulas! Das war´s! DANKE! o.T.
16.06.2009 13:20:23
schneewittchen123
DANKE!

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige