Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Anzeige
Inhaltsverzeichnis

Mit VBA erstellter S.-Brief erzeugt mehr Briefe als Daten

Forumthread: Mit VBA erstellter S.-Brief erzeugt mehr Briefe als Daten

Mit VBA erstellter S.-Brief erzeugt mehr Briefe als Daten
27.09.2025 15:16:54
MMartin
Hallo zusammen,

mit dem unten stehen Code (den habe ich im Internet gefunden) erzeuge ich aus meiner Excel über einen Button einen Serienbrief. Es funktioniert alles gut und die Briefe werden erzeugt.

Doch unter dieser Tabelle kommen weitere Zeilen, in denen Werte stehen die aber nichts mit dem Serienbrief zu tun haben und auch nicht berücksichtigt werden in den Seriendruckfeldern im Serienbrief. Doch beim erzeugen der Serienbriefe nimmt der Code auch diese Zeilen mit und erzeugt daraus Serienbriefe ohne die dazugehörigen Felder auszufüllen. Also leere Adressfelder mit dem Text dazu.

Gibt es eine Möglichkeit den Code so zu ändern, dass dies nicht mehr vorkommt. Und noch eine wichtige Frage: Gibt es eine Möglichkeit, in der Excel Tabelle z. B. eine zusätzliche Spalte einzufügen in der man z. B ein x oder ein Ja beim jeweiligen Datensatz eingibt und dann nur diese Auswahl an den Seriendruck übergeben wird. Ich möchte das gerne schon in der Tabelle markiert und erledigt haben, anstatt wie ich oft gesehen habe, in der automatischen Auswahl die beim erzeugen von Serienbriefen erscheint.

Vorab vielen Dank und allen ein schönes Wochenende.

Gruß Martin


-------------------------------------------------------------------------------------------

'------ SETUP >------
Private Const sWord_Document_Name As String = "Vorlage Anschreiben.docx"
Private Const Table_with_Adresses As String = "Tabelle1.xlsm" 'Ich habe den tatsächlichen Excel Namen, hierfür durch "Tabelle1" im Code ersetzt
'------ SETUP >------

Sub Erstelle_Word_Serienbrief_als_Vorschau()
'-------------------- Word_oeffnen() >--------------------

' Path >
Dim sCurrent_Path As String
sCurrent_Path = ActiveWorkbook.Path

Dim sFull_Path_of_Word_File
sFull_Path_of_Word_File = sCurrent_Path & "\" & sWord_Document_Name
'

' Word starten >
' with word_refernece >
'Dim app As Word.Application '*Verweis Word-dll
'Set app = New Word.Application '*Verweis Word-dll
'

' with late-binding >
Dim app As Object '*late-binding
Set app = CreateObject("Word.Application") '*late-binding
'

app.Visible = True
app.Activate
'

'
'Dim doc As Object '*late-binding
Dim doc As Word.Document 'word-dll
Set doc = CreateObject("Word.Document")
Set doc = app.Documents.Open(sFull_Path_of_Word_File, ConfirmConversions:=False, ReadOnly:=False, AddToRecentFiles:=False)
'

Dim wb As Workbook
Set wb = ThisWorkbook

Dim sExcel_Filename As String
sExcel_Filename = ThisWorkbook.FullName

' Datenquelle einstellen >
'*versions 2007+
'*Datenquelle für den Seriendruck
doc.MailMerge.MainDocumentType = wdFormLetters
doc.MailMerge.OpenDataSource Name:="" & sExcel_Filename & "", _
ReadOnly:=False, LinkToSource:=True, _
Format:=wdOpenFormatAuto, _
Connection:="Provider=Microsoft.ACE.OLEDB.12.0;User ID=Admin;Data Source=" & sExcel_Filename & ";Mode=Read;Extended Properties=""HDR=YES;IMEX=1;" _
, SQLStatement:="SELECT * FROM `" & 2025 & "$`", _
SubType:=wdMergeSubTypeAccess
'

' output >
doc.MailMerge.Destination = wdSendToNewDocument
doc.MailMerge.Execute Pause:=False
'

doc.Close SaveChanges:=False
Set doc = Nothing
Set app = Nothing
'----------------------------------------
End Sub
Anzeige

26
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Mit VBA erstellter S.-Brief erzeugt mehr Briefe als Daten
27.09.2025 17:13:06
JoWE
Hallo,
das muss im/mit dem SQL-Statement eingeschränkt werden,
hier ein allgemeines Beispiel: SELECT * FROM Deine Tabelle WHERE DeinSpaltenname = 'X'
Gruß Jochen
Im Anhang ist...
28.09.2025 10:51:02
Case
Moin Martin, :-)

ein Beispiel, wie ich es machen würde: ;-)
https://www.herber.de/bbs/user/179077.zip

Mit der linken Maustaste (oder einfach auswählen der Zellen in Spalte A) wird ein X gesetzt. Mit der rechten Maustaste kannst du es wieder löschen. ;-)

Da Word bei SQL-Statements - was die Daten angeht - etwas "zickig" ist, habe ich über Power Query eine Ergebnistabelle generiert. Die kannst du auch ausblenden. ;-)

Servus
Case
Anzeige
AW: Mit VBA erstellter S.-Brief erzeugt mehr Briefe als Daten
28.09.2025 17:14:31
daniel
Hi

Wäre es nicht am einfachsten, in einem zusätzlichen Tabellenblatt per Formel mit der Funktion FILTER die gewünschten Zeilen anzeigen zu lassen und dann im SQL dieses Blatt als Quelle anzugeben?

Die Formel für die Filterung könnte so aussehen, übertrahen werden die Spalten A:I mit den Zeilen, die du in Spalte J mit "x" gekennzeichnet hast:

=Filter(Tabelle1!A:I;Tabelle1!J:J="x")

Gruß Daniel
Anzeige
AW: Mit VBA erstellter S.-Brief erzeugt mehr Briefe als Daten
29.09.2025 18:56:34
Marc
Dein SQL Statement umfasst die gesamten Datensätze der Datenbanktabelle.

Du musst dem Programm schon sagen, welche Datensätze er nehmen soll (z.B. durch eine Datumsauswahl , oder einer anderen Einschränkung, die dann nur für diese speziellen (von dir gewünschten ) Datensätze passt...



SQLStatement:="SELECT * FROM `" & 2025 & "$`"

Du lädst hier alle Datensätze ohne wenn und aber..
Wenn die Tabelle z.B. ne Spalte hätte wie Datum "BriefSchonErstellt" mit ja/nein als Werte

könnte man eben z.B. es so anpassen:
SQLStatement:="SELECT * FROM `" & 2025 & "$` WHERE BriefSchonErstellt = false"

Wichtig wäre dann natürlich, das du nach jedem Brieferstellen, den Wert auf true setzt für den durch gegangenen Datensatz

Anzeige
AW: Mit VBA erstellter S.-Brief erzeugt mehr Briefe als Daten
29.09.2025 22:45:43
JoWE
...oder auch
SQLStatement:="SELECT TOP 20 * FROM `" & 2025 & "$` WHERE `S.-Druck` IS NOT NULL"
um nur die ersten 20 Zeilen auszuwerten in denen in der Spalte "S.-Druck" ein Eintrag (z.B. ein x) vorhanden ist.
AW: Mit VBA erstellter S.-Brief erzeugt mehr Briefe als Daten
29.09.2025 20:03:50
Martin
Hallo zusammen,

mein vorerst letztes "Problem" mit den 255 Zeichen konnte ich auf die für mich einfachste Lösung beseitigen. Ich habe meine Arbeitsmappe inkl. Serienbriefvorlage einfach eine Verzeichnisebene nach oben kopiert und alles funktionierte wieder.

Mit euerer Hilfe konnte ich all meine Anfänger-Probleme hierzu lösen und daher mein Dank an alle Beteiligten, die sich geduldig, auch am Sonntag, damit beschäftigt haben.

Freut euch auf neue "Probleme" bzw. Fragen von mir :-)

Gruß
Martin

Anzeige
AW: Im Anhang ist...
28.09.2025 15:05:29
MMartin
Hallo Case,

das ist der zusätzlichen Spalte genauso geworden wie ich es mir vorgestellt habe, doch als Laie nicht umsetzen konnte. Vielen Dank.

Wenn ich mit der li. Maustaste in das Feld S.-Druck in der jeweiligen Zeile klicke, erscheint ein x und ist für den Seriendruck markiert und wird für den Serienbrief übernommen. Wenn ich in dasselbe Feld mit der re. Maustaste klicke entferne ich diese Auswahl wieder.

Mir ist aber aufgefallen:

Das, wenn ich mit der li. Maustaste auf die Zeilennummer links klicke, werden alle Feldinhalte durch ein x ersetzt werden und nach einem erneuten Klick mit der rechten Maustaste werden alle Feldinhalte entfernt u. die Zeile ist leer.

Wenn ich mit der rechter Maustaste auf die Zeilennummer klicke, ist der komplette Datensatz gelöscht

Wenn ich mit rechter Maustaste auf eine Zeilennummer klicke, erscheint kein Menü mehr (z. B. Zellen einfügen, Zellen formatieren usw.)

Wenn ich beginnend bei A2 mit der linken Maustaste mehrere Zeilen und Felder markiere, werden alle Inhalte durch ein x ersetzt.

Wenn ich mit der li. Maustaste unterhalb der Tabelle auf eine Zeilennummer klicke, dann zwar eine neue Zeile erstellt wird, aber alle Felder mit x ausgefüllt werden. Und Felder die schon einen Inhalt haben, nicht nach unten verschoben werden, sondern mit einem x überschrieben werden und diese Zeile zum Serienbrief hinzugenommen wird, jedoch ohne Adressfeld und nur mit dem Text des Briefes.

Woran liegt das und kann man dies alles ohne großen Aufwand beseitigen bzw. ändern oder hat es was damit zu tun:? "Da Word bei SQL-Statements - was die Daten angeht - etwas "zickig" ist, habe ich über Power Query eine Ergebnistabelle generiert. Die kannst du auch ausblenden. ;-)

Vorab schon mal vielen Dank.

und allen noch einen schönen restlichen Sonntag.

Gruß

Martin
Anzeige
Tausche den Code...
28.09.2025 15:57:38
Case
Moin Martin, :-)

... unter "Tabelle1" gegen diesen aus - also den alten rauslöschen und diesen übernehmen: ;-)
Option Explicit

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Intersect(Target, Range(Me.ListObjects(1).ListColumns(1).DataBodyRange.Address)) Is Nothing Then
If Target.Column = 1 And Target.Row > 1 And Target.CountLarge = 1 Then Target.Value = "X"
End If
End Sub
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
If Not Intersect(Target, Range(Me.ListObjects(1).ListColumns(1).DataBodyRange.Address)) Is Nothing Then
If Target.Column = 1 And Target.Row > 1 And Target.CountLarge = 1 Then Target.Value = vbNullString: Cancel = True
End If
End Sub

Servus
Case
Anzeige
AW: Tausche den Code...
28.09.2025 16:19:33
MMartin
Hallo Case,

getan wie du gesagt - und... es funktioniert tadellos... vielen Dank.

Ich werde deinen Vorschlag jetzt in meiner Arbeitsmappe einarbeiten und gebe dir dann noch ein Feedback, ob auch in der Arbeitsmappe alles funktioniert hat.

Nochmals vielen Dank.

Martin
Anzeige
AW: Tausche den Code...
29.09.2025 11:22:42
Martin
Hallo Case,

ich habe gestern deine Lösungen noch alle in meine Arbeitsmappe eingebaut und es funktioniert einwandfrei... nochmals Danke dafür.

Heute morgen habe ich die Arbeitsmappe und die Serienbriefvorlage bei mir in der Firma in mein Verzeichnis kopiert und gestartet. Wenn ich nun einen Serienbrief erstellen will erscheint die Meldung "Error: 9105 Die Zeichenfolge ist länger als 255 Zeichen". Ich habe schon recherchiert und versucht diesen Fehler zu beseitigen, kann ich leider doch nicht alleine. Hat diese Meldung etwas damit zu tun, das ich auf meinem privaten Rechner Office 365 und hier in meiner Firma Office 2024 verwende? Wie kann man diesen diesen Fehler beseitigen?

Gruß

Martin

Anzeige
AW: Tausche den Code...
29.09.2025 11:55:07
Martin
Hallo Case,

ich denke, glaube den Fehler gefunden zu haben. Wenn ich meine Arbeitsmappe nicht in die gewünschte Verzeichnisebene Kopiere, sondern auf den Desktop, dann funktioniert alles ohne Fehler.

Leider muss sich diese Verzeichnistiefe einhalten. Gibt es hierfür dann doch eine Lösung?

Gruß
Martin
Anzeige
Das ist das altbekannte...
29.09.2025 12:29:53
Case
Moin Martin, :-)

... Problem der alten Jet/ACE-OLEDB-Schnittstelle für den Word-Seriendruck. ;-)

Mögliche Lösungen sind: ;-)
Die klassische Lösung ist - in VBA die Datei temporär in einen kurzen Pfad lokal zu kopieren und darauf den Seriendruck laufen zu lassen. ;-)

Oder im Firmennetzwerk - wenn der Pfad so ist "\\server\abteilung1\abteilung2\projekte\2025\kunden\proben\…\daten.xlsx", dann mappst du ein Laufwerk auf diesen Ordner, dann ist der Pfad nur noch X:\daten.xlsx. ;-)

Oder - du kannst statt des kompletten Connectionstrings einen DSN-Namen verwenden, den du (oder eure IT) in der ODBC-Verwaltung anlegt. Dann steht im Word-Code nur DSN=ExcelSerienbrief; das ist viel kürzer, kein Pfadproblem mehr. ;-)

Servus
Case
Anzeige
AW: Mit VBA erstellter S.-Brief erzeugt mehr Briefe als Daten
27.09.2025 17:58:49
MMartin
Hallo Jochen,

vielen Dank für deinen Vorschlag. Könntest du mir bitte mein SQL Statement dahingehend ändern. Denn egal wie ich deinen Vorschlag versuche umzusetzen, klappt es nicht.

Hättest du mir auch eine einen Vorschlag bzgl. einer zusätzlichen Spalte zur Auswahl?

Gruß Martin
Anzeige
AW: Mit VBA erstellter S.-Brief erzeugt mehr Briefe als Daten
27.09.2025 18:48:07
JoWE
ohne Deine Tabelle und dein Word-Dokument werde ich das nicht hinbekommen.
Kannst Du beides hier hochladen? Natürlich mit anonymisierten und nur wenigen Daten.
Eine zusätzliche Spalte ("zu drucken") kannst Du ja bereits an Deine Tabelle anfügen-

Gruß
Jochen
AW: Mit VBA erstellter S.-Brief erzeugt mehr Briefe als Daten
27.09.2025 19:04:18
MMartin
Hallo Jochen,

danke für dein Angebot, dass ich gerne annehme. Ich brauche jedoch ein bisschen Zeit dazu und ob ich es heute noch schaffe, weiß ich nicht. Aber spätestens morgen kann ich dir beide Dateien hochladen

Gruß
Martin
Anzeige
AW: Mit VBA erstellter S.-Brief erzeugt mehr Briefe als Daten
27.09.2025 21:43:38
Alwin Weisangler
Hallo,

es liegt weder am Code noch am SQL-Statement.
Mache aus der Tabelle eine formatierte Tabelle (Listobjekt) und du bist das Problem der unnütz mitgegebenen (nicht)-Leerzeilen.
Klicke in deine Tabelle und drücke Strg./T
So bleibt die Liste sauber abgegrenzt.
Einzig die Codezeile:


Set doc = CreateObject("Word.Document")

ist überflüssig.
https://www.herber.de/bbs/user/179076.xlsm

Gruß Uwe
Anzeige
AW: Mit VBA erstellter S.-Brief erzeugt mehr Briefe als Daten
27.09.2025 22:04:41
JoWE
Hallo Uwe,
super! Dann brauche ich mich ja jetzt nicht mehr kümmern, danke!
Martin, sag' bitte Bescheid, wenn Uwes Tipp Dein Problem lösen konnte.
Euch beiden ein schönes Wochenende
Gruß
Jochen
AW: Mit VBA erstellter S.-Brief erzeugt mehr Briefe als Daten
27.09.2025 22:33:45
Luschi
Hallo Uwe,

late binding (Set app = CreateObject("Word.Application") und wordeigene Vba-Konstanten (wdFormLetters, wdOpenFormatAuto, wdMergeSubTypeAccess, wdSendToNewDocument) passen nicht zusammen. Denn die werden von Excel-Vba so nicht erkannt.
Sollte der Vba-Code trotzdem laufen, dann ist early binding (also gesetzter Vba-Verweis zu Word) zusätzlich noch aktiviert. Und das kann dann schnell in die Hose gehen, wenn der Vba-Entwickler mit Office 2021 arbeitet, der Anwender aber Office 365 nutzt, denn das automatische Umswitchen auf die richtige Word-Bibliothek ist nicht gesichert. Deshalb müssen diese Konstanten gegen den numerischen Wert ausgetauscht und der vorhandene Vba-Verweis deaktiviert werden.

Gruß von Luschi
aus klein-Paris
Anzeige
AW: Mit VBA erstellter S.-Brief erzeugt mehr Briefe als Daten
27.09.2025 22:52:05
Alwin Weisangler
Hallo Luschi,


Die Kommentare habe ich nicht untersucht. Der Code ist ebenfalls nicht von mir. Ich habe nur das geändert, was dem To gestört hatte und damit der Button unterhalb der Tabelle bleiben kann ein Listobjekt aus den vorhandenen Datensätzen gemacht.
Ich vermute, dass die Kommentare vom To stammen.

Da ich momentan nur vom Tablett aus schreiben kann, schau ich mal morgen Vormittag den Kram genauer an und stelle mal die Kommentare und was so noch auffällig ist richtig.

Gruß Uwe
Anzeige
AW: Mit VBA erstellter S.-Brief erzeugt mehr Briefe als Daten
28.09.2025 11:35:24
Alwin Weisangler
@Luschi,

ich habe jetzt mal die komplette Prozedur vom TO angeschaut. Da hat er wahrscheinlich versehentlich nur den Early Binding Teil statt Late Binding auskommentiert. Durchgelaufen ohne Fehler ist diese Prozedur bei mir sowohl unter O2021 als O2024. Naja, der TO hat O365. Wenn es da zum Fehler gekommen wäre hätte er dies vermutlich beschrieben.
Es sind auch noch diverse andere Bibliotheken aktiviert, welche erst mal ohne Relevanz zum gelieferten Ausschnitt sind.

Mit Kommentaren habe ich es nicht so. Ich lese lieber den Code.

Gruß Uwe
Anzeige
AW: Mit VBA erstellter S.-Brief erzeugt mehr Briefe als Daten
28.09.2025 14:56:50
MMartin
Hallo Uwe,
hallo Luschi,

vielen Dank für eure Vorschläge, auch wenn ich als Laie nicht sehr viel von eurem Austausch verstanden habe, sorry. Dein Vorschlag Uwe, hat auch endlich dazu geführt, dass wenn ich erstmals den Seriendruck gestartet habe, alle Zeilen übernommen wurden und die leeren Zeilen unterhalb der Tabelle unberücksichtigt blieben. Doch nachdem ich ein paar leere Zeilen unterhalb der Tabelle, zwei Felder mit Inhalt versehen habe die nichts mit dem Seriendruck zu tun hatten, wurden diese mit in den Seriendruck übernommen.

Auch hier meine Frage, kann man das ohne großen Aufwand ändern unter Berücksichtigung dieser einen zusätzlichen Spalte um die Vorabauswahl für den Serienbrief zu realisieren?
Anzeige
AW: Mit VBA erstellter S.-Brief erzeugt mehr Briefe als Daten
28.09.2025 15:18:29
JoWE
Hallo zusammen,
ich habe mir das Ganze wegen der Vielzahl von Antworten doch noch mal angesehen.
Habe mit meinem 64Bit-PC mit Windows 11 und MS Office 2024 das vom Fragesteller hochgeladene Konstrukt bearbeitet.
Also die Spalte S.-Druck umbenannt zu "Druck". Weiter habe ich in der Spalte "Druck" alle Datensätze, für die
kein Seriendruckdokument erstellt werden soll ein "n" eingefügt. Zusätzlich habe ich alles aus meiner Sicht Überflüssige aus dem VBA-Code entfernt.
Den SQL-String/das SQL-Statement habe ich dann gemäß der MS-Vorgaben verändert und dazu die Bedingung eingefügt, welche nur die Datensätze berücksichtigt, die
kein "n" in der Spalte "Druck" haben, also leer "NULL" sind:
SQLStatement:="SELECT * FROM `" & 2025 & "$` WHERE `Druck` is NULL", SQLStatement1:="", SubType:=wdMergeSubTypeAccess
So klappts bei mir ohne Probleme.
Hier dazu im Anhang hochgeladen ein Zip-File mit der geänderten xlsm-Datei und der unveränderten docx-Datei.
https://www.herber.de/bbs/user/179081.zip
Gruß
Jochen
Anzeige
AW: Mit VBA erstellter S.-Brief erzeugt mehr Briefe als Daten
28.09.2025 15:53:10
MMartin
Hallo Jochen,

erstmal vielen Dank für deine Mühe an einem Sonntag,

Deine Lösung ist fast schon perfekt. Und mit deiner Erklärung konnte ich als Laie aus deinem (` is NULL", SQLStatement1) sogar ein (` is NOT NULL", SQLStatement1) ändern, das ist für mich schon mal großer Erfolg 😊 und es hat funktioniert, dass dann nur die Datensätze in denen im Feld Druck ein x steht übernommen wurden.

Doch wenn ich jetzt, oder später ein anderer unterhalb der Tabelle, nach einigen leeren Zeilen ein Wert oder Text eingibt, was bestimmt vorkommen wird, dann übernimmt es auch diese Zeile ohne Adresse mit in den Serienbrief mit auf.
Ist das vermeidbar?
Gruß
Martin

Anzeige
AW: Mit VBA erstellter S.-Brief erzeugt mehr Briefe als Daten
28.09.2025 16:58:15
JoWE
Du kannst auch bestimmen dass es unbedingt ein "x" sein muss in der Spalte "Druck",
dann sähe der SQL-String so aus:
SQLStatement:="SELECT * FROM `" & 2025 & "$` WHERE `Druck` LIKE 'x'"

Gruß
Jochen

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige