Office: Code für Ereignisprozedur im formular wo speichern???

Helfe beim Thema Code für Ereignisprozedur im formular wo speichern??? in Microsoft Access Hilfe um das Problem gemeinsam zu lösen; Ich möchte für ein Steurelement eines Formulars eine Prozedur schreiben. Je nach Inhalt des Textfeldes, soll das Textfeld eine bestimmte Farbe... Dieses Thema im Forum "Microsoft Access Hilfe" wurde erstellt von Schorse, 3. September 2009.

  1. Schorse Neuer User

    Code für Ereignisprozedur im formular wo speichern???


    Ich möchte für ein Steurelement eines Formulars eine Prozedur schreiben. Je nach Inhalt des Textfeldes, soll das Textfeld eine bestimmte Farbe annehmen. Aber das ist nicht das momentane Problem.
    Meine eigentliche Frage ist aber: Wenn ich mit Hilfe der Formulaentwurfsansicht/Ereignis für das Textfeld die Ereignisprozedur erstellt habe, steht ja diese Prozedur im Codefenster des Formulars.
    Kann diese Prozedur dort bleiben? Oder muss man ein Modul erstellen und die Prozedur dort speichern?? In Büchern ist das immer ganz einfach.
    Dort wird erstmal ein Modul erzeugt, und dort dann kleine Beispiele eingegeben und probiert. Aber wozu brauche ich ein Modul, wenn die Prozedur nur in diesem Formular funktionieren soll? Ich habe mal ein kleines Beispiel (Anzeige einer MsgBox, nach AfterUpdate des Textfeldes) in das Codefensters des Formulares geschrieben. Klappt. Aber wenn ich diese Prozedur in ein neu angelegtes Modul kopiere, passiert gar nichts.
    Ich habe hier ein prinzipielles Verständnisproblem. Wodurch wird den die Prozedur in dem Modul gestartet? Durch das Ereignis im Formular? Aber woher weiß das Modul das? :?:
    Es wäre schön, wenn mir jemand helfen könnte. Mir ist nicht klar, wo man was abspeichert, und wie die Zusammenarbeit zwischen Modul und dem eigentlichen Ereignis funktioniert.
     
  2. miriki Erfahrener User
    Das ist ein grundlegendes Thema bei Erstellung von Programmen: Die Aufteilung des Codes in lokale und globale Module.

    Wichtig ist der Unterschied zwischen lokal und global: Das Modul, das direkt an dem Formular "hängt", ist "lokal" - immer. Es kennt sich selbst und noch die "Nachbarn", die sich "global" verfügbar gemacht haben. Die Module, die nicht an ein Formular gehängt sind, sind pauschal "global" und können von allen gesehen werden. D.h. mit anderen Worten:

    Wenn Du 3 Formulare hast, kann in jedem davon das Ereignis "BeforeClose" erscheinen, aber in jedem Formular kann vor dem Schließen eine völlig unterschiedliche Aktion notwendig sein. Das ist aber auch kein Problem, denn diese Routinen sind "lokal", und somit gegenseitig nicht sichtbar - es kann keine Überschneidungen und Verwechslungen geben.

    Aber wenn in allen Formularen immer die gleiche Aktion vor dem Schließen notwendig ist, diese Routine womöglich sogar relativ lang ist... Es wäre doch blöd, wenn man in einer Routine was ändert und diese Änderung in allen anderen Formularen auch immer nochmals einpflegen muß. Dafür gibt es globale Module mit ebenso globalen Routinen.

    Da würde man den eigentlichen Inhalt der "BeforeClose"-Routine in eine Extra-Routine in einem globalen Modul auslagern und im lokalen Modul des Formulars würde sich die Routine auf den einzeiligen Aufruf der ausgelagerten Routine beschränken.

    Pauschal kann man also sagen: Module braucht man in dem Moment, wo von verschiedenen Punkten aus auf den gleichen Inhalt zugegriffen werden muß. Das betrifft z.B. auch globale Variablen oder Konstanten, die während der gesamten Laufzeit des Programms quer über alle geöffneten Formulare verfügbar sein müssen.

    Und wenn ich Dir jetzt noch sage, daß es sowohl in lokalen, wie auch in globalen, Modulen wiederum die Unterscheidung in öffentlich (PUBLIC) und nicht-öffentlich (PRIVATE) gibt, die dort jeweils auch noch leicht unterschiedliche Bedeutung haben, dann rufst Du wahrscheinlich langsam die freundlichen Herren mit den einreihig (auf dem Rücken) geknöpften Westen an... ;-)

    Achtung, nur Pseudo-Code:
    Code:
    Formular 1:
    private sub beforeclose
        msgbox "ich mach jetzt zu!"
    end sub
    
    Formular 2:
    private sub beforeclose
        msgbox "ich mach jetzt zu!"
    end sub
    ist äquivalent zu
    Code:
    Formular 1:
    private sub beforeclose
        wichtig_vor_schliessen
    end sub
    
    Formular 2:
    private sub beforeclose
        wichtig_vor_schliessen
    end sub
    
    Modul 1:
    public sub wichtig_vor_schliessen
        msgbox "ich mach jetzt zu!"
    end sub
    Aber die 2. Version ist leichter erweiterbar (neue Formulare) und änderbar. Wenn sich der Text in der MessageBox ändern soll, muß man das nur noch an einer Stelle anpassen und nicht in jedem Formular-Code einzeln.

    Grober, sehr oberflächlicher, sicherlich auch unvollständiger Exkurs, aber ich hoffe, es war trotzdem einigermaßen verständlich.

    Gruß, Michael
     
  3. Schorse Neuer User
    Vielen Dank für die schnelle Antwort

    Das ist doch schon einmal eine Aussage, die man in Büchern vergeblich sucht. Die gehen immer gleich in die Details....
    Ich habe die Ereignisprozedur jetzt im Formular selbst angesiedelt, funktioniert auch.

    Ich habe es mit If Else gelöst, aber select case muss auch gehen.
    Aber das kriege ich nicht hin, der Fehler muss schon ganz zu Anfang passieren.
    Sub Priorität_AfterUpdate()
    Dim Priorität as Integer
    Select Case Priortät
    Case 1
    Priorität.Backcolor=QBColor(11)
    Case 2 usw.

    Habe ich hier etwas falsch oder gar nicht definiert? Beispiele arbeiten immer mit Inputboxe, damit gehts auch. Der Fehler scheint in der Übernahme der eingetragenen Zahl im Feld Prirität zu liegen?
     
  4. miriki Erfahrener User

    Code für Ereignisprozedur im formular wo speichern???

    Re: Vielen Dank für die schnelle Antwort

    Yups, mehr oder weniger... Fehler im eigentlichen Sinne des Wortes paßt aber, denn die Übernahme fehlt hier gänzlich. ;-)

    du deklarierst die Variable "Priorität" (nebenbei: Sonderzeichen, wie die deutschen Umlaute und das scharfe s, solltest Du lieber in Variablen- und Objekt-Namen vermeiden!) und wertest sie direkt danach mit CASE aus. Und woher bekommt die Variable dazwischen ihren Wert her?

    Außerdem deklarierst du die Variable als Integer, also als Ganzzahl. Im CASE-Block weist Du ihr aber irgendwas mit .BackColor zu, als wenn es eine TYPE- oder Objekt-Variable sein sollte. Wofür steht "Priorität" denn? Ist das Dein Formular, also quasi "Me"? Oder ist es ein Element auf dem Formular, wie z.B. ein Eingabefeld?

    Wenn es eine Objekt-Variable ist, die sich auf z.B. ein Steuerelement bezieht, dann mußt Du dieser erstmal mit SET einen Wert zuweisen, damit VBA überhaupt weiß, worauf Du Dich da beziehen möchtest.

    Wenn es aber wirklich eine Integer-Variable ist, dann paßt das mit dem CASE schon, nur fehlt vor dem CASE das "Befüllen" der Variable mit einem Wert. Soll ein Wert aus einem Steuerelement des Formulars ausgewertet werden? Dann könntest Du mit z.B.
    Code:
    prio = me!prioerfassung.value
    Den Wert aus dem Formular auslesen und in die Variable packen, um damit weiterzuarbeiten.

    Dann müßtest du aber im CASE-Block wahrscheinlich in die Richtung gehen:
    Code:
    Case 1
        me!prioerfassung.Backcolor=QBColor(11)
    Case 2 usw.
    Gruß, Michael
     
  5. Schorse Neuer User
    Danke für die schnelle Antwort.
    Das Formular heißt F_Priorität, es enthält ein Textfeld mit dem Namen Priorität. Dieses Textfeld enthält Werte von 1 ...6. Je nach Zahl, soll das Textfeld im Hintergrund verschieden gefärbt sein. bei Case 1 soll im Formular Me das Feld Priorität.Backcolor=qbColor(11) sein, bei Case 2 andere Farbe usw.
    Gruß Schorse
     
  6. miriki Erfahrener User
    Diesmal etwas langsamer wegen Urlaub... ;-)

    Ok, dann paßt es ja im Prinzip, was ich schon schrieb. Du hast also nur eine Abkürzung genommen, die nicht funktionierte.

    Deklariere Dir also eine Variable "prio" und befülle die vor dem CASE mit dem Wert aus "me!priorität.value". Werte dann die Variable "prio" mit CASE aus und setze "me!priorität.backcolor" dann abhängig vom Wert.

    Eine kleine Abkürzung: Du kannst im CASE auch direkt "me!priorität.value" auswerten und mußt nicht den Umweg über eine eigene Variable gehen. Dein "dim priorität" ist allerdings nicht notwendig, wenn damit das Eingabefeld auf dem Formular gemeint ist. In der Tat ist es dann sogar falsch...

    Grob so müßte es passen:
    Code:
    dim prio as integer
    
    prio=me!priorität.value
    
    select case prio
        case 1
            me!priorität.backcolor=qbcolor(11)
        case 2
            [....]
    end select
    Die auf Integer deklarierte Variable "prio" würde im o.a. Ablauf für Streß sorgen, wenn im Eingabefeld ein Buchstabe steht. Die Zuweisung "prio=..." würde dann einen Laufzeitfehler verursachen. Hier wäre also der Ansatz für eine Fehler-Abfang-Routine (on error goto ...) oder einen anderen Variablentyp namens "variant", den ich aber wo immer möglich vermeide, weil der einfach nur schnarchlangsam in der Verarbeitung ist und den eigentlich gut gemeinten Ansatz mit "option explicit" wieder fast völlig aushebelt.

    Gruß, Michael
     
  7. Schorse Neuer User
    Vielen Dank für die Hilfe

    :-D
    Danke sehr!
     
Thema:

Code für Ereignisprozedur im formular wo speichern???

Die Seite wird geladen...
  1. Code für Ereignisprozedur im formular wo speichern??? - Similar Threads - Code Ereignisprozedur formular

  2. Per Hyperlink ausgeblendetes Blatt einblenden

    in Microsoft Excel Hilfe
    Per Hyperlink ausgeblendetes Blatt einblenden: Hola ins Forum, ich bräuchte mal wieder eure Hilfe. Ich habe ein Tabellenblatt das mir als Register dient und wo Hyperlinks eingefügt sind um auf das dazugehörige Blatt zu springen. Diese Blätter...
  3. Code wird nicht komplett ausgeführt

    in Microsoft Excel Hilfe
    Code wird nicht komplett ausgeführt: Guten Morgen in die Runde! Situation: Dieser Code wird nicht komplett ausgeführt. es wird der Teil mit der Du Until Schleife übersprungen. Wenn ich aber mit Einzelschritte durch den Code gehe...
  4. Rabat Codes in einen Serienbrief einfügen

    in Microsoft Word Hilfe
    Rabat Codes in einen Serienbrief einfügen: Hi, Ich möchte bei einem Brief für meine Kunden eine Rabatcode einfügen. Diese sind zufällig erstellt und in Excel als Tabelle gespeichert. Wie bekomme ich diese nun so eingefügt das auf jedem...
  5. Combobox einbinden

    in Microsoft Excel Hilfe
    Combobox einbinden: Hallo, ich bastele an einer Funktion, bei der ich an einer Stelle im Programm eine Combobox aufrufen möchte, die dann mit bestimmten Werten aus einer Tabelle gefüllt ist und dann den gewählten...
  6. VBA Code für Zeilen ausblenden einblenden mit JA/Nein

    in Microsoft Excel Hilfe
    VBA Code für Zeilen ausblenden einblenden mit JA/Nein: Hallo, habe eine Exceltabelle, bei der ich bei einer Zelle eine Ja/Nein abfrage mache, wenn in der Zelle Nein steht, dann soll ein bestimmter Zeilenbereich, den ich definieren möchte, ausgeblendet...
  7. VBA Code ohne ergebnis

    in Microsoft Excel Hilfe
    VBA Code ohne ergebnis: Hallo, ich habe einen VBA Code der in meiner Tabelle nicht funktioniert. Kann mir vielleicht jemand bei der Korrektur ggf. weiter helfen? Danke und Gruß Private Sub Worksheet_Change(ByVal Target...
  8. Bild löschen auch wenn es nicht vorhanden ist?! Code funktioniert nicht mehr..

    in Microsoft Excel Hilfe
    Bild löschen auch wenn es nicht vorhanden ist?! Code funktioniert nicht mehr..: Hallo Leute, Habe ein Macro in Benutzung das jetzt über Monate gut funktioniert hat und jetzt kam anscheint ein update und es funktioniert nicht mehr, wobei ich es mir nicht erklären kann, weil...
  1. Diese Seite verwendet Cookies, um Inhalte zu personalisieren, diese deiner Erfahrung anzupassen und dich nach der Registrierung angemeldet zu halten.
    Auf dieser Website werden Cookies für die Zugriffsanalyse und Anzeigenmessung verwendet.
    Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden