Discussion:
Objektvariable oder With-Blockvariable nicht festgelegt
(zu alt für eine Antwort)
Rüdiger Gram
2007-09-18 16:11:47 UTC
Permalink
Hallo Leute,

ich kämpfe mit der Fehlermeldung:
Objektvariable oder With-Blockvariable nicht festgelegt

Im Code ist die Zeile

If TypeOf PrevCtl Is TextBox Then ...

gelb unterlegt. Zu Beginn der Function habe ich

Dim PrevCtl As Control

eingetragen.

Was fehlt denn da? Warum wird das moniert?

Gruß

Rüdiger Gram
Thomas Möller
2007-09-18 16:19:52 UTC
Permalink
Hallo Rüdiger,
Post by Rüdiger Gram
Objektvariable oder With-Blockvariable nicht festgelegt
Im Code ist die Zeile
If TypeOf PrevCtl Is TextBox Then ...
gelb unterlegt. Zu Beginn der Function habe ich
Dim PrevCtl As Control
eingetragen.
ich mach das immer ein bisschen anders. Probier's mal so:


If PrevCtl.ControlType = acTextBox Then


HTH
--
Thomas

Homepage: www.Team-Moeller.de
Rüdiger Gram
2007-09-18 16:35:32 UTC
Permalink
Post by Thomas Möller
If PrevCtl.ControlType = acTextBox Then
Habe ich getestet. Wird auch angemeckert.

Hier ist mal der ganze Abschnitt. Vielleicht erkennst Du darin
irgendeine "faule" Stelle:

If TypeOf PrevCtl Is TextBox Then ' wird angemeckert
' If PrevCtl.ControlType = acTextBox Then ' wird genauso angemeckert
Call Tel_Wahlparameter_abfüllen
If Screen.PreviousControl.Name Like "Firmen Gesprächspartner *" _
Or Screen.PreviousControl.Name Like "Allgemein Gesprächspartner *" _
Or Screen.PreviousControl.Name Like "Ärzte Gesprächspartner *" Then

If Left(PrevCtl, 1) <> "-" Then ' Wenn im Feld 'Durchwahl' eine
Telefon-Nr. komplett eingetragen ist.
stDialStr = IIf(VarType(PrevCtl) > V_NULL, Wahlparameter & " "
& Left(Hauptnummer, InStr(Hauptnummer, "/")) & " " & PrevCtl, "")
GoTo wählen

' ElseIf InStr(formular.[Telefon 1], "-") < 1 Then ' Wenn kein
Hauptteil der Telefonnummer erkennbar ist.
ElseIf InStr(Hauptnummer, "-") < 1 Then ' Wenn kein
Hauptteil der Telefonnummer erkennbar ist.
MsgBox "Die Telefonummer ist nicht ***@Um die Durchwahl
benutzen zu können, muss der " & Chr(10) & _
"Hauptteil der Telefonnummer abgegrenzt sein. @Bitte fügen Sie im
Feld ' Telefon 1' zwischen dem " & Chr(10) & _
"Hauptteil der Telefonnummer und dem optionalen " & Chr(10)
& _
"Teil einen Bindestrich ' - ' ein.", _
vbOKOnly + vbExclamation
Exit Function
End If

stDialStr = IIf(VarType(PrevCtl) > V_NULL, Wahlparameter & " " &
Left(Hauptnummer, InStr(Hauptnummer, "-") - 1) & PrevCtl, "")
Else
stDialStr = IIf(VarType(PrevCtl) > V_NULL, Wahlparameter & " " &
PrevCtl, "")
End If
Else
stDialStr = ""
End If


Gruß

Rüdiger
Thomas Möller
2007-09-18 16:39:48 UTC
Permalink
Hallo Rüdiger,
Post by Rüdiger Gram
Hier ist mal der ganze Abschnitt. Vielleicht erkennst Du darin
If TypeOf PrevCtl Is TextBox Then ' wird angemeckert
' If PrevCtl.ControlType = acTextBox Then ' wird genauso angemeckert
interessanter als der folgende Code ist doch der vor diesen Zeilen. Wo
wird die Variable deklariert, wo wird sie instanziert?

CU
--
Thomas

Homepage: www.Team-Moeller.de
Rüdiger Gram
2007-09-18 17:10:04 UTC
Permalink
Post by Thomas Möller
interessanter als der folgende Code ist doch der vor diesen Zeilen.
Wo wird die Variable deklariert, wo wird sie instanziert?
Hier ist der "vordere" Teil:

Public Function Tel_Nummer_wählen(Formular As Form)

Dim stDialStr As String
Dim PrevCtl As Control
Const ERR_OBJNOTEXIST = 2467
Const ERR_OBJNOTSET = 91

Beim Kompilieren kommt keine Fehlermeldung.
Die Funktion rufe ich hiermit auf:

Private Sub Durchwahl_DblClick(Cancel As Integer)

Call Tel_Nummer_wählen(Me)
DoCmd.GoToControl Zuletzt_Aktiv

End Sub

Gruß

Rüdiger
Michel Fouquet
2007-09-18 16:56:20 UTC
Permalink
Hallo,
Post by Rüdiger Gram
Objektvariable oder With-Blockvariable nicht festgelegt
Im Code ist die Zeile
If TypeOf PrevCtl Is TextBox Then ...
gelb unterlegt. Zu Beginn der Function habe ich
Dim PrevCtl As Control
eingetragen.
Was fehlt denn da? Warum wird das moniert?
die drei grundlegenden Schritte sind:

1. Deklaration/Dimensionierung
2. Zuweisung
3. Verarbeitung/Auswertung

Du hast aber nur die Schritte 1 und 3 in deinem Code:
1. Dim PrevCtl As Control
3. If TypeOf PrevCtl Is TextBox Then ...

Dazwischen fehlt also so etwas wie:

Set PrevCtl = Screen.PreviousControl

(Zu Letzterem siehe auch das Beispiel in der OH VB).

mfg,
Michel
--
Informationen für Newbies (Neulinge) in den Access-Newsgroups
http://www.doerbandt.de/Access/Newbie.htm

OH VB: Online Hilfe von VBA im VB Editor (Taste F1)
FAQ: http://www.donkarl.com/AccessFAQ.htm
KnowHow.mdb: http://www.freeaccess.de/knowhow.asp
Rüdiger Gram
2007-09-18 17:29:05 UTC
Permalink
Post by Michel Fouquet
1. Dim PrevCtl As Control
3. If TypeOf PrevCtl Is TextBox Then ...
Set PrevCtl = Screen.PreviousControl
Ich glaube, das ist die richtige Spur. SetPrevCtl habe ich weiter
vorne, aber ich vermute, daß dieser Teil des Codes gar nicht
abgearbeitet wird (weil es 2 Zeilen davor einen Logikfehler zu geben
scheint).

Ich melde mich wieder.

Gruß

Rüdiger
Michel Fouquet
2007-09-18 17:57:54 UTC
Permalink
Hallo,
Post by Rüdiger Gram
Post by Michel Fouquet
1. Dim PrevCtl As Control
3. If TypeOf PrevCtl Is TextBox Then ...
Set PrevCtl = Screen.PreviousControl
Ich glaube, das ist die richtige Spur. SetPrevCtl habe ich weiter
vorne, aber ich vermute, daß dieser Teil des Codes gar nicht
abgearbeitet wird (weil es 2 Zeilen davor einen Logikfehler zu geben
scheint).
1. Selbstverständlich ist das die richtige Spur. "Normale" Variablen
erhalten mit ihrer Deklaration einen Standardwert verpasst. Dim i As
Integer belegt i mit 0, Dim strText As String belegt strText mit einem
Leerstring, Dim x (also ein Variant) belegt x mit Null (N-u-l-l).

Objektvariablen hingegen benötigen eine (explizite) Zuweisung
(Instanziierung). Da diese in deinem Code nicht gegeben ist, wird die
selbsterklärende Fehlermeldung "Laufzeitfehler '91': Objektvariable oder
With-Blockvariable nicht festgelegt" ausgegeben.

Wenn man sich die minimale Mühe machen würde, in dem aufpoppenden
Fenster der Fehlermeldung mal auf den Hilfe-Button zu klicken, könnte
man lesen:

<zitat>
Objektvariablen werden in zwei Schritten erstellt. Zunächst müssen Sie
die Objektvariable deklarieren, und anschließend müssen Sie der
Objektvariablen mit der Set-Anweisung einen gültigen Verweis zuweisen.
[snip]
Dieser Fehler hat die folgenden Ursachen und Lösungen:

a) Sie wollten eine Objektvariable verwenden, die auf kein gültiges
Objekt verweist.
Geben Sie für die betreffende Objektvariable (ggf. erneut) einen Verweis
an. Wenn zum Beispiel im folgenden Code-Beispiel die Set-Anweisung nicht
verwendet würde, wäre ein Fehler beim Verweis auf TestObjekt die Folge:

Dim TestObjekt As Object ' Objektvariable erstellen.
Set TestObjekt = Sheets(1) ' Zulässigen Objektverweis erstellen.
Anzahl1 = TestObjekt.Count ' Anzahl1 den Wert von Count zuweisen.

b) Sie wollten eine Objektvariable verwenden, die auf Nothing gesetzt
wurde.
Set TestObjekt = Nothing ' Objekt freigeben.
Anzahl1 = TestObjekt.Anzahl1 ' Verweis auf
' freigegebenes Objekt erstellen.

Erstellen Sie einen neuen Verweis für die Objektvariable. Sie können
beispielsweise mit einer weiteren Set-Anweisung einen neuen Verweis auf
das betreffende Objekt festlegen.

c) Das Objekt ist gültig, aber der Verweis wurde nicht zugewiesen, weil
die Objektbibliothek, in der es beschrieben ist, noch nicht im
Dialogfeld Verweise aktiviert wurde.
Wählen Sie die Objektbibliothek im Dialogfeld Verweis hinzufügen aus.
</zitat>

2. Unter "weiter vorne" kann sich unsereins natürlich alles und nichts
vorstellen.

3. Die Abarbeitung von Code lässt sich durch Einstreuen von MsgBoxen
bzw. das Setzen von Haltepunkten und Durchgehen im Einzelschrittmodus
überprüfen.

mfg,
Michel
--
Informationen für Newbies (Neulinge) in den Access-Newsgroups
http://www.doerbandt.de/Access/Newbie.htm

FAQ: http://www.donkarl.com/AccessFAQ.htm
KnowHow.mdb: http://www.freeaccess.de/knowhow.asp
Michel Fouquet
2007-09-18 18:46:35 UTC
Permalink
Post by Michel Fouquet
Dim x (also ein Variant) belegt x mit Null (N-u-l-l).
So ein Quatsch!

Dim x belegt x mit Empty! Siehe auch OH VB zu IsEmpty.

Ingrid,
lässt grüßen

Loading...