Hallo Leute,
ich habe ein Problem, dass ich mit nicht erklären kann. Dieser Fehler tritt nur manchmal und nicht auf allen PC auf. Manchmal ist das falsche Formular aktiv. Aber warum?
Ich öffne ein Erfassungsformular aus meinem Hauptformular mit folgendem Aufruf:
Private Sub cmdNeues_Mitglied_Click()
DoCmd.OpenForm "frmMitglieder_Erfassung", , , , acFormAdd, acDialog
Me.Requery
DoCmd.GoToRecord , , acLast
End Sub
Wenn alle Felder gefüllt sind, möchte ich die Daten übernehmen und öffne gleichzeitig eine Word-Datei mit folgendem Code:
Private Sub cmdMitglied_uebernehmen_Click()
If IsNull(Me!Geschlecht) Or IsNull(Me!Anrede) Or IsNull(Me!Ansprache) _
Or IsNull(Me!Nachname) Or IsNull(Me!Straße) Or IsNull(Me!PLZ) _
Or IsNull(Me!Ort) Or IsNull(Me!Zahlungsart) _
Or IsNull(Me!Eintritt) Or IsNull(Me!Mitgliedsstatus) Then
MsgBox "Es sind nicht alle Pflichtfelder gefüllt.", 64
ElseIf Me.Geschlecht = "f" And Me.Anrede <> "Damen und Herren" _
Or Me.Geschlecht = "g" And Me.Anrede <> "Herr und Frau" _
Or Me.Geschlecht = "m" And Me.Anrede <> "Herr" _
Or Me.Geschlecht = "w" And Me.Anrede <> "Frau" Then
MsgBox "Das Geschlecht und die Anrede stimmen nicht überein.", 64
Geschlecht.SetFocus
ElseIf Me.Anrede = "Damen und Herren" And Me.Ansprache <> "Firma" _
Or Me.Anrede = "Herr und Frau" And Me.Ansprache <> "Herrn und Frau" _
Or Me.Anrede = "Herr" And Me.Ansprache <> "Herrn" _
Or Me.Anrede = "Frau" And Me.Ansprache <> "Frau" Then
MsgBox "Die Anrede und die Ansprache stimmen nicht überein.", 64
Anrede.SetFocus
ElseIf Me.Zahlungsart = "E" And IsNull(Me.Kontonummer) Then
MsgBox "Es muss eine Kontonummer hinterlegt werden.", 64
Kontonummer.SetFocus
ElseIf Not IsNull(Me.Kontonummer) And IsNull(Me.Kontoinhaber) Then
MsgBox "Es muss eine Kontoinhaber hinterlegt werden.", 64
Kontoinhaber.SetFocus
ElseIf IsNull(Me.BLZ) Then
MsgBox "Es muss eine Bankleitzahl hinterlegt werden." & vbNewLine & _
"Alternativ Bankleitzahl 000 000 00 hinterlegen.", 64
BLZ.SetFocus
ElseIf Not IsNull(Me.Austritt) And Me.Mitgliedsstatus = "Aktiv" Then
MsgBox "Ein ausgetretenes Mitglied kann nicht mehr aktiv sein.", 64
[Mitgliedsstatus].SetFocus
ElseIf IsNull(Me.Austritt) And Me.Mitgliedsstatus = "ausgetreten" Then
MsgBox "Es muss ein Austrittsdatum hinterlegt werden", 64
[Austritt].SetFocus
Else
DoCmd.RunCommand acCmdSaveRecord
Dim db As Database
Set db = CurrentDb
Dim objword As Object
Dim worddoc As Object
Dim VORLAGE As String
Dim Titel As String
Dim zusatz As String
Dim Datum_Heute As Date
Dim Datum_Ziel As Date
' aktuelles Tagesdatum
Datum_Heute = Date
' Mitgliedsnummer ermitteln
customer = Me.MitgliedsNr
Set objword = CreateObject("Word.Application")
' Öffnen der Vorlagedatei
VORLAGE = CurrentProject.Path & "/Vorlagen/Begruessung1.0.dotx"
Set worddoc = objword.Documents.Add(Template:=VORLAGE)
' Beginnen, die einzelnen Bookmarks zu füllen
objword.Visible = True
With worddoc
.bookmarks("Mitgliedsnummer").range = customer
' Empfängerfeld füllen
.bookmarks("Anrede").range = Nz(Me.Ansprache, "")
If IsNull(Me.Titel) Then
.bookmarks("Vorname").range = Nz(Me.Vorname, "")
Else
Titel = Me.Titel & " "
.bookmarks("Vorname").range = Nz(Titel, "") & Nz(Me.Vorname, "")
End If
If Not IsNull(Me.Prädikat) Then
zusatz = Me.Prädikat & " "
.bookmarks("Nachname").range = Nz(zusatz, "") & Nz(Me.Nachname, "")
Else
.bookmarks("Nachname").range = Nz(Me.Nachname, "")
End If
.bookmarks("Straße").range = Nz(Me.Straße, "")
.bookmarks("Postleitzahl").range = Nz(Me.PLZ, "")
.bookmarks("Ort").range = Nz(Me.Ort, "")
.bookmarks("Datum").range = Nz(Datum_Heute, "")
' Ansprache definieren
If (Me.Anrede = "Damen und Herren") Then
.bookmarks("Ansprache").range = "Sehr geehrte " & Nz(Me.Anrede, "") & ","
ElseIf (Me.Anrede = "Frau") Then
.bookmarks("Ansprache").range = "Sehr geehrte " & Nz(Me.Anrede, "") & " " & Nz(Titel, "") & Nz(zusatz, "") & Nz(Me.Nachname, "") & ","
ElseIf (Me.Anrede = "Herr") Then
.bookmarks("Ansprache").range = "Sehr geehrter " & Nz(Me.Anrede, "") & " " & Nz(Titel, "") & Nz(zusatz, "") & Nz(Me.Nachname, "") & ","
ElseIf (Me.Anrede = "Herr und Frau") Then
.bookmarks("Ansprache").range = "Sehr geehrter " & Nz(Me.Anrede, "") & " " & Nz(zusatz, "") & Nz(Me.Nachname, "") & ","
Else
MsgBox "Fehler! Keine Anrede hierfür formuliert", 16
End If
' Zieldatum ermitteln
Datum_Ziel = DateAdd("d", 14, Datum_Heute)
.bookmarks("Zieldatum").range = Nz(Datum_Ziel, "")
' Einzugsermächtigung füllen
If IsNull(Me.Titel) Then
.bookmarks("Vorname2").range = Nz(Me.Vorname, "")
Else
Titel = Me.Titel & " "
.bookmarks("Vorname2").range = Nz(Titel, "") & Nz(Me.Vorname, "")
End If
If Not IsNull(Me.Prädikat) Then
zusatz = Me.Prädikat & " "
.bookmarks("Nachname2").range = Nz(zusatz, "") & Nz(Me.Nachname, "")
Else
.bookmarks("Nachname2").range = Nz(Me.Nachname, "")
End If
.bookmarks("Straße2").range = Nz(Me.Straße, "")
.bookmarks("Postleitzahl2").range = Nz(Me.PLZ, "")
.bookmarks("Ort2").range = Nz(Me.Ort, "")
.bookmarks("Mitgliedsnummer2").range = Nz(customer, "")
If IsNull(Me.Titel) Then
.bookmarks("Vorname3").range = Nz(Me.Vorname, "")
Else
Titel = Me.Titel & " "
.bookmarks("Vorname3").range = Nz(Titel, "") & Nz(Me.Vorname, "")
End If
If Not IsNull(Me.Prädikat) Then
zusatz = Me.Prädikat & " "
.bookmarks("Nachname3").range = Nz(zusatz, "") & Nz(Me.Nachname, "")
Else
.bookmarks("Nachname3").range = Nz(Me.Nachname, "")
End If
.bookmarks("Straße3").range = Nz(Me.Straße, "")
.bookmarks("Postleitzahl3").range = Nz(Me.PLZ, "")
.bookmarks("Ort3").range = Nz(Me.Ort, "")
.bookmarks("Ort4").range = Nz(Me.Ort, "")
End With
objword.Visible = True
Set worddoc = Nothing
Set objword = Nothing
DoCmd.Close
End If
End Sub
In der vorletzten Zeile habe ich den Befehl "doCmd.close", der manchmal leider das falsche Formular schließt. Ist der Aufruf nicht sauber geschrieben, oder warum kann das passieren, oder ist das ein MS-Problem???
Hallo,
benutze besser:
DoCmd.Close acForm, Me.Name
wenn dasjenige Formular geschlossen werden soll, in dem der akt. Code abläuft. , ( Prozedur "cmdMitglied_uebernehmen_Click" in Form "frmMitglieder_Erfassung")
btw: die NZ()-Funktion kann/braucht nur auf Variablen von Datentyp Variant angewendet werden. "Datum_Ziel" hat den Datentyp "Datum/Uhrzeit" , ähnlich bei "zusatz" vom Datentyp "Text" , was u. U. zu einem Laufzeitfehler führt.
weiterhin kann
DoCmd.GoToRecord , , acLast
den falschen Datensatz (nicht das soeben erfasste Mitglied ) liefern, je nachdem, wie die Datenherkunft des Hautforms gestaltet ist. Besser wäre, die neu erstellte MitgliedNr zur Positionierung auf den richtigen DS heranzuziehen.
Hallo,
vielen Dank für die Tipps erst einmal, werde das erste mal testen und das zweite gleich abändern.
zu Drittens: muss ich das über findFirst machen, oder wie?
Also z.B.
Forms.frmMitglieder.Recordset.FindFirst "[MitgliedsNr]=" & Den_aus_der_Erstellung_übergebenen_String
Edit:
entfernt
Hallo,
ja, wenn Du den Datensatzzeiger positioneren willst.
Aber dann so:
in einem Standardmodul:
Public plngMitgliedNr as Long
im Form "frmMitglieder_Erfassung":
.
.
.
Set objword = Nothing
plngMitgliedNr = Me!MitgliedNr
DoCmd.Close acForm, Me.Name
End If
Private Sub cmdNeues_Mitglied_Click()
DoCmd.OpenForm "frmMitglieder_Erfassung", , , , acFormAdd, acDialog
Me.Requery
Me.Recordset.Findfirst "MitgliedsNr= " & plngMitgliedNr
End Sub