Ich versuche gerade, von Makros auf VBA umzusteigen. Da habe ich ein Problem, mit openform ID's zu übergeben. Normalerweise gibt man im Makro an ="[ID]=" & [ID], wenn das Popup die ID des aktiven DS übernehmen soll.
In VBA finde ich keine Beschreibung, wie man das da macht. Also beispielsweise geht nicht:
Public Function OpenPopUpMYFORM(ctl As Control)
DoCmd.OpenForm "MYFORM", , ,="[ID]=" & [ID] , , acDialog, ctl.Value
End Function
Was muss man da schreiben?
Carl
Wenn die Methode im Formular-Modul beherbergt und sichergestellt ist, dass im Feld bzw. Steuerelement ID kein Null-Wert vorliegt:
DoCmd.OpenForm "MYFORM", , ,"ID=" & Me.ID , , acDialog, ctl.Value
Hallo Carl,
Falls ctl = Me.ID ist geht auch
DoCmd.OpenForm "MYFORM", , ,"ID=" & ctl.Value , , acDialog
und die Übergabe der ID per OpenArgs ist dann überflüssig.
gruss ekkehard
Hallo ihr zwei, Danke für die Antwort.
bei , , , "ID=" & Me.ID, , acDialog, ctl.Value
gibt er einmal unzulässig Me.ID zurück, ein andermal merkt er an, er würde das Modul nicht finden. Ohne den Übergabeversuch der ID funktioniert das Modul allerdings.
Ebenfalls nicht funktionieren
"ID=" & [Me.ID]
"ID=" & "Me.ID"
"ID=" & 'Me.ID'
----
DoCmd.OpenForm "MYFORM", , ,"ID=" & ctl.Value , , acDialog
hier kommt Laufzeilenfehler 2501
Hallo Carl,
Vielleicht helfen
benannte Parameter, diese Kommazählerei ist doch ätzend.
DoCmd.OpenForm _
FormName:="MYFORM", _
WhereCondition:="ID = " & Me.ID, _ 'oder evtl. & ctl.Value
WindowMode:=acDialog, _
OpenArgs:=ctl.Value
Ob du OpenArgs benötigst weisst nur du.
Zitatgibt er einmal unzulässig Me.ID zurück
Verstehe ich nicht.
Zitatfunktioniert das Modul allerdings.
Welches? In dem deine Function steht?
Zitatkommt Laufzeilenfehler 2501
Und der sagt was?
gruss ekkehard
Er sagt Me.ID ist ein unzulässiges Schlüsselwort in der Kombination
DoCmd.OpenForm "MYFORM", , , "ID = " & Me.ID, , acDialog, ctl.Value
Vielleicht ist irgendwo ein Komma zuviel?
Hallo,
wenn Du in einem allgemeinen Modul bist, funktioniert Me nicht. Es muss der komplette Bezug übergeben werden.
Und wenn es allgemein sein soll, dann muss der Formularbezug auch in den Parametern deklariert und übergeben werden.
Dass es nur im Formularmodul funktioniert hat Lauchtaube in #1 schon erwähnt.
Erkläre doch mal das Vorhaben genauer.
Hallo MzKlMu,
ja das kann sein, dass es mit dem Modul zusammen hängt.
Also ich versuche, Eurem Rat zu folgen und die Makros in meiner Datenbank durch VBA zu ersetzen. Die Übergabe von [ID] funktioniert im Makro völlig problemlos. Was muss ich jetzt in einem Modul1 mit welchem Komma schreiben, um die ID zu übergeben. Ich verstehe auch nicht, wieso das so kompliziert ist, wo diese Funktion doch ziemlich oft gebraucht wird.
Weißt Du, ich glaube mein Problem (auch mit der Normalisierung) ist, dass ich anders DENKE. Meine DENKWEISE weicht ab. Als 50jähriger Psychiater habe ich seit 30 Jahren nie jemanden kennen gelernt, der logisch stringent gedacht hätte. Vielleicht weil bei seelischen Erkrankungen die Logik keine so große Rolle spielt. Wie auch immer, ich sehe, dass man am besten lernt, wenn man es gezeigt bekommt. Auch Kinder lernen am Besten, wenn sie etwas gezeigt bekommen. Hingegen ist eine Erklärung nicht so erfolgreich. Ganz zu schweigen von der Aufforderungen, etwas so oder so zu machen, was eigentlich garnicht umsetzbar ist.
Hallo,
warum hast Du den Code überhaupt in einem allgemeinen Modul und nicht direkt im Formularmodul ?
ZitatIch verstehe auch nicht, wieso das so kompliziert ist
Das ist nicht kompliziert, das scheint nur so, weil man es nicht kennt.
Wenn der Code in einem allgemeinen Modul hinterlegt ist, und das Steuerelement im dem selben Formular, das auch die ID enthält, ist, geht auch soetwas
DoCmd.OpenForm "MYFORM", , ,"ID=" & ctl.Parent.ID , , acDialog, ctl.Value
bei Steuerelementen, die direkt auf dem Formular plaziert sind. Ausnahme wäre z. Bsp. ein Steuerelement auf einer Registerseite, welches dann die Registerseite als Parent besitzt; diese wiederum hat das Registersteuerelement als Parent Objekt).
Hallo,
Zitatwenn Du in einem allgemeinen Modul bist, funktioniert Me nicht.
Weshalb ich ja gleich den Parameter verwendet habe. Allerdings
unter der Voraussetzung, dass
ctl = Me.ID
ist beim Aufruf.
Dieses ist für mich bis jetzt ungeklärt (s.u. *)
@Carl
ZitatVielleicht ist irgendwo ein Komma zuviel?
Deshalb mein Vorschlag es mit
benannten Patametern zu versuchen.
Dabei ist sogar die Reihenfolge egal.
@Lachtaube
Dies verstehe ich nicht
Zitat... ,"ID=" & ctl.Parent.ID, ...
bei Steuerelementen, die direkt auf dem Formular plaziert sind
Was wird denn da zurückgegeben? Direkt plaziert wird die Parent-
Eigenschaft doch vom Form besetzt. So ist das eine Referenz auf
sich selber.
EDIT: Sorry, nun doch verstanden. So kommst du an die ID über ein
anderes Control, - alles klar.
ZitatAusnahme wäre z. Bsp. ein Steuerelement auf einer Registerseite, welches dann die Registerseite als Parent besitzt; diese wiederum hat das Registersteuerelement als Parent Objekt).
Deine Aussage bezügl. Parent-Eigenschaft ist zwar richtig, aber alle
Controls auf Registern lassen sich immer direkt über das Formular
ansprechen
Forms("FormName").Controls("ElementAufRegister")
Nach meiner Erfahrung ist das auch eine ausreichende Referenz, das
Control hat sein Parent ja immer dabei, falls es benötigt werden würde ;)
* Ich vermute den Fehler bereits beim Aufruf aus dem Formular.
Call OpenPopUpMYFORM(Me.ID)
Obwohl man dabei ja eigentlich nichts falsch machen kann.
Im Übrigen frage ich mich immer noch wozu die ID beim Öffnen zusätzlich
per OpenArgs übergeben wird. Wenn hier zwei Werte im Spiel sind
(ID und ?) sollte man besser , wie von Klaus erwähnt, eine Formular-
Referenz als Parameter verwenden.
gruss ekkehard
Zitat von: MzKlMu am Oktober 06, 2017, 19:39:49
Hallo,
warum hast Du den Code überhaupt in einem allgemeinen Modul und nicht direkt im Formularmodul ?
Weil ich im selben Popup openargs übergeben wollte, wie oben gelernt mit einem Modul. Und weil die Existenz der Kommas ja schon darauf hindeuten, dass für die Übergabe von Werten Lehrstellen vorgesehen sind.
Zitat von: Lachtaube am Oktober 07, 2017, 07:47:23
Wenn der Code in einem allgemeinen Modul hinterlegt ist, und das Steuerelement im dem selben Formular, das auch die ID enthält, ist, geht auch soetwas
DoCmd.OpenForm "MYFORM", , ,"ID=" & ctl.Parent.ID , , acDialog, ctl.Value
bei Steuerelementen, die direkt auf dem Formular plaziert sind. Ausnahme wäre z. Bsp. ein Steuerelement auf einer Registerseite, welches dann die Registerseite als Parent besitzt; diese wiederum hat das Registersteuerelement als Parent Objekt).
Das funktioniert!! Super. Danke @Lachtaube :-)))) Genau das hatte ich gesucht.
Ich will nochmal hierauf zurück kommen.
Ich hatte das Problem erfolgreich gelöst, in dem ich in einem Modul die unten stehende Public Function verwendete, um ein popup zu öffnen, das anzeigt, wer an welchem Angebot teilnimmt.
Public Function OpenPopUpMo01(ctl As Control)
DoCmd.OpenForm "frmAngebotsnutzungMo", , , "[mo01]=true", , acDialog, ctl.Value
End Function
Hier gibt es aber jetzt in der Tabelle, auf der das frmAngebotsnutzungMo basiert, für jeden Wochentag n Felder vom Typ ja/nein, also 20*5 Felder in die Breite. Man hatte hier angemerkt, dass das nicht normal sei und deshalb bin ich jetzt auf ein einziges Feld pro Tag umgestiegen, das hier mal "Mo001" heißt und die ID der Seminare enthält, die einer anderen Tabelle entnommen werden.
Nun komme ich mit der Funktion im Modul nicht mehr klar.
Public Function OpenPopUpMo001(ctl As Control)
DoCmd.OpenForm "frmAngebotsnutzungMo", , , "[Mo001abf]=Mo001", , acDialog, ctl.Value
End Function
Ebenfalls nicht funktioniert "[Mo001abf]=[Mo001]"
Also der Ausdruck "[mo01]=true" enthält einen Wert, aber der Ausdruck [Mo001abf]=Mo001 einen variablen Wert. Den erkennt er aber in allen von mir versuchten Varianten nicht.
Sieht jemand, was ich falsch gemacht habe?
Hallo,
versuche es mal so:
DoCmd.OpenForm "frmAngebotsnutzungMo", , , "[Mo001abf]=" & Me.Mo001, , acDialog, ctl.Value
Feldnamen müssen verkettet (&) werden, damit deren Inhalt verwendet wird.
Mit Me wird auf das (aktive) Formular verwiesen, in dem sich das Feld befindet.
Da sagt er: Fehler beim kompilieren. Unzulässige Verwendung des Schlüsselwortes "Me".
Was könnte ich falsch gemacht haben?
Hallo,
da du ja im allgemeinen Modul bist, ist ME nicht bekannt.
Wie oben müsstest du dir das ME "holen". DoCmd.OpenForm "frmAngebotsnutzungMo", , , "[Mo001abf]=" & ctl.Parent.Mo001, , acDialog, ctl.Value
Verstehe ... danke, ich glaube das wars. Muss es noch ausprobieren.
Wahrscheinlich bin ich jetzt die 100 Felder los.
Carl
Carl, schade um die Energie, die Du da reinsteckst. Denn auch die 20 Felder (oder lasse es noch noch 5 sein) sind bei einer relationalen Datenbank wie Access falsch - bei einer objektorientierten Datenbank (Stichwort NoSQL) hingegen nicht.
Die Kursdetails sind in eine Tabelle auszulagern, deren Datensätze dann ein Fremdschlüsselfeld der bisherigen Tabelle, den Wochentag (als Zahlenfeld oder als Fremdschlüssel) ggf. ein Schlüsselfeld zur Tagesperiode und ein Frendschlüsselfeld auf die Kursdaten (Beschreibung des Kurses) enthält.
Ich bin am Lernen.
Aus Deiner Sicht ist das vielleicht einfach, aber aus meiner Sicht ist das ein schrittweiser Lernprozess. Ich bin ja kein gelernter Informatiker.