Discussion:
Wie kann ich einen String ausführen (ggf. als Prozedur speichern und aufrufen?)
(zu alt für eine Antwort)
Wolfgang Kaiser
2007-12-28 18:37:20 UTC
Permalink
Hallo,

ich möchte mit einem VB Code innerhalb einer A2K-Datenbank aus einem
zusammengesetzten String eine Prozudur erstellen oder diesen String
ausführen.

Die Strings sind einmal der Name des Formulars (frm) und dann der Name
des Controls (CTRL). Die Function CALL2 soll dann das Ereignis
ausführen, was bei diesem Control .onclick ausgeführt werden soll.

Also soll beim Aufruf

Call CALL2("Test", "Schaltflaeche1")

die Sub

Call Form_Test.Schaltflaeche1_Click

ausgeführt werden.

Wie geht das?

Vielen Dank, hoffe es gibt trotz jahresende und Weihnachten genug
hier ...

Liebe grüße

Wolfgang





Function CALL2(ByVal frm As String, ByVal ctrl As String)

?

End Function
Klaus Oberdalhoff
2007-12-28 20:25:16 UTC
Permalink
Hi,
Post by Wolfgang Kaiser
Also soll beim Aufruf
Call CALL2("Test", "Schaltflaeche1")
die Sub
Call Form_Test.Schaltflaeche1_Click
ausgeführt werden.
schau dir mal das VBA "Eval" genauer an

In der guten alten KnowHow.mdb (siehe Signatur) im Modul mdlSonstige3 ist
sogar ein Beispiel dazu ...
--
mit freundlichen Grüßen aus Nürnberg

Klaus Oberdalhoff ***@gmx.de

Ich beantworte keine NG-Fragen und -Nachfragen per Mail!
Newbie-Info: http://www.doerbandt.de/Access/Newbie.htm
KnowHow-mdb und andere Beispiele: http://www.freeaccess.de
Sofern Access 200x bitte beachten:
http://www.freeaccess.de/MS-Access-Artikel.asp?ID=99

Ich unterstütze PASS Deutschland e.V. (http://www.sqlpass.de)
Nächstes Treffen in Nürnberg am 15.01.2008
Wolfgang Kaiser
2008-01-05 03:23:25 UTC
Permalink
Hi Klaus,

vielen Dank für den Tipp!

ich hatte die KH schon durchsucht, aber nichts gefunden - also vielen
dank!

Wolfgang
Wolfgang Kaiser
2008-01-07 08:13:18 UTC
Permalink
Hallo Klaus,

ich habe es wie empfohlen mit EVAL probiert.

Allerdings ist eines seltsam:

Wenn ich in eine Function
"Form_Frm_Hauptauswahl.Hauptfrm_beenden_click" schreibe, führt das zum
gewünschten Ergebnis;

Eval("Form_Frm_Hauptauswahl.Hauptfrm_beenden_click")

liefert aber einen Laufzeitfehler 2482 -> ".... kann den eingegebenen
Namen 'Form_FRMHauptauswahl' nicht finden".

Woran liegt das? Habe ich einen Syntax-Fehler?

Viele Grüße und Dank im voraus,

Wolfgang
Klaus Oberdalhoff
2008-01-07 13:54:39 UTC
Permalink
Hi,
Post by Wolfgang Kaiser
Wenn ich in eine Function
"Form_Frm_Hauptauswahl.Hauptfrm_beenden_click" schreibe, führt das zum
gewünschten Ergebnis;
Eval("Form_Frm_Hauptauswahl.Hauptfrm_beenden_click")
liefert aber einen Laufzeitfehler 2482 -> ".... kann den eingegebenen
Namen 'Form_FRMHauptauswahl' nicht finden".
<mhm> keine Ahnung,

ich vermute aber eher, dass die als "private" definierten Subs 'von aussen'
per Definition nicht gefunden werden, und das hat nix mit eval zu tun. Als
Member der Forms-Klasse sind sie ja erstmal nur innerhalb der Klasse
aufrufbar.

Um ehrlich zu sein, mache ich sehr wenig mit eval, das brauche ich
eigentlich nie.

Aber wenn, dann würde ich eval immer in ein eigenes Modul und darin in eine
eigene Funktion verpacken und käme nicht unbedingt auf die Idee, eine
Button-Click Methode von aussen ansteuern zu wollen. Ich persönlich nehme
dann den Button-Click Code und verschiebe ihn in eine eigene Funktion und
rufe vom Button-Click aus diese (Hilfs-)Funktion auf.

mit freundlichen Grüßen aus Nürnberg

Klaus Oberdalhoff ***@gmx.de
Ich unterstütze PASS Deutschland e.V. (http://www.sqlpass.de)
Nächstes Treffen in Nürnberg am 15.01.2008
Wolfgang Kaiser
2008-01-08 07:50:30 UTC
Permalink
Hallo Klaus,

das beschriebene Phänomen tritt bei der als

Public Sub Hauptfrm_beenden_click ()

definierten Sub auf -> wenn sie als public Sub definiert wird, sollte
sie doch auf Modulebene gefunden werden, oder?

ich habe - im gleichen Modul - nacheinander - die beiden Codezeilen

Form_Frm_Hauptauswahl.Hauptfrm_beenden_click
Eval("Form_Frm_Hauptauswahl.Hauptfrm_beenden_click")

eingegeben und dabei bei EVAL einmal die Fehlermeldung bekommen ...
Post by Klaus Oberdalhoff
Aber wenn, dann würde ich eval immer in ein eigenes Modul und darin in eine
eigene Funktion verpacken und käme nicht unbedingt auf die Idee, eine
Button-Click Methode von aussen ansteuern zu wollen. Ich persönlich nehme
dann den Button-Click Code und verschiebe ihn in eine eigene Funktion und
rufe vom Button-Click aus diese (Hilfs-)Funktion auf.
Das will ich vermeiden, da ich das für sehr viele Funktionen machen
müsste ...

Viele grüße und vielen dank

Wolfgang
Henry Habermacher
2008-01-08 10:31:34 UTC
Permalink
Hallo Wolfgan
Post by Wolfgang Kaiser
das beschriebene Phänomen tritt bei der als
Public Sub Hauptfrm_beenden_click ()
definierten Sub auf -> wenn sie als public Sub definiert wird, sollte
sie doch auf Modulebene gefunden werden, oder?
Du bist unpräzise. Was ist ein Modul? Ein Klassenmodul oder ein Standard
Modul? Ich gehe mal davon aus, dass Du ein Klassenmodul meinst, oder? Falls
ja, dann ist diese Sub nur verfügbar, wenn die Klasse (in diesem Fall das
Formular) instanziier ist.

Leg' diese Sub mal in ein Standard Modul und versuche es nochmals. Wenn Du
diese in eine Function änderst, kannst Du diese dann beim Button direkt
aufrufen, indem Du in die Beim Klicken Property

?Hauptfrm_beenden_click()

reinschreibst.
Post by Wolfgang Kaiser
ich habe - im gleichen Modul - nacheinander - die beiden Codezeilen
Form_Frm_Hauptauswahl.Hauptfrm_beenden_click
Eval("Form_Frm_Hauptauswahl.Hauptfrm_beenden_click")
eingegeben und dabei bei EVAL einmal die Fehlermeldung bekommen ...
Eval läuft IIRC ausserhalb des Modul Kontextes. Die Variablen im Modul sind
IIRC in Eval nicht sichtbar. Du musst daher wohl die Prozedur wirklich in
ein Standard Modul auslagern.
Post by Wolfgang Kaiser
Post by Klaus Oberdalhoff
Aber wenn, dann würde ich eval immer in ein eigenes Modul und darin in
eine eigene Funktion verpacken und käme nicht unbedingt auf die Idee,
eine Button-Click Methode von aussen ansteuern zu wollen. Ich persönlich
nehme dann den Button-Click Code und verschiebe ihn in eine eigene
Funktion und rufe vom Button-Click aus diese (Hilfs-)Funktion auf.
Das will ich vermeiden, da ich das für sehr viele Funktionen machen
müsste ...
Ja, solche Dinge sollten /vor/ dem Start der Programmierung klar sein oder
es steht ein Haufen arbeit an. Wie gesagt, Du kannst Die Funktion sehr
einfach wie oben beschreiben aufrufen. Dies hat zudem den Vorteil, dass Du
den Button dann von einem Formular in ein anderes kopieren kannst, ohne den
VBA Code dahinter zu verlieren. Die Property bleibt dabei nämlich erhalten
und diese ruft ja einen allgemein verfügbaren Code und nicht Modul Code auf.

Gruss
Henry
--
Microsoft MVP Office Access
Keine E-Mails auf Postings in NGs. Danke.
Access FAQ www.donkarl.com
Thomas Winkler
2008-01-28 11:22:40 UTC
Permalink
Hi,
Post by Wolfgang Kaiser
Post by Klaus Oberdalhoff
Aber wenn, dann würde ich eval immer in ein eigenes Modul und darin in eine
eigene Funktion verpacken und käme nicht unbedingt auf die Idee, eine
Button-Click Methode von aussen ansteuern zu wollen. Ich persönlich nehme
dann den Button-Click Code und verschiebe ihn in eine eigene Funktion und
rufe vom Button-Click aus diese (Hilfs-)Funktion auf.
Das will ich vermeiden, da ich das für sehr viele Funktionen machen
müsste ...
ich kann Dir nur den guten Rat geben, den Vorschlag von Klaus
anzunehmen, und dir _einmal_ die Arbeit für _sehr viele_ Funktionen zu
machen. Im Ergebnis hast Du dann einen herrlich modularen Code, der
flexibel einzusetzen und zu warten ist.

Mit der von Dir anvisierten Methode löst du Dein Problem zwar
kurzfristig gesehen schneller, handelst Dir aber für später
immer-wiederkehrende Probleme (z.B. mit undefinierten Programmzuständen,
unerklärlichen Fehlern...) ein. Dann hast Du nämlich _sehr oft_ an sehr
_sehr viele_ Funktionen rumzubsateln, ohne dein Problem wirklich zu
lösen oder neue Probleme zu schaffen.

Damit kommst Du dann sehr schnell an den Punkt, bei dem Klaus' Vorschlag
der schnellere (und konsistentere sowieso) ist.

HTH

Thomas

Daniel Pichl
2008-01-08 07:56:52 UTC
Permalink
Post by Klaus Oberdalhoff
Aber wenn, dann würde ich eval immer in ein eigenes Modul und darin
in eine eigene Funktion verpacken und käme nicht unbedingt auf die
Idee, eine Button-Click Methode von aussen ansteuern zu wollen. Ich
persönlich nehme dann den Button-Click Code und verschiebe ihn in
eine eigene Funktion und rufe vom Button-Click aus diese
(Hilfs-)Funktion auf.
In der Tat - ich sehe auch immer zu, dass ich so wenig Verarbeitung wie nur
möglich in den Modulen der Formulare/Berichte habe. Meist reicht ein Aufruf
einer in einem applikationsweiten Modul definierten Funktion aus, der ich
ggfs. Rechen- und Vergleichswerte als Parameter mitgebe. So habe ich das
Meiste in einem Modul zusammen und muss nicht großartig das Formular
durchforsten.

bye, Daniel
Wolfgang Kaiser
2008-01-08 18:07:04 UTC
Permalink
hallo,

vielen Dank, aber ich fürchte, an meiner anvisierten Lösung führt
lkein Weg dran vorbei.

ich habe noch einmal recherchiert, EVAL funktioniert nicht bei Subs,
nur bei Funktiuonen

Aber: CallByName scheint das zu tun, was ich will.

Kennt sich jemand damit aus? ich habe verschiedene varianten probiert,
aber es geht nicht ...

Grüße

Wolfgang
Loading...