Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

"Objektvariable nicht festgelegt"

Forumthread: "Objektvariable nicht festgelegt"

"Objektvariable nicht festgelegt"
31.01.2006 18:44:42
Franz
Hallo Forum,
ich fang mal klein an und poste nur einen Code-Schnippsel, vielleicht geht's damit:
gesucht wird ein Datum mit folgender Zeile:
.Cells.Find(What:=datSuchDatum, After:=.Range("ErsterTag"), LookIn:=xlValues, _
LookAt:=xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlNext, _
MatchCase:=False).Activate
dabei gibt's aber leider obenstehende Fehlermeldung: "Objektvariable oder With-Blockvariable nicht festgelegt." (an der With.... liegt's nicht, hab ich überprüft).
- "datSuchDatum" ist als "Date" deklariert und hat ein Datum inne
- ".Range("ErsterTag")" hat auch einen Wert.
Lasse ich die Zeile mit einer String-Variablen anstelle der Datums-Variablen laufen, dann klappt der Code.
Kann man vielleicht mit diesen Angaben schon sagen, woran das liegen könnte?
Vielen Dank schon mal im Voraus und Grüße
Franz
Anzeige

12
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: "Objektvariable nicht festgelegt"
31.01.2006 18:56:05
Franz
hab noch was rausgefunden:
besetzt man die Zeile mit einer String-Variablen ...
.Cells.Find(What:=strSuchText, After:=Range("ErsterTag"), LookIn:=xlValues, _
LookAt:=xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlNext, _
MatchCase:=False).Activate
... dann kommt ebenselbe Fehlermeldung, wenn der gesuchte Wert nicht vorhanden ist, also nicht gefunden werden kann.
Das Datum, das gesucht wird in ....
.Cells.Find(What:=datSuchDatum, After:=.Range("ErsterTag"), LookIn:=xlValues, _
LookAt:=xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlNext, _
MatchCase:=False).Activate
.... ist auf jeden Fall vorhanden, allerdings durch eine Formel. Wenn ich die Code-Zeile nun aber ändere in ....
.Cells.Find(What:=datSuchDatum, After:=.Range("ErsterTag"), LookIn:=xlFormulas, _
LookAt:=xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlNext, _
MatchCase:=False).Activate
.... kommt leider immer noch dieselbe Fehlermeldung?!?
Ratlose Grüße
Franz
Anzeige
AW: "Objektvariable nicht festgelegt"
01.02.2006 08:02:01
Heiko
Moin Franz,
diese Meldung kommt wenn du per .Find und .Activate was suchst was nicht vorhanden ist, weil dann der .Activate Befehl nicht ausgeführt werden kann.
Das mußt du so machen:
Erstmal "nur" suchen und dann Suchergebnis auswerten, wenn Not Nothing, also was gefunden dann Zelle aktivieren, wenn Nothing dann halt nichts gefunden.
Und mit LookIn:=xlValues habe ich auch Datum aus Formeln finden können.
Dein LookAfter habe ich für meinen Test rausgelassen, mußt du dir halt noch wieder reinbauen.

Sub DatumAusFormelSuchen()
Dim DatSuchDatum As Date
Dim rngGefundeneZelle As Range
DatSuchDatum = CDate(InputBox("Geben Sie ein Datum ein !", "Datum", "01.01.1900"))
Set rngGefundeneZelle = ActiveSheet.Cells.Find(What:=DatSuchDatum, LookIn:=xlValues, _
LookAt:=xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlNext, _
MatchCase:=False)
If Not rngGefundeneZelle Is Nothing Then
rngGefundeneZelle.Activate
Else
MsgBox "SuchDatum nicht gefunden !", vbCritical
End If
Set rngGefundeneZelle = Nothing
End Sub

Gruß Heiko
PS: Rückmeldung wäre nett !
Anzeige
AW: "Objektvariable nicht festgelegt"
01.02.2006 08:27:24
Franz
Hallo Heiko,
vielen Dank für Deine Antwort. Zunächst nur ganz kurz, muss nämlich zu einer Besprechung: das gesuchte Datum ist gaaaanz sicher vorhanden, es handelt sich nämlich um einen Jahreskalender. Aber vielleicht liegt's am Format, Dein "CDate" hat mich da jetzt auf ne Idee gebracht.
Muss jetzt aber leider weg, kann mich grad nicht damit beschäftigen. Melde mich aber in jedem Fall wieder.
Danke erstmal und Grüße
Franz
Anzeige
Jetzt endlich, aber...
01.02.2006 18:00:47
Franz
Hallo Heiko,
jetzt hab ich endlich Zeit, sorry, dass ich mich so lange nicht mehr gemeldet habe. Aber leider krieg ich's immer noch nicht hin, ich bekomme in die Range-Variable nichts rein! Ich erlaube mir mal meinen Code zu posten:

Sub Sonstiges_suchen()
Dim strSuchText As String
Dim datSuchDatum As Date
Dim rngSuchDatum As Range
Dim Mldg, Titel, Voreinstellung
Mldg = "was suchst du?"    ' Aufforderung festlegen.
Titel = "Such dir was..."  ' Titel festlegen.
Voreinstellung = Range("Suchtext")
Beep
strSuchText = InputBox(Mldg, Titel, Voreinstellung)
If strSuchText = "" Then Exit Sub
ActiveSheet.Unprotect
Range("Suchtext") = strSuchText
On Error GoTo errorhandler
datSuchDatum = CDate(Worksheets("Daten").Range("G:G").Find(What:=strSuchText, After:=Range("SonstigesErster").Offset(-1, 0), LookIn:=xlValues, _
LookAt:=xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlNext, _
MatchCase:=False).Offset(0, -1))
On Error GoTo 0
Set rngSuchDatum = Cells.Find(What:=datSuchDatum, After:=Range("ErsterTag"), LookIn:=xlValues, _
LookAt:=xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlNext, _
MatchCase:=False)
MsgBox datSuchDatum
MsgBox rngSuchDatum.Address
errorhandler:
Worksheets("Kalender").Protect
MsgBox "Sorry, aber ich hab im gaaanzen Kalender nicht gefunden, was du suchst!     ", 16
On Error GoTo 0
End Sub

Kann es am Format liegen?
- Die Datümer im Blatt "Daten" sind formatiert als "TT.MM.JJJJ", und sie stehen als Datum in der Zelle.
- Die Datümer im Blatt "Kalender" sind formatiert als "T" und ergeben sich durch Formel.
An anderer Stelle hab ich sowas schon mal mit einer For...Next-Schleife gemacht, das ging. Aber hier mit Find krieg ich's nicht. Vielleicht hast du ja noch ne Idee, wenn du nochmal magst.
Danke schon mal und Grüße
Franz
Anzeige
AW: Jetzt endlich, aber...
01.02.2006 18:24:05
Heiko
Hallo Franz,
ganz ehrlich, dein Code is mir ein bisschen wirr.
Ich kann nicht wirklich erkennen was du vorhast (Datum suchen na klar), aber wozu der ganze Code dienen soll sehe ich nicht.
Schau dir mal in der VBA Hilfe den Befehl find an, und teste das mit find erstmal auf einem neutralen Blatt wo nur ein paar Datum´s (Über Formel und direkt eingegeben) drin sind um zu sehen wie du find händeln mußt.
Gruß Heiko
Anzeige
Ja versteh ich...
01.02.2006 18:37:24
Franz
Hallo Heiko,
danke für deine Antwort. Dass der Code wirr erscheint ist okay, aber zu erklären: die Daten stehen im Blatt "Daten", es können an einem Tag auch mal 2 oder mehr Ereignisse sein. Im Blatt "Kalender" wird zu jedem Tag in einer einzigen Zelle per SVerweis das zugehörige Ereignis aus dem Blatt "Daten" geholt. Gibt es mehr als eins, wird natürlich nur das erste geholt.
Beim Suchen allerdings soll auch was gefunden werden, was ins Blatt "Kalender" nicht übernommen wurde, weil es als zweites oder drittes oder ... in der Liste steht. Darum wird nicht in "Kalender" gesucht, sondern in "Daten", weil da alles drin steht. Das zugehörige Datum soll nun im Blatt "Kalender" markiert werden.
Ob das alles aber wichtig ist für das Problem weiß ich nicht. Die Sache ist einfach die, dass die Variable "datSuchDatum" fein säuberlich ein Datum enthält (also nicht leer!), dass aber mit der darauffolgenden von dir empfohlenen Anweisung ...
Set rngSuchDatum = Cells.Find(What:=datSuchDatum, After:=Range("ErsterTag"), LookIn:=xlValues, _
LookAt:=xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlNext, _
MatchCase:=False)
... die Variable "rngSuchDatum" leider keinen Wert erhält.
Oder mach ich da noch was fürchterlich falsch?
Grüße
Franz
Anzeige
AW: Ja versteh ich...
01.02.2006 18:43:20
Heiko
Hallo Franz,
Ein Tipp hätte ich noch.
versuche mal vor cells.find... noch das Sheet mitanzugeben, also Worksheets("DeinBlatt").cells.find ...
Wenn das nicht hilft, mach ne kleine Beispielmappe mit eine bisschen Erklärung, dann schau ich mir das morgen früh in der Firma mal an.
Gruß Heiko
PS: Rückmeldung wäre nett
Anzeige
AW: Ja versteh ich...
01.02.2006 20:03:39
Franz
Hallo Heiko,
vielen Dank erstmal. Bin grad dran, auch hier das mit der Schleife zu probieren, melde mich dann noch mal. Eine Datei nachzustellen scheu ich noch, aber vielleicht mach ich's noch, interessieren tät's mich nämlich schon, was ich da mit "Find" falsch mache.
Grüße
Franz
AW: Ja versteh ich...
02.02.2006 08:49:24
Heiko
Hallo Franz,
habe nochmal ein bisschen rumgespielt, siehe Beispielmappe:
https://www.herber.de/bbs/user/30580.xls
Gruß Heiko
PS: Rückmeldung wäre nett !
Anzeige
AW: Ja versteh ich...
02.02.2006 09:55:13
Franz
Hallo Heiko,
ja, hängt wohl am Format. Hab's jetzt mal so versucht:
Dim datSuchDatum As Date
Dim datSuchDatummm As Date
Dim rngSuchDatum As Range
datSuchDatummm = Format(CDate(datSuchDatum), "d")
MsgBox datSuchDatum & vbLf & vbLf & datSuchDatummm
Set rngSuchDatum = Cells.Find(What:=datSuchDatummm, After:=Range("ErsterTag").Offset(-1, 0), LookIn:=xlValues, _
LookAt:=xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlNext, _
MatchCase:=False)
ABER: aus z.B. "datSuchDatum = 08.02.2006" wird mit obiger Zeile dann "datSuchDatummm = 07.01.1900". Es wird also ein völlig anderes Datum draus. Und dann kann natürlich auch die "Set rngSuchDatum = " - Zeile nicht ergeben.
Komisch aber auch (und zumindest für mich unverständlich:
auch aus der Zeile: datSuchDatummm = Format("08.02.2006", "d") bekommt "datSuchDatummm" den Wert "07.01.1900". Aus "datSuchDatummm = Format(CDate("08.02.2006"), "d")" ebenso?
Verwirrte Grüße
Franz
Anzeige
AW: Ja versteh ich...
02.02.2006 10:33:25
Heiko
Hallo Franz,
wieso läuft doch, wenn du richtig formatierst (also dd.mm.yyyy anstatt nur d )

Sub test()
Dim datSuchDatum As Date
Dim datSuchDatummm As Date
datSuchDatum = CDate("08.02.2006")
datSuchDatummm = Format(CDate(datSuchDatum), "dd.mm.yyyy")
MsgBox datSuchDatum & vbLf & vbLf & datSuchDatummm
End Sub

Gruß Heiko
PS: Rückmeldung wäre nett !
Anzeige
AW: Ja versteh ich...
02.02.2006 14:34:48
Franz
Hallo Heiko,
muss ich noch mal probieren, das geht grad leider nicht. Ich dachte ich müsste es als "d" formatieren, weil die Zellen im Blatt "Kalender" als "T" formatiert sind....
Melde mich noch mal, wenn ich Zeit habe es testen.
Grüße
Franz
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige

Infobox / Tutorial

Objektvariable nicht festgelegt: Lösungen und Tipps für VBA-Fehler


Schritt-für-Schritt-Anleitung

  1. Fehlerursache identifizieren: Der Fehler "Objektvariable oder With-Blockvariable nicht festgelegt" tritt häufig auf, wenn eine Variable nicht richtig gesetzt wurde. Achte darauf, dass die Objekte, die Du verwendest, tatsächlich existieren.

  2. Verwendung von .Find: Wenn Du die Methode .Find nutzt, stelle sicher, dass das gesuchte Objekt vorhanden ist. Wenn kein Ergebnis gefunden wird, kann dies zu einem Laufzeitfehler 91 führen.

  3. Code anpassen: Verwende eine Struktur, um das Ergebnis zu überprüfen, bevor Du es aktivierst. Hier ein Beispiel:

    Dim rngGefundeneZelle As Range
    Set rngGefundeneZelle = ActiveSheet.Cells.Find(What:=DatSuchDatum, LookIn:=xlValues, _
    LookAt:=xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlNext, _
    MatchCase:=False)
    
    If Not rngGefundeneZelle Is Nothing Then
       rngGefundeneZelle.Activate
    Else
       MsgBox "Suchdatum nicht gefunden!", vbCritical
    End If
  4. Formatierung prüfen: Stelle sicher, dass die gesuchten Daten im korrekten Format vorliegen. Bei Datumswerten kann es hilfreich sein, die Formatierung der Zellen zu überprüfen.


Häufige Fehler und Lösungen

  • Laufzeitfehler 91: Dieser Fehler tritt auf, wenn Du versuchst, auf eine nicht definierte Variable zuzugreifen. Um dies zu vermeiden, nutze die Set-Anweisung, um Objekte zu initialisieren.

  • Objektvariable nicht festgelegt: Dieser Fehler weist darauf hin, dass eine verwendete Variable nicht initialisiert wurde. Überprüfe, ob Du alle benötigten Variablen mit Set korrekt zugewiesen hast.

  • With-Blockvariable nicht festgelegt: Achte darauf, dass innerhalb eines With-Blocks die entsprechenden Objekte referenziert werden.


Alternative Methoden

  • Verwende Application.Match: Anstelle von .Find kannst Du auch Application.Match verwenden, um Werte in einer Liste zu suchen. Dies kann oft stabiler sein.

  • Schleifen verwenden: Anstelle von .Find, verwende eine Schleife, um die Werte zu durchlaufen und zu vergleichen. Dies kann auch das Debuggen erleichtern.

    Dim c As Range
    For Each c In ActiveSheet.Range("A1:A100")
       If c.Value = DatSuchDatum Then
           c.Activate
           Exit For
       End If
    Next c

Praktische Beispiele

Ein einfaches Skript, um ein Datum zu suchen:

Sub DatumSuchen()
    Dim DatSuchDatum As Date
    Dim rngSuchDatum As Range

    DatSuchDatum = CDate(InputBox("Geben Sie ein Datum ein:", "Datum", "01.01.1900"))

    Set rngSuchDatum = ActiveSheet.Cells.Find(What:=DatSuchDatum, LookIn:=xlValues, _
    LookAt:=xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlNext, _
    MatchCase:=False)

    If Not rngSuchDatum Is Nothing Then
        rngSuchDatum.Activate
    Else
        MsgBox "Datum nicht gefunden!", vbCritical
    End If
End Sub

Tipps für Profis

  • Verwende Option Explicit: Durch die Verwendung von Option Explicit am Anfang deiner Module zwingst Du Dich, alle Variablen zu deklarieren, was Fehler wie "objektvariable oder with-blockvariable nicht festgelegt" reduzieren kann.

  • Debugging nutzen: Nutze die Debugging-Tools in der VBA-Umgebung, um den Code schrittweise auszuführen und Variableninhalte zu prüfen.

  • Fehlerbehandlung implementieren: Implementiere eine Fehlerbehandlung, um Laufzeitfehler abzufangen und so eine bessere Benutzererfahrung zu bieten.

    On Error GoTo FehlerHandler
    ' Dein Code hier
    Exit Sub
    FehlerHandler:
       MsgBox "Ein Fehler ist aufgetreten: " & Err.Description

FAQ: Häufige Fragen

1. Was bedeutet der Fehler "Objektvariable oder With-Blockvariable nicht festgelegt"? Dieser Fehler tritt auf, wenn Du versuchst, auf eine Variable zuzugreifen, die nicht korrekt initialisiert wurde.

2. Wie kann ich den Fehler vermeiden? Stelle sicher, dass Du alle Variablen mit Set korrekt initialisierst und überprüfe, ob die gesuchten Werte tatsächlich vorhanden sind.

3. Welche Excel-Versionen unterstützen den .Find Befehl? Der .Find Befehl ist in Excel VBA seit vielen Versionen verfügbar, einschließlich Excel 2003 bis zu den neuesten Versionen von Excel 365.

4. Was kann ich tun, wenn .Find nicht das gewünschte Ergebnis liefert? Überprüfe die Formatierung der Zellen und teste alternative Methoden wie Schleifen oder Application.Match.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige