[Word] Serienbrief mit Filterauswahl erstellen


josef24

Erfahrenes Mitglied
Hallo in die Runde. Ich hätte mal eine Frage zu WORD Serienbrief erstellen und dabei eine Filterfunktion nutzen. Habe mit VISUAL BASIC einen gewissen Teil erstellen können, aber das mit dem Filter einbauen will mir nicht gelingen. Folgender Faktoren haben Einfluss auf den Kode:
Die Datei ist Koeln.xls, die Tabelle ist Tabelle1, die Gruppe ist die Spalte (7) worin ein Filter gesetzt wird, und gefiltert werden ausschließlich Zahlen.
Wenn ich den Kode ausführe, meckert er bei "&Filter&", er markiert das Wort blau und gibt den Fehlertext "Fehler beim Kompilieren, Argument ist nicht optional". Hat da jemand eine Lösung und kann mir ein Beispiel liefern, ich bin hier mit meinem Wissen am Ende. Für eure Unterstützung Danke und Gruß Josef

Code:
Option Explicit
Sub koeln_neu()
'
Dim Gruppe As Variant
'    Selection.TypeText Text:="Koeln"
'    Selection.TypeText Text:="Sehr geehrte Damen und Herren,"
    ActiveDocument.ToggleFormsDesign
    ActiveDocument.MailMerge.MainDocumentType = wdFormLetters
    ActiveDocument.MailMerge.OpenDataSource Name:= _
        "C:\Users\Besitzer\Desktop\koeln.xls", ConfirmConversions:=False, ReadOnly:=False, LinkToSource:=True, AddToRecentFiles:=False, _
        PasswordDocument:="", PasswordTemplate:="", WritePasswordDocument:="", WritePasswordTemplate:="", Revert:=False, Format:=wdOpenFormatAuto, _
        Connection:= _
        "Provider=Microsoft.ACE.OLEDB.12.0;User ID=Admin;Data Source=C:\Users\Besitzer\Desktop\koeln.xlsx;Mode=Read;Extended Properties=""HDR=YES;IMEX=1;"";Jet OLEDB:System database="""";Jet OLEDB:Registry Path="""";Jet OLEDB:Engine Type=37""""" _
         , SQLStatement:="SELECT * FROM `Tabelle1$` where `Gruppe` = " & filter & "", SQLStatement1:="", SubType:=wdMergeSubTypeAccess
    Selection.MoveUp Unit:=wdLine, Count:=4
    Selection.TypeParagraph
    Selection.TypeParagraph
    ActiveDocument.Fields.Add Range:=Selection.Range, Type:=wdFieldMergeField _
        , Text:="""Anrede"""
    ActiveDocument.Fields.Add Range:=Selection.Range, Type:=wdFieldMergeField _
        , Text:="""Vorname"""
    ActiveDocument.Fields.Add Range:=Selection.Range, Type:=wdFieldMergeField _
        , Text:="""Nachname"" \m"
    ActiveDocument.Fields.Add Range:=Selection.Range, Type:=wdFieldMergeField _
        , Text:="""Straße"""
    ActiveDocument.Fields.Add Range:=Selection.Range, Type:=wdFieldMergeField _
        , Text:="""PLZ"""
    ActiveDocument.Fields.Add Range:=Selection.Range, Type:=wdFieldMergeField _
        , Text:="""Wohnort"""
    Selection.TypeParagraph
    ActiveDocument.MailMerge.ViewMailMergeFieldCodes = wdToggle
    ActiveDocument.MailMerge.DataSource.ActiveRecord = wdNextRecord
    ActiveDocument.MailMerge.DataSource.ActiveRecord = wdNextRecord
End Sub
 

Yaslaw

n/a
Moderator
Filter ist ein wahrscheinlich im Word-VBA ein geschützter Name den man darum nicht für Variablen verwenden sollte.

Zudem hast du die Variable auch nirgends definiert.
 

josef24

Erfahrenes Mitglied
Danke für den Hinweis, passt dann natürlich. Nur wird der Anschriften Block beginnend in die erste Zeile eingefügt. Kann man auch den Beginn hierfür z. B. in Zeile 6 im Kode bestimmen? Ein Beispiel hierfür wäre natürlich von Vorteil. Gruß Josef
 

Yaslaw

n/a
Moderator
Die erste Zeile ist Option Explicit.
Da ist kein Anschriftblock.
Und was du mit Zeile 6 (ActiveDocument.ToggleFormsDesign) bestimmen willst, verstehe ich auch nicht.
 

josef24

Erfahrenes Mitglied
  1. Danke, habe zwischenzeitlich den Kode verändert / ergänzt, sodass der Serienbrief fast makellos erscheint. Verstehe nicht, warum ich beim Ausführen nochmal die entsprechende Datei anwählen muss.
  2. Dann wären da noch in der folgenden Option Tabelle, Ansicht, Systemtabellen und Synonyme auszuwählen, könnte das nicht bereits im Kode geschehen.
  3. Einziger für mich derzeit erkennbarer Fehler ist: Zwischen PLZ und Ort hat sich bei jedem Datensatz eine 0 gesetzt, weis allerdings nicht warum und was ich tun müsste.
  4. Des Weiteren hatte ich mir vorgestellt eine Filtervorgabe zu erhalten, wo ich aus der Spalte "Gruppe" zwischen den Zahlen 1 bis 20 jeweils auswählen hätte können. Danke, insbesondere wenn ich zu den Fragen vielleicht nochmal Unterstützung erhalten könnte? Gruß Josef
  5. Code:
    Sub koeln_neu()
    Dim Gruppe As Variant
    Dim Filter '  As String
    '    ActiveDocument.ToggleFormsDesign
    '    ActiveDocument.MailMerge.MainDocumentType = wdFormLetters
     ActiveDocument.MailMerge.OpenDataSource Name:= _
      "C:\Users\Besitzer\Desktop\koeln.xls", ConfirmConversions:=False, ReadOnly:=False, LinkToSource:=True, AddToRecentFiles:=False, _
      PasswordDocument:="", PasswordTemplate:="", WritePasswordDocument:="", WritePasswordTemplate:="", Revert:=False, Format:=wdOpenFormatAuto, _
        Connection:= _
        "Provider=Microsoft.ACE.OLEDB.12.0;User ID=Admin;Data Source=C:\Users\Besitzer\Desktop\koeln.xlsx;Mode=Read;Extended Properties=""HDR=YES;IMEX=1;"";Jet OLEDB:System database="""";Jet OLEDB:Registry Path="""";Jet OLEDB:Engine Type=37""""" _
        , SQLStatement:="SELECT * FROM `Tabelle1$` where `Gruppe` = " & Filter & "", SQLStatement1:="", SubType:=wdMergeSubTypeAccess
          Selection.MoveUp Unit:=wdLine, Count:=4
        
        Selection.TypeText Text:="Sportgruppe Köln"
        
        Selection.TypeParagraph ' Bedeutet Leerzeile
        Selection.TypeParagraph ' Bedeutet Leerzeile
        Selection.TypeParagraph ' Bedeutet Leerzeile
        Selection.TypeParagraph ' Bedeutet Leerzeile
        ActiveDocument.Fields.Add Range:=Selection.Range, Type:=wdFieldMergeField, Text:="""Anrede"""
        Selection.TypeParagraph ' Bedeutet Leerzeile
        ActiveDocument.Fields.Add Range:=Selection.Range, Type:=wdFieldMergeField, Text:="""Vorname"""
        ActiveDocument.Fields.Add Range:=Selection.Range, Type:=wdFieldMergeField, Text:="""Nachname"""
        Selection.TypeParagraph ' Bedeutet Leerzeile
        ActiveDocument.Fields.Add Range:=Selection.Range, Type:=wdFieldMergeField, Text:="""Straße"""
         Selection.TypeParagraph ' Bedeutet Leerzeile
        ActiveDocument.Fields.Add Range:=Selection.Range, Type:=wdFieldMergeField, Text:="""PLZ"""
        ActiveDocument.Fields.Add Range:=Selection.Range, Type:=wdFieldMergeField, Text:="""Wohnort"""
        Selection.TypeParagraph ' Bedeutet Leerzeile
        Selection.TypeParagraph ' Bedeutet Leerzeile
        Selection.TypeParagraph ' Bedeutet Leerzeile
        
        Selection.TypeText Text:="Sehr geehrte Damen und Herren,"
    
        ActiveDocument.MailMerge.ViewMailMergeFieldCodes = wdToggle
        ActiveDocument.MailMerge.DataSource.ActiveRecord = wdNextRecord
        ActiveDocument.MailMerge.DataSource.ActiveRecord = wdNextRecord
    End Sub
 

josef24

Erfahrenes Mitglied
Hallo, zu so später Stunde. Habe mich nochmal mit meiner Serienbrief-Funktion beschäftigt, und im Netz eine Variante entdeckt die mein Vorhaben abdecken könnte. Mein Problem dabei ist: Die EXCEL Datei woraus ich die Adresse zusammenstelle wird nicht erkannt. So z. B. :
Code:
C:\Users\Besitzer\Desktop\koeln.xls
. Das Problem ist wohl offensichtlich in dem Erkennen des "pfades" in Zeile 3. Ist meine Vorgehensweise bezüglich Einbindens der EXCEL Datei nicht komplett?
Vielleicht kann mich jemand mit einem Beispiel unterstützen. Gruß Josef

Der Kode gesamt sieht bei mir jetzt so aus:

Code:
Option Explicit

Sub Makro_neu()
Dim pfad As String, filter As Variant, Eingabe As String
pfad = ThisDocument.Path & "\Koeln.xls"
With ActiveDocument.MailMerge
    .MainDocumentType = wdFormLetters
    'Filter aus der Spalte "Gruppe"
    ' filter = 2
       Eingabe = InputBox(Title:="Auswahl der betroffenen Gruppe", Prompt:="Geben Sie die Nummer der Gruppe ein:", Default:="Information hier eingeben")

    .OpenDataSource Name:= _
        pfad, LinkToSource:=True, Revert:=False, _
        Format:=wdOpenFormatAuto, Connection:= _
        "Provider=Microsoft.ACE.OLEDB.12.0;Data Source= " & pfad & ";Mode=Read;Extended Properties=""HDR=YES;IMEX=1;"";Jet OLEDB:System database="""";Jet OLEDB:Registry Path="""";Jet OLEDB:Engine Type=37" _
        , SQLStatement:="SELECT * FROM `Tabelle1$` where `Gruppe` = " & Eingabe & "", SQLStatement1:="", SubType:= _
        wdMergeSubTypeAccess
       ' Criteria1:=Filter, Type:=1)
End With
End Sub
 

josef24

Erfahrenes Mitglied
Danke, der Kode zielt auf folgenden Path, den ich ja nicht vorgegeben habe. Ich bräuchte Unterstützung weil ich da nicht mehr weiter weis. Gruß Josef
Auch bei den Datenverknüpfungseigenschaften erscheint diese Pathangabe.
Code:
C:\Users\Besitzer\AppData\Roaming\Microsoft\Templates\Koeln.xls
 

Yaslaw

n/a
Moderator
Ist das der Pfad den du haben willst, oder der Pfad der WIRKLICH in ThisDocument.Path & "\Koeln.xls" steht?
Lass dir das mil mit debug.print ausgeben, oder noch besser, setz dir ein BrakPiont und schau im Debugger was da in path drin steht.
 

josef24

Erfahrenes Mitglied
Danke, ja das ist der Pfad der mir angezeigt wird, und was wahrscheinlich der Grund ist warum ich nicht weiter komme. Weis aber nicht wie ich die Datei dort abgespeichert haben sollte. Wenn ich meinen wirklichen Pfad:
Code:
C:\Users\Besitzer\Desktop\Koeln.xls
eingebe wird der erkannt, aber nicht in den Kode übernommen. Mal eine einfache Frage dazu, kann man nicht mit dem tatsächlichen Pfad auf die EXCEL Tabelle zugehen, das wäre für mein Verständnis doch wesentlich einfacher.
 

Yaslaw

n/a
Moderator
Kann man machen. Spricht nichts dagegen. ThisDocument.Path gibt wahrscheinlich den Pfad der aktuellen Dokumentes im dem sich der VBA-Teil befindet.
Das hast du ja weiter oben schon gemacht, einfach den ganzen Pfad angeben.

Ganz ehrlich, ohne eine Ahnung deiner Struktur und einer Angabe was mit "Pfad eingebe" gemeint ist, denn in deinem Code ist keine Eingabe da, kann ich ganz schlecht helfen. Das einzige was ich verstehe, ist dass du in deinem Code einen anderen Pfad hast als da wo die Datei liegt. Das kann nicht funktionieren.
 

josef24

Erfahrenes Mitglied
Vielen Dank, habe jetzt den SB mit einem neutralen Dokument gestartet, wobei dann der Pfad kein Problem mehr war. Offensichtlich waren "Altlasten" diesbezüglich die Fehlerquelle. Nochmals Danke und eine schöne Weihnachtszeit wünscht Josef
 

Neue Beiträge