Hallo zusammen,
ich bin Access Anfänger und muss eine Mitglieder Datenbank bearbeiten. Folgendes Problem:
Aus einer Suchfunktion bekomme ich Mitglieder Datensätze in einer Liste angezeigt.
Durch Doppelklick auf einem der Datensätze wird dieser in einer anderen Liste(Empfängerliste) angezeigt.
Die Datensätze der Empfängerliste will ich nun an Word senden zur Erstellung von Serienbriefe.
Gibt es da direkt einen Code für oder muss ich die Empfängerliste zuerst in einer neuen Tabelle oder Abfrage speichern, wenn ja wie?
Ich bin absoluter Neuling und habe nur kleines Grundwissen in Access/VBA.
Ich bin für jeden Tipp Dankbar!
Gruß
Hallo,
da würde ich mir erst mal die Frage stellen, ob hier Word notwendig ist.
Auch mit Access lassen sich Serienbriefe (als Bericht) realisieren.
Warum willst Du da Word ?
Was soll den in dem Serienbrief stehen ?
Hallo,
Zitat von: undefinedIch bin absoluter Neuling und habe nur kleines Grundwissen in Access/VBA.
dieses "kleine" Grundwissen (ohne zu wissen, wie klein des nun ist) solltest Du auf jeden Fall erweitern, bevor Du Dich mit der DB weiter auseinandersetzt (---> muss eine Mitglieder Datenbank bearbeiten)
Zudem sollte die Kommunikation auf den üblichen Bezeichnungen basieren, um Miss- oder Unverständnis zu vermeiden.
Z. B.: was ist bei Dir eine "Liste"? Datensätze können dargestellt werden mit der Tabellenansicht, Abfrageansicht, mit Formularen im Endlos- oder Datenblattansicht-Modus oder auch mit Berichten.
Es gibt ein "Listenfeld"-Steuerelement, das bestimmte Datensätze, bzw. Datensatzfelder in einem Form/Bericht anzeigen kann, entspr. der eingestellten Abfrage in dessen Eigenschaft "Datensatzherkunft".
Zitat von: undefinedDie Datensätze der Empfängerliste will ich nun an Word senden zur Erstellung von Serienbriefe.
Warum Word?
Es gibt wie immer, mehrere Wege, die nach Rom führen...
1) Händisch:Rechts-Klick auf eine Abfrage (im Navibereich) , die die gewünchten Daten liefert und unter "Exportieren/Word-Seriendruck" den Assistenten starten.
2) Access-VBA: Export der "Empfängerliste", ich nehme jetzt mal an, es handelt sich hierbei um eine Abfrage, mit der Transfertext-Methode in eine CSV-Datei, die als Steuerdatei für den Word-Serienbrief dient und damit anschließend unter Word ein Serienbrief (z. B. mit dem Sereinbrief-Assistenten) erstellt und gedruckt wird.
3) Händisch oder Word-VBA: Direkter Aufruf der Abfrage aus Word heraus durch den o. g. Serienbrief-Assistenten.
4) Access-VBA: Word-Automatisierung mit Access-VBA und benutzen der Word-MailMerge-Methode entspr. wie Punkt 1 oder 2.
4) Access-VBA: Word-Automatisierung mit Access-VBA und benutzen der Word-MailMerge-Methode entspr. wie Punkt 1 oder 2.
Genauso soll das funktionieren. Über die bestehende Suchfunktion werden die gesuchten Datensätze in einem Listenfeld angezeigt durch Doppelklick auf eines der Einträge wird ein zweites Listenfeld (von mir bereits eingebettet) gefüllt.
Idealerweise wäre wenn ich dann per Button die Datensätze aus dem Listenfeld an Word übergeben kann.
Es sollen die Mitgliederadressen an Word übergeben werden zur Erstellung der Serienbriefe.
Ich befinde mich in einem Ausbildungspraktikum und das ist ein kleines Projekt woran ich arbeiten und lernen soll.
Direkt über Word den Serienbrief zu erstellen(Händische Methode) hat leider nicht funktioniert da meine Datensatz selektierung nicht beibehalten bleibt. Word übernimmt immer wieder ALLE ca 30000 Einträge aus der Tabelle.
mit kleineren Datenbanken hat das funktioniert. Deshalb glaube ich das Word mit der großen Tabelle nicht klar kommt.
Hallo,
Zitatkleines Projekt woran ich arbeiten und lernen soll.
ok, dann schau Dir einige Tutorials zu Word-Automation oder Serienbrief aus Access generierien an.
Zitat(Händische Methode) hat leider nicht funktioniert
Das liegt vermutlich an der Art und Weise der Kriterien-Definition (Where-Condition).
Quick&Dirty: Speicher die gefilterten DS in eine Zwischentabelle. Diese Tabelle benutzt Du anstelle der Abfrage beim Word-Assistenten.
oder: wie Punkt 2.
Einige Links:
https://www.access-o-mania.de/forum/index.php?topic=20010.0
https://docs.microsoft.com/de-de/previous-versions/office/troubleshoot/office-developer/automate-word-create-mail-merge
https://microsoft.public.de.access.narkive.com/ODvPWJgB/word-serienbriefe-aus-access-starten
und einfach mal weiter mit einer Suchmaschine suchen...
Hallo,
die Frage, warum Word ist damit aber nicht beantwortet. Man kann auch mit Access direkt Serienbriefe erstellen, da braucht man kein Word. Access hat einen sehr leistungsfähigen Report Generator.
Was soll den in den Serienbriefen stehen (außer den Adressen ?
Ich schau mir das mal an mit den Berichten. Informationsbriefe eig nur Text und paar Bilder.
Zitat von: DF6GL am August 13, 2021, 15:18:25Quick&Dirty: Speicher die gefilterten DS in eine Zwischentabelle. Diese Tabelle benutzt Du anstelle der Abfrage beim Word-Assistenten.
oder: wie Punkt 2.
Kannst du mir da einen Tipp geben wie ich die Datensätze aus der Liste durchlaufen kann und in einer separaten Tabelle/Abfrage hinterlegen. Ich find leider nichts in der Suchmaschine
Gruß
Micha
Hallo,
nochmal: Was ist eine "Liste" bei Dir?
Die Liste wird vermutlich durch eine Abfrage mit Kriterium generiert (Abfrageansicht).
Mit Hilfe eines Insert Into -SQL-Statements (Anfügeabfrage) können die aus der ersten Abfrage stammenden Datensätze in einer separaten Tabelle abgelegt werden.
https://support.microsoft.com/de-de/office/insert-into-anweisung-e12fd58b-33b1-479c-8221-e9f245ab8d24
Insert Into tblTemp Select * From abf_DeineAuswahlabfrage
oder mit einer Tabellenerstellungsabfrage:
https://support.microsoft.com/de-de/office/select-into-anweisung-74d958dc-4b35-4b97-a7f7-72087e036d9c
SELECT * INTO tblTemp FROM abf_DeineAuswahlabfrage
Ich habe 2 Listenfeld Steuerelemente im Formular. Liste 1 wird durch die Suche gefüllt. Und durch Doppelklick auf einen der Einträge wird dieser Eintrag in die zweite Liste gefüllt. Wenn ich die zweite liste vervollständigt habe mit allen nötigen Empfängern, möchte ich per Button die Liste in eine Tabelle/Abfrage sichern und dann weiterverwenden.
Ich würde dann noch einen Button benötigen um die gefüllte Tabelle wieder zu leeren für weitere Serienbriefe mit anderen EmpfängernSie dürfen in diesem Board keine Dateianhänge sehen..
Vielen Dank für deine Mühe und Hilfe
Gruß
Micha
Hallo Micha,
ZitatUnd durch Doppelklick auf einen der Einträge wird dieser Eintrag in die zweite Liste gefüllt.
Wozu? Das Listfeld-Control stellt eine Eigenschaft "Mehrfachauswahl" (DeineListe.MultiSelect)
zur Verfügung. Wenn du diese auf "erweitert" stellst wird bei der Auswahl die Auflistung
"DeineListe.ItemsSelected" gefüllt. Diese kannst du dann mit einer Schleife durchlaufen
(Prinzip):
Dim vItem As Variant
For Each vItem In Me.DeineListe.ItemsSelected
'mach was mit dem DS
Next
gruss ekkehard
Hallo,
und ich verstehe die Geschiche immer noch nicht:
ZitatUnd durch Doppelklick auf einen der Einträge wird dieser Eintrag in die zweite Liste gefüllt.
OK, und wie wird das gemacht?
ZitatWenn ich die zweite liste vervollständigt habe mit allen nötigen Empfängern,
Und wie wird das gemacht? Wie vervollständigst Du einen Listenfeld-Eintrag (Datensatz) mit weiteren Daten (Empfänger)?
Oder meinst Du einfach nur, dass Einträge aus Listenfeld1 nach und nach ins Listenfeld2 kopiert werden?
Insofern ist der Vorschlag von Ekkehard der richtige Weg , um die Daten(sätze) aus Listenfeld2 in eine Tabelle zu bringen. ((VBA-Schleife mit Insert-Abfrage pro Listenfeld-Eintrag).
Lad mal die DB hier hoch, komprimiert/repariert und gezippt
Zitat von: DF6GL am August 16, 2021, 12:26:38Oder meinst Du einfach nur, dass Einträge aus Listenfeld1 nach und nach ins Listenfeld2 kopiert werden?
Ja so meine ich das :)
Sry, für die schlechte Erklärung des Problems. Ich versuche mal die schleife anzuwenden.
Ich kann die Datenbank nicht posten, einige sensible Daten sind hier hinterlegt.
Gruß
Micha
Hallo Franz,
Zitatum die Daten(sätze) aus Listenfeld2 in eine Tabelle zu bringen.
Vertippt?
Das zweite Listfeld ist doch obsolet.
gruss ekkehard
Hallo,
ja, natürlich wäre Listenfeld1 an sich richtig...
Wenn er aber 2 Listenfelder aus welchen Gründen auch immer haben will, dann eben Listenfeld2-Einträge übertragen...
Hallo,
Zitat von: undefined...Ich kann die Datenbank nicht posten, einige sensible Daten sind hier hinterlegt.
Man nehme eine Kopie oder ein Backup der DB, lösche alle Daten darin und füge ein paar anonymisierte
notwendige Daten hinein, damit die Helferchen an der Lösung mitarbeiten können.
@franz Na gut, der Gedanke ist nicht von der Hand zu weisen.
Kann IMO aber doch nur dazu dienen die Auswahl noch mal
visuell zu überprüfen.
Ausserdem benötigt die Liste2 ja auch eine DS-Herkunft,
am einfachsten die (temporäre?) Tabelle, die er für den
Serienbrief in Word benötigt.
Ansonsten müsste man Liste2 doch erst mit einer Werte-
liste füttern.
Oder sehe ich das falsch?
gruss ekkehard
Hallo,
nein, darum habe ich gefragt, wie er denn nun die Kombifeld-Einträge ins andere Kombifeld transportiert.
Seine Strategie, um an Serienbriefe zu kommen, ist mir nicht so recht klar. Die verschiedenen Lösungswege (einschließlich Access-Bericht) sind ja nun ausführlich erklärt worden.
Aber offensichtlich handelt es sich nur um "ein kleines Projekt woran ich arbeiten und lernen soll".
Hallo zusammen,
ich habe gar nicht gemerkt das der Verlauf auf der zweiten Seite weiterging (mein erstes Forum und erstes selbst eröffnetes Thema).Ich entschuldige mich dafür. Ich habe versucht die Db zu reduzieren und anonymisieren, aber da sind sooo viele Tabellen und Abfragen und Beziehungen (dateigröße 70MB) deshalb füge mal den Code zum Übertragen der Felder hinzu, vielleicht reicht es ja erstmal aus ansonsten versuche ich die db hier zu posten.
'Funktion zum Suchen der Mitglieder in Abhängigkeit des Textfeldes
Private Sub suchePerson()
Dim sql As String, geb As String, nummern As String
If Len(tbSucheGeb & "") = 0 Then
geb = ""
Else
geb = " AND (((tbPerson.datGeb) Like '*" & tbSucheGeb & "*')) "
End If
nummern = Format(tbSucheNummer, "000000")
If Len(nummern & "") = 0 Then
nummern = "*"
Else
nummern = nummern
End If
sql = "SELECT tbPerson.IDPerson, tbPerson_Mitgliedsnummer.txtNummer, tbPerson.txtNachname, tbPerson.txtVorname, tbPerson.datGeb, tb_Person_Kontakt.lngKontakt " & _
"FROM (tbPerson INNER JOIN tbPerson_Mitgliedsnummer ON tbPerson.IDPerson = tbPerson_Mitgliedsnummer.lngPerson) INNER JOIN tb_Person_Kontakt ON tbPerson.IDPerson = tb_Person_Kontakt.lngPerson " & _
"WHERE (((tbPerson_Mitgliedsnummer.txtNummer) Like '" & nummern & "'))" & _
" AND (((tbPerson.txtNachname) Like '" + tbSucheName + "*'))" & _
" AND (((tbPerson.txtVorname) Like '" + tbSucheVorname + "*'))" & _
geb & _
" GROUP BY tbPerson.txtNachname, tbPerson.txtVorname, tbPerson_Mitgliedsnummer.txtNummer, tbPerson.datGeb, tbPerson.IDPerson, tb_Person_Kontakt.lngKontakt;"
Me.lstSuche.RowSourceType = "Table/Query"
Me.lstSuche.RowSource = sql
Me.lstSuche.Requery
If lstSuche.ListCount = 0 Then
lblError.Visible = True
btnNew.Visible = True
Else
' lblError.Visible = False
' btnNew.Visible = False
End If
End Sub
'fügt gewählten Datensatz der IstEmpfaenger Liste zu
Private Sub lstSuche_DblClick(Cancel As Integer)
Dim i As Long
Dim s As String
For i = 0 To Me.lstSuche.ColumnCount - 2
s = s & Me.lstSuche.Column(i) & ";"
Next
s = s & Me.lstSuche.Column(i)
Me.lstEmpfaenger.AddItem (s)
End Sub
vielen Dank nochmals für eure Unterstützung
Beste Grüße
Micha
Hallo,
der Code ist etwas optimierungsfähig....
Ich versteh weiterhin nicht, warum ein ausgewählter Eintrag im Listenfeld "lstSuche" (auch mehrmals möglich) in ein anderes Listenfeld "lstEmpfaenger" (Wertliste, Felder : IDPerson, txtNummer, txtNachname, txtVorname) bei jedem Klick auf "lstSuche" übertragen werden soll, um zu einem Serienbrief zu kommen.
Zudem: Was genau funktioniert denn nicht mit dem Code (wenn man von der o. g. Optimierung, bzw. Korrekturen mal absieht).
Der Code funktioniert bisher,
die zweite liste dient dazu nochmal nachzusehen ob die Auswahl stimmt. Jetzt muss ich die Werte von lstEmpfaenger irgendwie in eine Tabelle ablegen damit ich diese Tabelle an Word senden kann.
was noch angepasst werden muss ist die Adresse mit zu übergeben und keine doppelwerte.
Beste Grüße
Micha
Hallo,
das ist doch alles viel zu umständlich.
Stelle das erste Listenfeld auf Mehrfachauswahl ein, markiere mit der Maus die gewünschten Einträge (die kannst Du doch auch hier gleich überprüfen) und erzeuge beim Klick-Event eines Buttons ("Generiere Steuerdatei") eine mit den IDs der ausgewählten Listenfeldeinträge filternde gespeicherte Abfrage, die mit Outputto in eine rtf-Datei (oder wegen mir auch eine csv-Datei) exportiert wird. Mit dieser Steuerdatei kann dann in Word der Serienbrief erzeugt werden.
Danke das hört sich vielversprechend an, ich versuch es umzusetzen.
Beste grüße
Micha
Hallo,
ist ein Serienbrief über Word überhaupt noch sinnvoll bei der Digitalisierungswelle?
Das ergibt doch nach wie vor einen großen Kostenfaktor bezgl. Papier-/Druck- und Brief-Versandkosten.
Dazu kommt der Personaleinsatz... und...und beim Versendenden.
Hier ein grober Alternativansatz
DIE SERIEN-EMail:
1. Viel einfacher und kostengünstiger wäre doch die Verwaltung von diversen Reports, welche jederzeit
erweitert werden können.
2. Die Möglichkeit, diese Reports als *.pdf in einem sinnvoll gestalteten Windows Explorer Ordnersystem
abzuspeichern.
3. In einer SerienEmail diese pdf-Dateien beliebig zusammengesuchten Kunden zu senden und diese Sendung
dabei zusätzlich in zwei 1:n Kontrolltabellen festzuhalten mit Datum, Sendungszweck, *.pdf-Name,
*.pdf-Dateiordner in Kontrolltabelle(A) auf Seite 1 und Kunden in Kontrolltabelle(B) auf Seite n der 1:n Beziehung
Wie gesagt, ein grober Alternativansatz, der jedenfalls überlegenswert ist.
Hallo,
@derArb: korrekt..
aber angesichts dieser Vorgabe/Situation:
ZitatEs sollen die Mitgliederadressen an Word übergeben werden zur Erstellung der Serienbriefe.
Ich befinde mich in einem Ausbildungspraktikum und das ist ein kleines Projekt woran ich arbeiten und lernen soll.
und der evtl. im Hintergrund angedachten Möglichkeit zur Serienbrief-Nachbearbeitung (das machen manche halt auch ;-) ) oder der situationsbedingten manuellen Erstellung der Word-Templates macht hier Word schon etwas Sinn.
Die Frage nach "Warum Word" wurde ja nicht so richtig beantwortet.... Auf alle Fälle wäre eine konzeptionelle Überarbeitung der Arbeitsabläufe, bzw. Vorgehensweise durchaus sinnvoll. Das geht aber über den reinen Access-Bereich etwas hinaus.
Guten Morgen,
zur Frage "warum Word".
Es werden immer wieder neue Serienbriefe erstellt, andere Formate, Bilder usw. Und die User sind nicht vertraut mit Access. Von daher sollen die nur eine Benutzeroberfläche bedienen. Ich weiß nicht ob es möglich ist ohne viel Programmierung Berichte erstellen und vernünftig gestalten zu können - wie mit Word.
Beste grüße
Micha
Zitat von: DF6GL am August 30, 2021, 15:03:21erzeuge beim Klick-Event eines Buttons ("Generiere Steuerdatei") eine mit den IDs der ausgewählten Listenfeldeinträge filternde gespeicherte Abfrage
das funktioniert so weit allerdings kann ich der qrySteuerdatei keine weiteren Datensätze zufügen. Die werden immer wieder überschrieben. Also ich suche nach einen Namen wähle die gewünschten Datensätze aus der Liste und übertrage die mithilfe des Buttons an die Abfrage(qrySteuerdatei). Jetzt suche ich den nächsten Namen und will dort einige Datensätze ebenfalls der Abfrage qrySteuerdatei hinzufügen um dann einem Zug die Abfrage(qrySteuerdatei) zu exportieren. leider werden die Daten immer wieder überschrieben.
Hier der Code:
Private Sub btnSteuerdatei_Click()
Dim db As DAO.Database
Dim qdf As DAO.QueryDef
Dim varItem As Variant
Dim str As String
Dim strSql As String
Set db = CurrentDb()
Set qdf = db.QueryDefs("qrySteuerdatei")
For Each varItem In Me!lstSuche.ItemsSelected
str = str & "," & Me!lstSuche.ItemData(varItem)
Next
If Len(str) = 0 Then
MsgBox "Sie haben keine Einträge aus der Liste gewählt" _
, vbExclamation, "Nichts gefunden!"
Exit Sub
End If
str = Right(str, Len(str) - 1)
strSql = "SELECT * FROM tbPerson" & _
" WHERE tbPerson.IDPerson IN(" & str & ");"
qdf.sql = strSql
DoCmd.OpenQuery "qrySteuerdatei"
Set db = Nothing
Set qdf = Nothing
End Sub
Beste Grüße
Micha
Hallo,
@DF6GL: Du hast recht. Es bleibt als letztes Argument gegen Serienbriefe die Porto-Gebühr.
@Macik: Ich hab Dir mal ein Beispiel einer funktionierenden DB erstellt, aus welcher heraus man
Serienbriefe erstellen kann. Es wird ein Endlosformular verwendet mit diversen Markierungsmöglichkeiten
über Kontrollkästchen und nicht Listenfeldern.
Beigefügt sind 2 Wordvorlagen, mit welchen Du die Funktionalität testen kannst. Sie müssen im Verzeichnis
der DB sein, was in der Funktion aktVerz() festgelegt und natürlich auch änderbar ist.
Ausserdem hab ich eine kurze Erklärung als Wordfile beigefügt.Sie dürfen in diesem Board keine Dateianhänge sehen.
Wowwww Mega. Vielen lieben Dank derArb
ich versuche mal alles nachzuvollziehen und in meiner Db einzubringen, echt klasse. Sieht super Hammer aus.
Danke für die mühe :-)
Liebe Grüße
Micha
Hallo,
die 'Access_Serienbrief_Erklärung.doc' ist eine ältere Version und leider nicht angepasst.
Die SQL-Statements habe ich in dem Beispiel sehr viel per VBA erstellt.... Sorry.
Hallo,
natürlich wird es immer interessanter, wenn die DB auch eine Verfolgungsmöglichkeit (Tracking) bietet.
Daher hab ich noch nachgearbeitet, so daß man eine Liste pro Kunde hat,
welche sowohl die Wordvorlage (inkl. Pfad), als auch das Druckdatum (bzw. Versanddatum) erstellt und jedesmal
abspeichert und anzeigt.
Viel Spass!!!
Hallo,
es ist inzwischen in einem anderen Posting (Thread) weitergehend diskutiert worden und
die Demo DB stark ausgebaut worden....
Siehe hier
https://www.access-o-mania.de/forum/index.php?topic=25726.0