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

Forumthread: objektvariable oder WIth-Blockvariable nicht festgelegt

objektvariable oder WIth-Blockvariable nicht festgelegt
16.04.2020 16:19:24
peter
Hallo zusammen,
ich bin am verzweifeln. Ich weiß nicht wo mein fehler liegt. Bitte um Hilfe. Ich habe eine Userform erstellt mit einer Combobox zwei Textfeldern und einem Button. Die Items der Combobox stammen aus Spalte 1 der Tabelle "Übersicht". Im Worksheet "Übersicht" sind Dokumentennummer (Spalte 1) und die dazugehörigen Dokumententitel (Spalte 2) tabellarisch aufgeführt. Wenn ich die Dokumenten-Nummer über die Combobox auswähle soll im nebenstehenden Textfeld der Dazugehörige Titel erscheinen und das zweite Textfeld freigegeben werden mit Klick auf den Button sollen die Werte dann in eine andere Tabelle übertragen werden.
Das funktioniert zwar alles wunderbar, leider kommt am Ende - nachdem ch den Button betätige - eine Fehlermeldung. Es heißt: Laufzeitfehler '91': Objektvariable oder With-Blockvariable nicht festgelegt. Es wird die Code-Zeile "dokTitel = .Cells(Columns(1).Find(dokNummer).Row, 2)", welche ich im folgenden Fett und Kursiv dargestellt habe markiert.
Vielen Dank schon mal im Voraus. Ich wäre echt sehr dankbar dafür den fehler zu finden.
Viele Grüße
Peter Meier
Option Explicit
Dim dokNummer As String
Dim dokTitel As String

Private Sub UserForm_Initialize()
Dim letzteZeile As Integer
Dim i As Integer
'LetzteZeile der Spalte A ermittlen
letzteZeile = Sheets("Übersicht").Cells(Rows.Count, 1).End(xlUp).Row
'Alle Einträge der Spalte A zu Kombinationsfeld hinzufügen
For i = 3 To letzteZeile
cbNummer.AddItem Sheets("Übersicht").Cells(i, 1)
Next i
End Sub

Private Sub cbNummer_Change()
'Den zur ausgewählten Dokumentennummer zugehörigen Dokumentennamen finden
dokNummer = cbNummer.Text
With Worksheets("Übersicht")
  dokTitel = .Cells(Columns(1).Find(dokNummer).Row, 2)
End With
txtTitel.Text = dokTitel
'großes Textfeld für Eingaben zulassen
txtTextbox.Enabled = True
txtTextbox.Locked = False
End Sub

Private Sub CommandButtonAbsenden_Click()
Dim ersteFreieZeile As Integer
Dim eingabe As String
If cbNummer.Text = "" Then
MsgBox "Bitte Dokumenten-Nummer auswählen"
cbNummer.SetFocus
Exit Sub
End If
If txtTextbox.Text = "" Then
MsgBox "Bitte Text eingeben"
txtTextbox.SetFocus
Exit Sub
Else
'Nächste freie Zeile suchen
ersteFreieZeile = Sheets("Dokumenten Änderung").Cells(Rows.Count, 1).End(xlUp).Row + 1
'Dokumentennummer in Tabelle schreiben
eingabe = txtTextbox.Value
With Sheets("Dokumenten Änderung")
.Cells(ersteFreieZeile, 1) = dokNummer
.Cells(ersteFreieZeile, 2) = dokTitel
.Cells(ersteFreieZeile, 3) = Date
.Cells(ersteFreieZeile, 4) = Application.UserName
.Cells(ersteFreieZeile, 5) = eingabe
End With
txtTextbox.Text = ""
cbNummer.Text = ""
txtTitel.Text = ""
MsgBox "Änderungsvorschlag eingereicht"
End If
End Sub

Anzeige

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

Betreff
Datum
Anwender
Anzeige
AW: objektvariable oder WIth-Blockvariable nicht festgelegt
16.04.2020 17:29:02
onur
Versuch das:
.Columns(1)

AW: objektvariable oder WIth-Blockvariable nicht festgelegt
17.04.2020 09:05:36
peter
Hallo,
erstmal danke für die schnelle Antwort. Ich habe jetzt folgendes eingegeben:
dokTitel = .Cells(.Columns(1).Find(dokNummer).Row, 2)
Leider immer noch dieselbe Situation. Sub-Ausführung über Click_Button funktioniert prinzipiell (Alle Werte werden in Tabelle geschrieben), aber Fehlermeldung unverändert. "Objektvariable oder With-Blockvariable nicht festgelegt."
Anzeige
AW: objektvariable oder WIth-Blockvariable nicht festgelegt
21.04.2020 09:59:54
peter
kann mir jemand weiterhelfen? Ich habe wohl das Kontrollkästchen nicht markiert, dass der Beitrag noch nciht beantwortet wurde. Sry bin neu hier.
AW: objektvariable oder WIth-Blockvariable nicht festgelegt
21.04.2020 15:16:55
Hajo_Zi
Zu Deiner Datei kann ich nichts schreiben, was wohl daran liegt das ich nicht auf fremde Rechner schaue.Ich baue keine Datei nach.
Sollte die Datei verlinkt werden?
Wenn du an Stelle einer Demomappe deine Originalmappe hochladen willst, diese aber sensible Daten enthält, kannst du diese Daten
http://www.ms-office-forum.de/forum/showthread.php?t=322895
änderrn.
Das ist nur meine Meinung zu dem Thema.

Anzeige
AW: objektvariable oder WIth-Blockvariable nicht festgelegt
22.04.2020 08:48:55
peter
Hallo Hajo,
kein Problem, hier die Datei: https://www.herber.de/bbs/user/136955.xlsm
Es wäre sehr nett wenn ich einen Tipp bekommen würde.
viele Grüße
AW: objektvariable oder WIth-Blockvariable nicht festgelegt
22.04.2020 12:56:32
Hajo_Zi
ich würde mal vermuten Find ist zu kurz. Ich benutze
Set Rafound = .Columns(4).find("Ha", .Range("D1"), , xlPart, , xlNext)
Gruß Hajo
Anzeige
AW: objektvariable oder WIth-Blockvariable nicht festgelegt
22.04.2020 13:32:13
peter
Hallo Hajo,
danke erstmal. wie würden Sie das in den Code einbauen? Was ich nicht verstehe ist, dass das Makro trotz der erscheinenden Debugger-Meldung komplett ausgeführt wird.
Klicke ich auf den Button "Vorschlag Dokumentenänderung", wähle ich die Dokumenten-Nummer aus wird der zugehörige Titel automatisch in das nebenstehende Textfeld geladen. Unten gebe ich die Änderungswünsche für das Dokument in das große Textfeld ein.
Wenn ich auf den Button "Absenden" auf der Userform klicke dann werden alle Daten in das Arbeitsblatt "Dokumenten Änderung" geschrieben. Ich kann mir also garnicht erklären wo der Fehler eigentlich herkommt.
Es ist echt zum verzweifeln...
Anzeige
AW: objektvariable oder WIth-Blockvariable nicht festgelegt
22.04.2020 16:07:55
Mullit
Hallo,
bau das hier mal in Dein Change-Event ein...
Private Sub cbNummer_Change()

'Den zur ausgewählten Dokumentennummer zugehörigen Dokumentennamen finden
If ActiveControl Is cbNummer Then

    dokNummer = cbNummer.Text
    
    
    With Worksheets("Übersicht")
    
       dokTitel = .Cells(.Columns(1).Find(dokNummer).Row, 2)
        
    End With
    
    txtTitel.Text = dokTitel
    
    'großes Textfeld für Eingaben zulassen
    txtTextbox.Enabled = True
    txtTextbox.Locked = False

End If

End Sub

Gruß, Mullit
Anzeige
AW: objektvariable oder WIth-Blockvariable nicht festgelegt
22.04.2020 16:16:07
peter
Ein Traum! Mullit du bist klasse. Danke
AW: ah prima, alles klar...owT
22.04.2020 16:37:47
Mullit
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige
Anzeige

Infobox / Tutorial

Umgang mit dem Laufzeitfehler 91 in Excel VBA


Schritt-für-Schritt-Anleitung

Um den Laufzeitfehler 91 ("Objektvariable oder With-Blockvariable nicht festgelegt") in Excel VBA zu beheben, kannst Du folgende Schritte durchführen:

  1. Überprüfe den Code auf richtige Objektreferenzen: Stelle sicher, dass Du alle Objekte, die Du in Deinem Code verwendest, korrekt initialisiert hast. Dies gilt insbesondere für Worksheets und Cells.

  2. Nutze die With-Anweisung richtig: Wenn Du eine With-Anweisung verwendest, stelle sicher, dass alle darauf folgenden Zeilen innerhalb des With-Blocks korrekt referenziert werden. Zum Beispiel:

    With Worksheets("Übersicht")
       dokTitel = .Cells(.Columns(1).Find(dokNummer).Row, 2)
    End With
  3. Fehlende Objekte initialisieren: Überprüfe, ob die Find-Methode ein Ergebnis zurückgibt. Wenn das gesuchte Element nicht gefunden wird, wird die Find-Methode Nothing zurückgeben, was zu einem Laufzeitfehler führen kann.

    Dim foundCell As Range
    Set foundCell = .Columns(1).Find(dokNummer)
    If Not foundCell Is Nothing Then
       dokTitel = .Cells(foundCell.Row, 2)
    Else
       MsgBox "Dokumentennummer nicht gefunden."
    End If

Häufige Fehler und Lösungen

  • Fehler: "Objektvariable oder With-Blockvariable nicht festgelegt"

    • Lösung: Überprüfe, ob Du ein Objekt verwendest, das nicht initialisiert wurde. Dies tritt häufig auf, wenn Du versuchst, auf ein Range oder Worksheet zuzugreifen, das nicht existiert.
  • Fehler: Find gibt Nothing zurück

    • Lösung: Stelle sicher, dass die Dokumentennummer tatsächlich in der entsprechenden Spalte vorhanden ist. Füge eine Fehlerbehandlung hinzu, um mit dieser Situation umzugehen.

Alternative Methoden

Wenn die oben genannten Ansätze nicht funktionieren, kannst Du auch alternative Methoden verwenden, um zu vermeiden, dass der Fehler auftritt:

  1. Verwende VLookup: Anstatt die Find-Methode zu nutzen, kannst Du die VLookup-Funktion in VBA verwenden, um den Titel zu finden:

    dokTitel = Application.WorksheetFunction.VLookup(dokNummer, Worksheets("Übersicht").Range("A:B"), 2, False)
  2. Verwende ein Array: Lade die Daten in ein Array und suche im Array, um die Performance zu verbessern und Fehler zu vermeiden.


Praktische Beispiele

Hier ist ein Beispiel, wie Du die Fehlerbehandlung in Deinem Code verbessern kannst:

Private Sub cbNummer_Change()
    dokNummer = cbNummer.Text
    Dim foundCell As Range
    With Worksheets("Übersicht")
        Set foundCell = .Columns(1).Find(dokNummer)
        If Not foundCell Is Nothing Then
            dokTitel = .Cells(foundCell.Row, 2).Value
            txtTitel.Text = dokTitel
            txtTextbox.Enabled = True
            txtTextbox.Locked = False
        Else
            MsgBox "Dokumentennummer nicht gefunden."
        End If
    End With
End Sub

In diesem Beispiel wird das Problem des Laufzeitfehlers 91 behoben, indem zuerst überprüft wird, ob Find ein Ergebnis liefert.


Tipps für Profis

  • Nutze Option Explicit: Damit stellst Du sicher, dass alle Variablen deklariert sind, was hilft, Fehler zu vermeiden.
  • Fehlerprotokollierung: Implementiere eine Fehlerprotokollierung, um herauszufinden, wo genau der Fehler auftritt.
  • Testen in kleinen Schritten: Teste Deinen Code schrittweise, um Fehler frühzeitig zu erkennen.

FAQ: Häufige Fragen

1. Was bedeutet der Laufzeitfehler 91? Der Laufzeitfehler 91 tritt auf, wenn Du versuchst, auf ein Objekt zuzugreifen, das nicht existiert oder nicht korrekt initialisiert wurde.

2. Wie kann ich sicherstellen, dass meine Objekte korrekt initialisiert sind? Überprüfe den Code auf Set-Anweisungen und stelle sicher, dass Du Objekte wie Worksheets oder Ranges vor ihrer Verwendung initialisierst.

3. Welche Alternativen gibt es zur Find-Methode? Du kannst die VLookup-Funktion oder ein Array verwenden, um Daten zu suchen und den Code effizienter und fehlerfreier zu gestalten.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige