Hallo zusammen,
ich bin langsam am Verzweifeln und wende mich nun hoffnungsvoll an Euch (ich habe vorab intensiv nach der Lösung *gesuchmaschint* und komme trotzdem nicht weiter).
Ich rufe bei Klick auf einen Button aus einem Formular A das Formular B auf. In diesem Formular B gibt es ein Registerkartenelement mit 3 Seiten. Im gleichen Zug, wie das Aufrufen möchte ich auch die Eigenschaft "Visible" der Seite 3 auf "False" setzen.
Zum Verständnis: das aufgerufene Formular B dient sowohl zur Datenneueingabe wie auch zur Bearbeitung vorhandener Daten. Bei Klick auf o.g. Button handelt es sich um eine Neueingabe, bei der die Seite 3 des Registers sinnlos ist und somit ausgeblendet werden soll.
Ich bekomme nun, egal wie ich den Code aufbaue, für das angesprochene Element ("pgeSeite3") den Fehler:
>> "Datenbankname" kann das in Ihrem Ausdruck angesprochene Feld 'pgeSeite3' nicht finden. <<
Der Aufruf des Formulars mit dem Registerelement funktioniert noch, ebenso das leeren sämtlicher Eingabefelder (für neuen Datensatz) und der Fehler kommt dann bei folgendem Code:
Me!pgeSeite3.Visible = False
pgeSeite3 ist der Name des 3. Reiters (Seite) des Registerelementes.
Ich danke Euch vorab ganz herzlich für jeglichen Hinweis,
Gruß
Stefan
Versuche es mal mit einem Punkt "." und nicht mit einem Ausfrufezeichen "!"
Bei mir funktioniert es.
Me.Seite2.Visible = False
Hallo,
ich glaube nicht, dass es mit "." oder "!" zu tun hat...
Wie lautet der gesamte(!) Prozedur-Code? Welches Ereignis wird benutzt? WO (in welchem Form) steht der Code?
Ist der Name der Registerseite wirklich "pgeSeite3" ?
Hallöchen,
also mit dem Punkt hat es tatsächlich nichts zu tun, habe ich zur Sicherheit gerade nochmal probiert - das gibt:
---
Fehler beim Kompilieren:
Methode oder Datenobjekt nicht gefunden
---
Zum Besseren Verständnis also hier nochmal der gesamte relevante Codeabschnitt (Die Prozedur, die Bei Klick auf besagten Button in Formular A ausgeführt wird):
Private Sub Befehl17_Click()
On Error GoTo Err_Befehl17_Click
Dim stDocName As String
Dim stLinkCriteria As String
stDocName = "3_datensatz_eingabe"
DoCmd.OpenForm stDocName, , , stLinkCriteria
' Formular "leeren" für neuen Datensatz
DoCmd.GoToRecord acDataForm, stDocName, acNewRec
' und das hier der Versuch, die Seite3 des Registers "auszublenden" - mit dem bekannten Fehler
Me.pgeSeite3.Visible = False
Exit_Befehl17_Click:
Exit Sub
Err_Befehl17_Click:
MsgBox Err.Description
Resume Exit_Befehl17_Click
End Sub
Das Registerkartenelement heißt "regRegister1". Die 3 Seiten (Reiter) heißen "pgeSeite1" bis "pgeSeite3". Also jeweils der "Name" den ich im Reiter "Andere" der Eigenschaftenübersicht vergeben habe.
Hoffe, das macht es ein wenig verständlicher (auch, wenn meine Benamsungen noch etwas unbeholfen anmuten...)
;-)
Gruß
Stefan
Hallo,
ok, der Fehler liegt darin, dass auf die Registerseite im AKTUELLEN Form (das aufrufende) referenziert wird, und da gibt es das Register gar nicht, Wenn dann muß es so lauten:
DoCmd.GoToRecord acDataForm, stDocName, acNewRec
' und auf das aufgerufene Form referenzieren:
Forms(stDocName)!pgeSeite3.Visible = False
Wobei insgaesamt besser wäre, die Steuerung der Reg-Seite über den Openargs-Parameter zu bewerkstelligen:
.
.
DoCmd.GoToRecord acDataForm, stDocName, acNewRec , Openargs:=False
'und das hier der Versuch, die Seite3 des Registers "auszublenden" - mit dem bekannten Fehler
Me.pgeSeite3.Visible = False.
.
und im aufgerufenen Form:
Sub Form_Load()
Me!pgeSeite3.Visible = nz(Me.Openargs,true)
End Sub
Hallo Franz,
super! Das war's - vielen, vielen Dank!! Habe schon so etwas vermutet (Zugriff auf Eigenschaften, die es noch gar nicht gibt - hätte es aber mit diesem Ansatz trotzdem nicht lösen können).
Vllt. merkt man auch, dass ich mit Access gerade erst angefangen habe (und das auch noch mit einem geerbten Projekt, wenn es an sich auch recht klein ist...) ;-)
Ich habe also noch sehr viel zu lernen - daher möchte ich auch gerne noch auf Deine 2. Anmerkung zurückzukommen:
Du willst damit sagen, dass es besser/sauberer ist, alles, was mit der Steuerung/Erscheinugsbild eines Forms zu tun hat, auch in demselben zu erledigen (wenn nötig, wie in meinem Beispiel, durch Parameterübergabe).
Dabei verstehe ich nur nicht den Teil hintern dem "=" , wie Du es gezeigt hast. Was bewirkt das im konkreten Beispiel?
...=nz(Me.Openargs,true)
Wäre nett, wenn Du das noch auflösen könntest.
Vielen Dank nochmal,
Grüße
Stefan
Hallo,
"Du willst damit sagen, dass es besser/sauberer ist...." ja.. Objektübergreifende Referenzierungen sind fehlerträchtig und instabil. Außerdem verletzt das "objektorientierte Programmierung(stechnik)" , wenngleich hier in VBA davon nicht allzuviel zu bemerken ist.
..=nz(Me.Openargs,true)
bedeutet für die nz()-Funktion (siehe auch die VBA-Hilfe):
Im Fall, dass das Openargs-Argument (Openargs-Eigenschaft) "leer" (NULL) ist, weil gar nicht benutzt, dann liefere den Wert "False" (und weise den der Visible-Eigenschaft zu. Im Fall, dass Openargs nicht leer ist, also beim Aufruf mit einem Wert gesetzt ist, dann liefere genau diesen Wert (und weise...)
Openargs wird z. B. dann nicht benutzt, wenn das Form direkt aus dem Datenbankfenster mit Doppelklick geöffnet wird. Ohne die NZ()-Funktion würde NULL an die Visible-Eigenschaft zugewiesen, was einen Fehler zur Follge hätte.
Hallo Franz,
spitze, vielen Dank für die anschauliche Erläuterung!
Gruß und bis bald mal
Stefan