Office Forum
www.Office-Loesung.de
Access :: Excel :: Outlook :: PowerPoint :: Word :: Office :: Wieder Online ---> provisorisches Office Forum <-
NotInList mit MsgBox steuern
zurück: Suchformular mit 2 Listenfeldern weiter: Laufzeitfehler 3061 Unbeantwortete Beiträge anzeigen
Neues Thema eröffnen   Neue Antwort erstellen     Status: Antwort Facebook-Likes Diese Seite Freunden empfehlen
Zu Browser-Favoriten hinzufügen
Autor Nachricht
sk42
Im Profil kannst Du frei den Rang ändern


Verfasst am:
02. Mai 2012, 21:15
Rufname:

NotInList mit MsgBox steuern - NotInList mit MsgBox steuern

Nach oben
       Version: Office 2003

Hallo,

Wenn bein einem Kombinationsfeld ein Eintrag in der zugrunde liegenden Liste nicht existiert, dann möchte ich den Eintrag Userabhängig Anhängen, Ändern oder Nichts tun. Ich dachte, das könnte ich mit einer MsgBox machen nach folgendem Muster:
Code:
    Select Case Meldung
      Case 6
        MsgBox "auf Yes geklickt"
      Case 7
        MsgBox "auf No geklickt"
      Case 2
        MsgBox "auf Cancel geklickt"
        Cancel = True
    End Select
Sowohl dieses Muster als auch eine Sicherheitsabfrage, die ich bei Kombifeldern oft verwende (weil meine User oft SuchKombis und Kombis, die Datensätze ändern, verwechseln trotz eindeutiger Farbmarkierung Rolling Eyes ), funktioniert:
Code:
    If MsgBox("Datensatz ändern?", vbYesNo + vbDefaultButton2) = vbNo Then Cancel = True
Aber sobald ich bei "Case" was anderes eingebe, meckert VBA beim Compilieren, daß die Variable "Cancel" nicht definiert sei. Confused

Ich habe mal eine Beispiel-Datenbank drangehängt.
in den Formularen frm_Detail und frm_Zwischen meckert VBA nicht, aber im Formular frm_Detail_v2 meckert VBA.

Was ich überhaupt nicht verstehe:
in allen 3 Varianten steht die identische Anweisung
Code:
   Cancel = True
Bei zwei Varianten funktionierts, bei Nr.3 meckert VBA. Wieso? Bei so einer kurzen Zeile kann man doch eigentlich gar keine Tipp-Fehler machen (habe de Code ja auch kopiert). Also wo ist der Fehler? Confused


NotInList_v1.zip
 Beschreibung:

Download
 Dateiname:  NotInList_v1.zip
 Dateigröße:  26.54 KB
 Heruntergeladen:  15 mal

MissPh!
Office-VBA-Programmiererin


Verfasst am:
02. Mai 2012, 23:21
Rufname:
Wohnort: NRW


AW: NotInList mit MsgBox steuern - AW: NotInList mit MsgBox steuern

Nach oben
       Version: Office 2003

Hallo,

du kannst die Cancel-Option nur in solchen Ereignisprozeduren nutzen, wo diese auch über die Parameterliste angeboten wird.
Das Dirty-Ereignis kennt sie, das NotInList-Ereignis bietet andere Reaktionsmöglichkeiten.

Mein Tipp:
Studiere die Einsatzmöglichkeiten der Ereignisse, die du nutzt, in der Access-Hilfe, ehe du wild drauflos programmierst.

PS:
...und setze prinzipiell "Option Explicit" (-> Variablendeklaration erforderlich) ein, dann wird die Nutzung nicht deklarierter Variablen beim Kompilieren angemeckert.

_________________
Gruß MissPh!
sk42
Im Profil kannst Du frei den Rang ändern


Verfasst am:
02. Mai 2012, 23:49
Rufname:

Re: AW: NotInList mit MsgBox steuern - Re: AW: NotInList mit MsgBox steuern

Nach oben
       Version: Office 2003

Hallo,
MissPh! - 02. Mai 2012, 23:21 hat folgendes geschrieben:

du kannst die Cancel-Option nur in solchen Ereignisprozeduren nutzen, wo diese auch über die Parameterliste angeboten wird.
Das Dirty-Ereignis kennt sie, das NotInList-Ereignis bietet andere Reaktionsmöglichkeiten.
Das verstehe ich jetzt nicht. Das "Cancel" gehört doch zur MsgBox? Wink

Zitat:
Studiere die Einsatzmöglichkeiten der Ereignisse, die du nutzt, in der Access-Hilfe, ehe du wild drauflos programmierst.
Zum einen benutze ich eine englische Office-Version, d.h. da nützt mir die Access-Hilfe wenig, zum anderen funktionieren die Beispiele in der Online-Hilfe oft nicht oder zeigen nicht das was man geade benötigt. Die Online-Hilfe ist da nicht sehr anfängergerecht. Ich habe zwar gegoogelt, aber nix passendes gefunden. Aus deinem obigen Satz schließe ich, daß ich an einer völlig falschen Stelle (nämlich bei Verwendung von Messageboxen) gesucht habe. Wenn man nicht weiß wonach man suchen muß, dann kann man auch nix finden. Crying or Very sad
Wie heißt denn das Stichwort, nach dem ich in der Online-Hilfe oder bei google nachsehen muß? Das was in der Online-Hilfe unter "NotInList-Ereignis" angezeigt wird, zeigt mir nicht, wie mein Code richtig lauten müßte. Wink

Zitat:
PS: ...und setze prinzipiell "Option Explicit" (-> Variablendeklaration erforderlich) ein, dann wird die Nutzung nicht deklarierter Variablen beim Kompilieren angemeckert.
Na das habe ich doch (siehe meine Beispieldatenbank)! Genau deswegen hat VBA ja beim Kompilieren gemeckert. Wink
Aber eigentlich ist das doch gar keine Variable, sondern eine Anweisung. Confused
MissPh!
Office-VBA-Programmiererin


Verfasst am:
03. Mai 2012, 00:35
Rufname:
Wohnort: NRW

AW: NotInList mit MsgBox steuern - AW: NotInList mit MsgBox steuern

Nach oben
       Version: Office 2003

Hi,

wenn eine Ereignisprozedur den Cancel-Parameter beinhaltet, wie z.B. hier:
Code:
Private Sub cbo_Detail_FK_Dirty(Cancel As Integer)
so kannst du mit dem Befehl "Cancel = True" etwas bewirken, aber hier z.B. geht das nicht:
Code:
Private Sub cbo_Info_FK_NotInList(NewData As String, Response As Integer)
Zitat:
Das verstehe ich jetzt nicht. Das "Cancel" gehört doch zur MsgBox?
Nein, die Antwort-Möglichkeit "vbCancel" auf die MsgBox-Abfrage hat nichts mit dem Befehl "Cancel = True" zu tun.
_________________
Gruß MissPh!
sk42
Im Profil kannst Du frei den Rang ändern


Verfasst am:
03. Mai 2012, 21:47
Rufname:


Re: AW: NotInList mit MsgBox steuern - Re: AW: NotInList mit MsgBox steuern

Nach oben
       Version: Office 2003

Hallo,

Hm, ich habe dies aber in Beispiel-Codes immer nur im Zusammenhang mit der MsgBox gesehen, also war meine Schlußfolgerung die logische Konsequenz daraus. Ist aber auch schwierig, denn diese Details werden ja nirgendwo erklärt. Confused

Nunja, ich habe mal weiter gegoogelt und "wild herumprogrammiert" (oder in Neudeutsch: "Learning by doing"). Wink
Jetzt funktioniert zumindest schon mal das Abbrechen. Aber leider blieb die Kombobox-Liste danach geöffnet. "Aus Verzweiflung" habe ich dann ein "SetFocus" auf ein anderes Feld gesetzt (weil das ja mit der von einer Textbox überlagerten Kombobox so gut funktioniert hatte).
Code:
      Case 2
        'Abbrechen
        Response = acDataErrContinue
        Me!cbo_Info_FK.Undo
        Me!txt_AndereInhalte.SetFocus
Wie würde man das denn richtigerweise machen?

Zweites Problem, über das ich leider nicht ergoogeln konnte (es gibt immer nur Beispiele für "Anhängen"): Wie editiert man den in der Kombobox angezeigten Datensatz? Ich habe folgendes versucht, aber dabei wird immer nur der erste Datensatz in der Tabelle editiert, in der Kombobox aber ein ganz anderer angezeigt. Confused
Code:
      Case 7
        'vorhandenen Datensatz ändern
        Response = acDataErrContinue
        rs.Edit
        rs!Info = NewData
        rs.Update
        Me!cbo_Info_FK.Undo
        Me!txt_AndereInhalte.SetFocus
Lasse ich "Me!cbo_Info_FK.Undo" weg, dann lande ich seltsamerweise in einer Endlosschleife. Confused
MissPh!
Office-VBA-Programmiererin


Verfasst am:
04. Mai 2012, 22:17
Rufname:
Wohnort: NRW

AW: NotInList mit MsgBox steuern - AW: NotInList mit MsgBox steuern

Nach oben
       Version: Office 2003

Hi,
ich hätte hierzu folgenden Vorschlag für dich:
Code:
Private Sub cbo_Info_FK_NotInList(NewData As String, Response As Integer)
    'Wozu das ???
    If IsNull(Me.cbo_Info_FK.OldValue) Then Exit Sub
   
    'Was tun?
    Select Case MsgBox("Datensatz: anhängen, ändern oder Abbrechen?", _
                vbYesNoCancel + vbDefaultButton3)
        Case vbYes
            'Neuen Datensatz anhängen
            Response = acDataErrAdded
        Case vbNo
            'vorhandenen Datensatz ändern
            CurrentDb.Execute "update tab_info set info = '" & NewData & _
                                        "' where info_pk = " & Me.cbo_Info_FK
            Response = acDataErrAdded
        Case vbCancel
            'Vorgang abbrechen
            Response = acDataErrContinue
    End Select
End Sub

_________________
Gruß MissPh!
sk42
Im Profil kannst Du frei den Rang ändern


Verfasst am:
05. Mai 2012, 16:07
Rufname:

Re: AW: NotInList mit MsgBox steuern - Re: AW: NotInList mit MsgBox steuern

Nach oben
       Version: Office 2003

Hallo,

Danke, damit funktioniert aber nur 1 von 3.
Im Detail:
Code:
    'Wozu das ???
    If IsNull(Me.cbo_Info_FK.OldValue) Then Exit Sub
Hoppla, das ist wohl noch vom Kopieren übrig geblieben. Habs gelöscht.
Code:
      Case vbYes
        'Neuen Datensatz anhängen
        Response = acDataErrAdded
Bei dieser verkürzten Version kommt die Fehlermeldung "Nicht in Liste" und das Kombifeld bleibt offen. Man kann da nur noch mit "ESC" wieder raus.
Code:
        rs.AddNew
        rs!Info = NewData
        rs.Update
Diese 3 Zeilen sind offenbar nötig (steht ja auch so in der donkarl-FAQ 4.13Kombinationsfeld - Eintrag hinzufügen).
Die Frage ist jetzt nur, ob das "Response = acDataErrAdded" vor oder hinter die obigen 3 Zeilen gehört bzw. wann gehört es vor und wann dahinter (habe schon Beispiele mit beiden Varianten gesehen). Question
Code:
      Case vbNo
        'vorhandenen Datensatz ändern
        CurrentDb.Execute "UPDATE tab_info SET info = '" & NewData & _
                                    "' WHERE info_pk = " & Me.cbo_Info_FK
        Response = acDataErrAdded
Dies funktioniert!
Das sieht dann ja fast so aus, als ob mein Code nur deswegen nur teilweise funktioniert hat (also immer nur der 1. Datensatz editiert wurde und nicht der angezeigte), weil bei der Anweisung rs.Edit nicht die richtige Datensatz-ID übergeben wurde (Schlußfolgerung aufgrund deines WHERE-Teils)? In den Beispielcodes (auch die hier im Forum) wird dies aber nie erwähnt, d.h. da taucht keine Codezeile auf, mit der zu einem bestimmten Datensatz gesprungen wird.
Ich habe daher jetzt versuchtsweise mal folgendes ausprobiert:
Code:
      Case vbNo
        rs.FindFirst ("Info_PK = " & Me![cbo_Info_FK])
        rs.Edit
        rs!Info = NewData
        rs.Update
        Response = acDataErrAdded
Dies scheint jetzt auch zu funktionieren (zumindest in meiner Beispiel-DB), obwohl mich die Suche nach der richtigen Syntax von FindFirst mal wieder zur Verzweiflung gebracht hat (so wie in dem extrem unübersichtlichen Online-Hilfe-Beispiel funktionierte es nämlich nicht, d.h. die Klammern sind offenbar nötig und nur der erste Teil darf ein String sein Crying or Very sad ).
Code:
      Case vbCancel
        'Vorgang abbrechen
        Response = acDataErrContinue
Funktioniert nicht. Das Kombifeld bleibt offen und beim Klick in ein anderes Feld kommt wieder die MsgBox, d.h. das NotInList-Ereignis wird wieder aufgerufen.

Danke für das Beispiel, das hat mich in die richtige Richtung gelenkt.
Marmeladenglas
komme zurecht


Verfasst am:
05. Mai 2012, 18:22
Rufname:

AW: NotInList mit MsgBox steuern - AW: NotInList mit MsgBox steuern

Nach oben
       Version: Office 2003

Zitat:
d.h. die Klammern sind offenbar nötig und nur der erste Teil darf ein String sein ).
Die Klammern sind nicht notwendig.
Der ganze Ausdruck ist ein String.
MissPh!
Office-VBA-Programmiererin


Verfasst am:
05. Mai 2012, 19:13
Rufname:
Wohnort: NRW


AW: NotInList mit MsgBox steuern - AW: NotInList mit MsgBox steuern

Nach oben
       Version: Office 2003

Hallo,
Zitat:
Bei dieser verkürzten Version kommt die Fehlermeldung "Nicht in Liste"
hier fehlte das Anfügen des neuen Eintrags:
Code:
        Case vbYes
            'Neuen Datensatz anhängen
            CurrentDb.Execute "Insert Into tab_info (info) Values ('" & NewData & "')"
            Response = acDataErrAdded
Zitat:
Funktioniert nicht. Das Kombifeld bleibt offen und beim Klick in ein anderes Feld kommt wieder die MsgBox
nun, was man "funktionieren" nennt, kommt halt drauf an, was man bezweckt.

Hier ein Beispiel aus der Online-Hilfe:
Code:
    Else
    ' If user chooses Cancel, suppress error message
    ' and undo changes.
        Response = acDataErrContinue
        ctl.Undo
wobei ctl für das Kombifeld steht.
Hier wird also die Eingabe zurückgesetzt, sodass der falsche Wert nicht stehen bleibt und das Dropdown geschlossen wird.

BTW: Die Option "Überschreiben" halte ich für sehr fragwürdig bzw. gefährlich.
Ist dir klar, dass davon sämtliche bereits mit diesem Eintrag gespeicherten Datensätze betroffen sind?
Das solltest du wohl besser nicht zulassen.

_________________
Gruß MissPh!
Neues Thema eröffnen   Neue Antwort erstellen Alle Zeiten sind
GMT + 1 Stunde

Diese Seite Freunden empfehlen

Seite 1 von 1
Gehe zu:  
Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum nicht posten
Du kannst Dateien in diesem Forum herunterladen

Verwandte Themen
Forum / Themen   Antworten   Autor   Aufrufe   Letzter Beitrag 
Keine neuen Beiträge Access Tabellen & Abfragen: Individuelle Button-Beschriftung bei MsgBox 4 Gast 126 10. Okt 2013, 10:15
KlausMz Individuelle Button-Beschriftung bei MsgBox
Keine neuen Beiträge Access Tabellen & Abfragen: Wert in Tabelle prüfen und ggf. Msgbox 1 1748351 94 21. Dez 2012, 12:38
KlausMz Wert in Tabelle prüfen und ggf. Msgbox
Keine neuen Beiträge Access Tabellen & Abfragen: Problem mit Anfügeabfrage und NotInList 7 Gast 508 15. Mai 2011, 10:05
Willi Wipp Problem mit Anfügeabfrage und NotInList
Keine neuen Beiträge Access Tabellen & Abfragen: Where-Klausel in Abfrage über CheckBox steuern 4 db_fuzi 1233 17. Okt 2009, 18:25
db_fuzi Where-Klausel in Abfrage über CheckBox steuern
Keine neuen Beiträge Access Tabellen & Abfragen: Abfragekriterium über Formular steuern z.B. >0;<0;< 6 tigerentep 611 06. Sep 2009, 21:07
tigerentep Abfragekriterium über Formular steuern z.B. >0;<0;<
Keine neuen Beiträge Access Formulare: Abfrage via Formular steuern 4 d0minik 3003 03. Mai 2007, 11:29
Gast Abfrage via Formular steuern
Keine neuen Beiträge Access Formulare: msgbox soll nicht erscheinen, wenn alle textfelder leer sind 8 skater2301 702 24. Apr 2007, 21:21
skater2301 msgbox soll nicht erscheinen, wenn alle textfelder leer sind
Keine neuen Beiträge Access Formulare: Datenimportabfrage durch Msgbox ??? 1 rabie 408 20. Feb 2007, 12:25
rabie Datenimportabfrage durch Msgbox ???
Keine neuen Beiträge Access Formulare: MsgBox bei gleichen Werten einer in DB 1 Aphrob 496 18. Dez 2006, 16:08
xwest MsgBox bei gleichen Werten einer in DB
Keine neuen Beiträge Access Formulare: Info der MsgBox in Textfeld schreiben 1 Stefffano 916 25. Nov 2006, 09:21
magnum Info der MsgBox in Textfeld schreiben
Keine neuen Beiträge Access Formulare: Kann man eine Msgbox positioneren? 21 blicki 15098 01. Sep 2006, 01:17
Vielgelesen Kann man eine Msgbox positioneren?
Keine neuen Beiträge Access Formulare: Unterformulare über Filter steuern 0 Tatz 604 04. Aug 2006, 13:07
Tatz Unterformulare über Filter steuern
 

----> Diese Seite Freunden empfehlen <------ Impressum - Besuchen Sie auch: Macromedia Dreamweaver