Datenaktualisierung aus Formular mit Hilfe eines Moduls (VBA)

Peter_ @, Mittwoch, 20.01.2016, 16:01 (vor 1419 Tagen)

Hallo, ich habe ein Problem - klar.
Vielleicht findet sich jemand, der mir helfen kann?

Ich arbeite mit Windows7 / Access2007.
Das Problem: Wie ändere ich Daten in einer Tabelle aus einer Formulareingabe heraus mit Hilfe einer Prozedur (Sub/Function) in einem Modul.
(Erläuterung dieses langen Satzes weiter unten :-)).

Beschreibung:
In dem Eingabeformular einer Tabelle mit Adressen werden die üblichen Adressdaten erfasst (Name und Anschrift).
Nach Verlassen der Eingabefelder im Formular (z.B. Feld 'Anrede') sollen einige Daten überprüft und ggf. verändert werden.
Das funktioniert bei der Prozedur direkt im Formular problemlos (s. nachstehende Beispiele 1 und 2).

Beispiel 1 - Feld 'Anrede':
------------------------------------
Private Sub Anrede_Exit(Cancel As Integer)
If Trim(Me.Anrede.Value) = "Herr" Then
Me.Anrede.Value = "Herrn"
Else
If Trim(Me.Anrede.Value) = "Frau" Then
Me.Anrede.Value = "Frau"
Else
If Len(Trim(Me.Nachname.Value)) > 0 Then
Me.Anrede.Value = "Frau/Herrn"
End If
End If
End Sub

Beispiel 2 - Feld 'Briefanrede':
------------------------------------------
Private Sub Nachname_Exit(Cancel As Integer)
If Trim(Me.Anrede.Value) = "Herrn" Then
Me.BriAnred.Value = "Sehr geehrter Herr"
Else
If Trim(Me.Anrede.Value) = "Frau" Then
Me.BriAnred.Value = "Sehr geehrte Frau"
Else
If Len(Trim(Me.Nachname.Value)) > 0 And IsNull(Me.Anrede.Value) Then
Me.BriAnred.Value = "Sehr geehrte Damen und Herren"
Else
Me.BriAnred.Value = "Sehr geehrte Damen und Herren"
End If
End If
End If

Erläuterung:
Da diese Prozeduren auch von anderen Stellen aufgerufen werden sollen, möchte ich diese nicht im Formular speichern sondern in einem separaten Modul.
Das heißt, jedesmal, wenn eines der Formular-Eingabefelder verlassen wird, sollen die Prozeduren abgearbeitet werden.
Zum Beispiel: Wenn ich den Nachnamen ändere, soll beim Verlassen des Feldes Nachname automatisch die Briefanrede ('Sehr geehrter Herr Muster') in diesem einen Datensatz aktualisiert werden.

In einer anderen Variante habe ich das Problem wie folgt gelöst:
Beim Anklicken einer Schaltfläche eines Formulars wird die gesamte Adressdatei in gewünschter Weise bearbeitet (s. nachstehendes Listing - hier nur der Anfang der ganzen Prozedur).
---------------------------------------------------
Option Compare Database
Option Explicit
---
Function AnredenGesamt(Anrede, Titel, Vorname, Nachname, AnsprPa, BriefAnr)
Dim dbs As Database, rst As Recordset
Set dbs = CurrentDb
Set rst = dbs.OpenRecordset("tblAdress")
rst.MoveFirst

Do Until rst.EOF
If Trim(Anrede) = "Herrn" Or Trim(Anrede) = "Herr" Then
Anrede = "Herrn"
Else
If Trim(Anrede) = "Frau" Then
Anrede = "Frau"
Else
If Len(Trim(Nachname)) > 0 And IsNull(Anrede) Then
Anrede = "Frau/Herrn"
End If
End If
End If
... ... ... usw.
--------------

Es geht also irgendwie nur um die richtige Syntax:
Wie bringe ich (z.B.) die Funktion "Nachname_Exit" des Formulares dazu, in dem aktuellen Datensatz das Feld 'Ansprechpartner' im Formular (und somit in der Tabelle) mit dem gewünschten String zu füllen?

Ich habe schon viele Varianten ausprobiert, fürchte aber, dass ich weit daneben liege - und hoffe jetzt auf einen Tipp ...
Gruß und danke schonmal vorab - Peter

Datenaktualisierung aus Formular mit Hilfe eines Moduls

Martin Asal @, Mittwoch, 20.01.2016, 20:48 (vor 1419 Tagen) @ Peter_

Hallo Peter,

Erstelle ein neues Modul. Darin eine neue Function:

Public Function NeueAnrede(Anrede As String, Nachname As String) As String
 
NeueAnrede = Trim(Anrede)
 
Select Case NeueAnrede  
  Case "Herr"
    NeueAnrede = "Herrn"
  Case "Frau"
  Case Else
    If Len(Trim(Nachname)) > 0 Then NeueAnrede = "Frau/Herrn"
End Select
 
End Function

Dein Formularmodul änderst du wie folgt:

Private Sub Anrede_Exit(Cancel As Integer)
  Anrede = NeueAnrede(Me.Anrede, Me.Nachname)
End Sub

Nebenbei bemerkt, frage ich mich, ob es sinnvoll ist, diese Angaben als Text zu speichern. Ich würde zumindest in die Überlegungen einbeziehen, ob eine Tabelle sinnvoll wäre, mit folgendem Inhalt:

ID Anrede
1  Herrn
2  Frau
3  Herrn/Frau

Das könntest du dann z.B. um "Firma" erweitern. Davon abgesehen, sind Zahlen immer performanter als Text.

Gruß aus Rüsselsheim
Martin

Datenaktualisierung aus Formular mit Hilfe eines Moduls

Peter_ @, Donnerstag, 21.01.2016, 11:31 (vor 1418 Tagen) @ Martin Asal

Hallo Martin,

herzlichen Dank für die schnelle und detaillierte Hilfe!
Ich hatte schon vermutet, dass es eine 'einfache' Lösung gibt - aber die Syntax... immer wieder ein Problem für mich.

Nur ein kleiner 'Wermutstropfen':
Beim Verlassen des Feldes 'Anrede' ('Anrede_Exit') kommt folgende Fehlermeldung:
Laufzeitfehler '94': Unzulässige Verwendung von Null

Diese Fehlermeldung kommt in zwei Fällen:
(bei neuen und bestehenden Datensätzen)
- Feld Nachname ist leer
- Feld Anrede ist leer

Hier nochmal die aktuellen Prozeduren:
Public Function NeueAnrede(xAnrede As String, xNachname As String) As String
NeueAnrede = Trim(xAnrede)
Select Case NeueAnrede
Case "Herr", "Herrn"
NeueAnrede = "Herrn"
Case "Frau"
'
Case Else
If IsNull(xNachname) Or xNachname = "" Then
'Anm.: Versuch, NULL-Wert auszublenden
Else
If Len(Trim(xNachname)) > 0 Then
NeueAnrede = "Frau/Herrn"
End If
End If
End Select
End Function

Private Sub Anrede_Exit(Cancel As Integer)
Anrede = NeueAnrede(Me.Anrede, Me.Nachname)
End Sub

-------

Dieses Problem trat nicht auf, als dies (in alter Form) komplett im Formular verarbeitet wurde.
Vieleicht hast du dafür auch einen "einfachen" :-) Tipp?

=================

Deiner Anmerkungen zur Anrede-Kodierung (Ziffern statt Text) stimme ich grundsätzlich zu.
In diesem Fall gibt es (außer ein wenig Bequemlichkeit) noch einen anderen Grund:
Ich gebe öfter einmal Adressen weiter (exportieren nach Excel) und da ist es einfach praktischer für die Empfänger, wenn die Anreden im Klartext drinstehen. Bei einer 'richtigen' programmierten Anwendung ist das mit der Ziffernkodierung natürlich optimaler.

Danke und Gruß
Peter

Datenaktualisierung aus Formular mit Hilfe eines Moduls

Martin Asal @, Donnerstag, 21.01.2016, 11:58 (vor 1418 Tagen) @ Peter_

Private Sub Anrede_Exit(Cancel As Integer)
  Anrede = NeueAnrede(Nz(Me.Anrede), Nz(Me.Nachname))
End Sub

Martin

Datenaktualisierung aus Formular mit Hilfe eines Moduls

Peter_, Donnerstag, 21.01.2016, 12:35 (vor 1418 Tagen) @ Martin Asal

Hallo Martin,
das klappt wunderbar!
Das mit 'Nz...' kannte ich noch gar nicht, nur 'IsNull...'.

Vielen vielen Dank, das hat mir super geholfen.
Jetzt kann ich endlich wieder loslegen ...

Danke und Grüße aus GG
Peter

RSS-Feed dieser Diskussion
powered by my little forum