PDA

Vollständige Version anzeigen : wohin mit den VBA-Code?


tornado
22.06.2001, 09:23
Hallo miteinander

Sitze da wieder mal an meiner DB (A00), um etwas Kosmetik zu betreiben bzw. zu optimieren. Ich habe dabei festgestellt dass sich einzelne Code's in mehreren Formularen wiederholen. :eek: Gibt es da - (wiederholte Fragen bitte ich zu entschuldigen) - irgendwie einen effizienteren Weg (global oder so?) um die Code's abzulegen?

Wenn ja, freut mich jeder gute Tipp! :D

(Birgit: falls Du diese Thema auch liest... ja ich habe in der Online-Hilfe nachgesehen, aber nach was soll ich denn da speziell suchen ? :confused: )

Freundliche Grüsse
Roger

Ohnesorg
22.06.2001, 09:37
Hi Roger,

Erstelle einfach unter dem Register "Module" ein neues Modul und nenne es zum Beispiel GlobalFunc
In diesem Modul kannst Du Funktionen z.B. erstellen.
Zum Beispiel:

Public Function Message(bExitAccess, bLogin)
If bLogin = True Then
Doku.LogInDok sUserLogin, sMsgText, True
End If
If MsgBox(sMsgText, nButtons + nMsgIcon, sMsgTitle) = nButtonCheck Then
If bExitAccess = True Then
DoCmd.Quit
End If
End If

End Function

Wichtig ist, dass diese Funktionen auf PUBLIC und nicht als Private gesetzt sind!!

Du musst nämlich auf die Funktion aus Deinem Formular heraus referenzieren können, was nur mit Public's funktioniert.
Die Referenz sieht wie folgt aus:

GlobalFunc.Message True, sUser

wobei True und sUser die Variablen sind, die von der Funktion Message benötigt werden.

Greifst Du nur innerhalb des Moduls auf Funktionen zu, setzt Du diese am Besten auf Private, denn wenn Du im Quelltext, der auf Dein Modul referenziert, den Modulnamen mit nachgestelltem Punkt angibst, öffnet sich eine Liste mit allen verfügbaren Funtkionen. Diese Liste hälst Du Dir mit Private's sauber, da Du auf diese nicht referenzieren kannst.

Rechtschreibfehler bitte ich zu entschuldigen!! :D

tornado
22.06.2001, 10:02
Hallo Ohnesorg

...puhhh das sieht ja unheimlich kompliziert aus, werde es jedoch gleich mal versuchen.

Wenn ich es richtig verstanden habe, kann ich somit zB. die Schaltflächen "Schliessen" -die in einigen Formularen vorkommen- mit einer Public-Function "behaften"?
In etwa so:

Public Function Click()
On Error GoTo Err_Click
DoCmd.Close
Exit_Click:
Exit Sub
Err_Click:
MsgBox Err.Description
Resume Exit_Click
End Function

Wäre das bis hierhin richtig? :rolleyes:

Was ich noch nicht ganz verstanden habe: wie greife ich anschliessend auf diese Function zu? :confused: Hast' mir da vielleicht ein Beispiel für die "Schliessen" - Schaltfläche?

Besten Dank
Gruss Roger

Bodo M
22.06.2001, 11:40
Hallo Roger,
Dein Vorhaben ist wirklich einfach. Du kannst sowohl Funktionen und wiederkehrende Prozeduren in Funktionen und Prozeduren ablegen. Unter Module kannst Du diese speichern.
Bedenke, dass Du i. d. R. Funktionen nur einsetzt, wenn Du einen Rückgabewert benötigst; ansonsten verwende Prozeduren.
Bsp.:
Public Sub Schließen(Formularname As String)
On Error GoTo Fehler
DoCmd.Close acForm, Formularname
Exit Sub
Fehler:
MsgBox Err.Description
End Sub

Im Formular rufts Du die Prozedur mit
Call Schließen(me.Name)
auf. Eine Prozedur oder Funktion der kein Wert übergeben wird kannst Du auch ohne Call aufrufen.

Gruß Bodo

Ohnesorg
22.06.2001, 12:35
Hallo...

Original erstellt von Bodo M:
Eine Prozedur oder Funktion der kein Wert übergeben wird kannst Du auch ohne Call aufrufen.

Das stimmt sooo nicht ganz... Du kannst auch Prozeduren und Funktionen aufrufen, die keinen Wert erhalten UND das Call weglassen, wenn Du die Variable(n) nicht einklammerst.
Also statt

Call Schließen(Me.Name)
einfach
Schließen Me.Name

Das Klammern wird nur dann notwendig, wenn eine Funktion einen Wert zurück gibt und das ganze ausgewertet werden soll.
Nehmen wir mal an, dass die Funtkionen "Schließen" den Wert False zurückgibt, wenn sie fehlgeschlagen ist bzw. einen Fehler gemeldet hat. Dann schaut das so aus:

If Schließen(M.Name) = False then ...

Oder zum Beispiel eine Funktion, die 4 Zahlen miteinander addiert (schwachsinnig, aber als Beispiel ganz Wirkungsvoll)

Variable = SummiereZahlen(iZahl1, iZahl2, iZahl3, iZahl4)

Soll die Funktion aufgerufen werden ohne mit dem zurückgegebenen Wert weiter zu arbeiten, könnte man auch

Call SummiereZahlen(iZahl1, iZahl2, iZahl3, iZahl4)

oder

SummiereZahlen iZahl1, iZahl2, iZahl3, iZahl4

Hört sich kompliziert an, ist aber ganz einfach zu merken. Schreibst Du vor dem eigentlichen Aufruf der Funktion eine Anweisung UND übergibst Werte an die Funktion, bedeutet das Du musst klammern. Ansonsten kannst Du das sein lassen.

Du sparst Dir so auch ein wenig Schreibarbeit. :D

Ohnesorg
22.06.2001, 12:43
Ich nochmal...

Die Funktion bzw. Sub "Schließen" schreibst Du am Besten in ein Modul.

Ich nenne es einfach mal glbFunc für Global Functions.

Deine Prozedur beginnt mit
Public Sub Schliessen (NameFormular as String)

In dem Formular, in dem Du die Schaltfläche schließen hast gibst Du bei "Bei Klick" folgenden Befehl an:

glbFunc.schliessen me.name

ein. Damit ist der ganze Zauber erledigt. :)

tornado
22.06.2001, 14:34
Hallo Ohnesorg, hallo Bodo M

Erst mal Besten Dank für Eure Vorschläge. Habe soeben versucht sie in meine DB einzubauen. Aber irgendwas muss ich falsch verstanden oder vergessen haben!?

Habe da mal ein neues Modul (glbFunc) erstellt mit folgendem Inhalt

Public Sub Schliessen()
On Error GoTo Fehler
DoCmd.Close acForm
Exit Sub
Fehler:
MsgBox Err.Description
End Sub

Im Formular steht hinter "Bei Klick"
glbFunc.Schliessen()

Resultat, ich bekomme eine Fehlermeldung ... kann das Makro 'glbFunc' nicht finden....

Habe auch versucht in die Klammer den Namen vom geöffnetem Formular (Aufträge editieren) einzugeben, erhalte jedoch die gleiche Fehlermeldung ...kann das Makro 'glbFunc' nicht finden...

Was mache ich da falsch? :confused:

Schlussendlich sollte ja das Modul für alle Formulare funktionieren.

Gruss
Roger

kama
22.06.2001, 15:28
=Schließen() reicht

Ohnesorg
22.06.2001, 15:51
Hi Tornado, Hi Kama,

Wie wäre es, wenn die Klammer hinter glbfunc.schliessen einfach weggelassen wird?

Sollte dies dann auch nicht funktionieren, gibt es noch die Möglichkeit über die Rechte Maustaste -> Aufbauen die Zeile aufbauen zu lassen.

Sollte das auch nicht funzen, brauche ich wieder eine Fehlermeldung.

Bei mir (ja, ja... der altbekannte Spruch) funktioniert das nämlich einwandfrei.
Die meisten meiner Funktionen und Sub's habe ich in - nach Arbeiten, die erledigt werden sollen und Kategorien sortiert - Module gestopft um die Wart- und Lesbarkeit zu erhalten.... hm!? :confused:

Sag einfach Bescheid, wie es funktioniert, wenn der Fehler behoben sein sollte, dann lerne ich auch noch dabei...

P.S.: Wer nähmlich mit 'H' schreibt ist dähmlich! :D

tornado
22.06.2001, 21:56
Hallo Leute

Bin jetzt zu Hause und werde mir mal ein schönes Wochenende gönnen (mache ne kleine Motorrad-Tour).

uups.. hab ich da irgendwo näh h mlich geschrieben?? :D

Spass beiseite, wünsche allen ein recht schönes Weekend und ich werde dann am Montag in der Firma die wertvollen Tipps ausprobieren.

Bis dann, melde mich wieder! :cool:

Gruss und nochmals besten Dank.

cu
Roger

tornado
23.06.2001, 17:27
Hallo Ohnesorg, hallo Karma

Bin mal kurz in der Firma (Datensicherung) und habe schnell Eure Tipps ausprobiert.

Leider ohne jeglichen Erfolg. :confused:

Gebe ich (immer noch hinter "Bei Klick") glbFunc.Schliessen() ein erscheint folgende Fehlermeldung: Microsoft Access kann das Makro 'glbfunc' nicht finden. Entweder existiert das Makro nicht, oder das Makro ist neu und wurde noch nicht gespeichert.
Beachten Sie bitte folgendes: Wenn Sie in einem Argument die Syntax Makrogruppenname.Makroname verwenden, müssen Sie den Namen angeben, unter dem die Makrogruppe des Makros zuletzt gespeichert wurde.

Gebe ich jedoch "=Schliessen" ein wird erstens Schliessen in eckige Klammern gesetzt und folgende Fehlermeldung ausgegeben: Sie haben als Einstellung der Ereigniseigenschaft den Ausdruck Beim Klicken eingegeben. Dieser Ausdruck hat einen Fehler verursacht: Das Objekt enthält nicht das Automatisierungsobjekt 'Schliessen'.
* Der Ausdruck gibt möglicherweise weder den Namen eines Makros noch den Namen einer benutzerdefinierten Funktion, noch [Ereignisprozedur] zurück.
* Beim Auswerten einer Funktion, eines Ereignisses oder eines Makros trat möglicherweise ein Fehler auf.

Die erste Fehlermeldung bleibt die gleiche, ob mit oder ohne Klammer hinter Schliessen.

Bei der Eingabe =Schliessen() erfolgt folgende Meldung: Sie haben als Einstellung der Ereigniseigenschaft den Ausdruck Beim Klicken eingegeben. Dieser Ausdruck hat einen Fehler verursacht: Der von Ihnen eingegebene Ausdruck enthält den Namen einer Funktion, die Microsoft Access nicht finden kann.... ( Billy lässt grüssen ) :D

Kommt da noch irgendwer mit??

Gruss
Roger

kama
23.06.2001, 19:13
Hallo
Diese fehlermeldung ist zumindest eindeutig.
Für deine Datenbank gibt es keine Funktion Schkießen!
Versuche es mit dem Ausdruckseditor
Ins Feld bei Bei Klick gehen
Rechte Maustaste
Ausdruckseditor
Funktion
Dort findest du(Sodenn dein Modul Ordnungsgemäß ist)
auch den Namen deiner Datenbank
Inder Zweiten Spalte muß du
glbFunc finden
In der dritten die Darin enthaltenen
Funktionen
Ich hoffe du siehst jetzt eien!!
Wenn nicht, stimmt was mit deinem Modul nicht
wenn doch klicke doppelt auf die Funktion
und sage beenden.
Jetzt müßte es klappen

kama
23.06.2001, 19:38
Damit kappt es. Also vergiss das mit Public sub.

Function Schliessen()
On Error GoTo Fehler
DoCmd.Close
Exit Function
Fehler:
MsgBox Err.Description
End Function

Und
Du hast Post

tornado
23.06.2001, 20:03
Hi Kama

Danke für Deine Tipps, werde sie am Montag gleich mal versuchen. Hoffe es klappt.

Schöner Sonntag

cu
Roger

tornado
25.06.2001, 06:49
Einen schönen guten Morgen miteinander

Habe soeben den letzten Tipp in meine DB gehämmert und...

e s f u n z t !! :) :)

Ich Danke nochmals allen Mit-Tester

Roger