Serienbrief mit Excell-Quelle - berechnet als PDF
#1
Hallo liebe Gemeinde,

ich habe ein großes Problem und hoffe auf eure Hilfe...
Ich soll Quartalsweise Bescheinigungen ausstellen, wann welches Mitglied (ca. 37) an welcher Ausschusssitzung (ca. 12x 10) teilgenommen hat und dabei jeweils die Aufwandsentschädigung ausweisen...
Dabei soll das Seriendokument als PDF, in Unterordnern ./Name/, gespeichert werden

Für meinen Schulverein habe ich seinerzeit mal ein Makro-Skript gefunden, mit dem ich das ähnlich konnte...
Allerdings war es da recht einfach, da eine Excell-Zeile ein Datensatz bedeutete... hier nicht!
... und das ich mich überhaupt nicht mit VBA auskenne, macht es das bestimmt nicht einfacher...!

Hier wollte ich eine Wordvorlage erstellen mit dem Text a la:

Zitat:Lieber Max Mustermann,
im Quartal 02/24 hast du an folgenden Sitzungen teilgenommen:
Datum    Auschuß XY     10,00 €
Datum    Auschuß AB     10,00 € 
Datum    Auschuß XY     10,00 € 
Datum    Auschuß AB     10,00 €
Datum    Auschuß AB     10,00 €


Damit erhälst du eine Aufwandsentschädigung i.H.v. 50,00 €.

und diese mit einer Excell-Datei verknüpfen, in der folgende Daten gespeichert sind:

Code:
Name    Datum    Ausschuß    AE
Max Mustermann    05.03.2024    AGfB    10,00 €
Erika Mustermann    02.02.2024    AGSU    10,00 €
Max Mustermann    05.01.2024    AGYM    10,00 €
Erika Mustermann    10.02.2024    BÜBAA    10,00 €
Max Mustermann    05.02.2024    AGfB    10,00 €
Erika Mustermann    05.03.2024    AGfB    10,00 €
Max Mustermann    10.03.2024    BÜBAA    10,00 €
Erika Mustermann    10.03.2024    BÜBAA    10,00 €
Max Mustermann    13.04.2024    AGYM    10,00 €
Erika Mustermann    05.03.2024    AGfB    10,00 €
Max Mustermann    02.02.2024    AGSU    10,00 €
Erika Mustermann    05.01.2024    AGYM    10,00 €
Max Musterfrau    10.02.2024    BÜBAA    10,00 €
Erika Musterfrau    05.02.2024    AGfB    10,00 €
Max Musterfrau    05.03.2024    AGfB    10,00 €
Erika Musterfrau    10.03.2024    BÜBAA    10,00 €
Max Musterfrau    10.03.2024    BÜBAA    10,00 €
Erika Musterfrau    13.04.2024    AGYM    10,00 €
Die Spalten sind noch nicht abschließend, da ich mit dem Projekt gerade erst anfange...

Könnt ihr mir helfen???

LG RF
Und nichts kann mich aufhalten...! - Mist, ne Kindersicherung.
Antworten Top
#2
Hallo Rettungsfuzzy,

das Erstellen solcher Bescheinigungen kann je nach Office-Version makrofrei per Serienbrief erledigt werden. Über ein ähnlich gelagertes Thema wird gerade hier https://www.clever-excel-forum.de/Thread...ebernehmen  diskutiert.

Das Abspeichern als PDF in geeignete Ordner wird ohne Makro nicht abgehen. Du kannst dich ja nochmal melden, wenn du in der o.g. Diskussion was Passendes für dich findest. Am Rest soll es dann auch nicht scheitern.
Antworten Top
#3
Hallo Gerhard,

Danke für die Hilfe... Der Beitrag #3 sieht sehr interessant aus - allerdings bekomme ich selbst das Beispiel nicht hin... Es wird immer nur ein Name angezeigt und nicht die Namen je Stadt. - siehe Screenshot...

Ich nutze Office 2007 - Wenn die Auflistung und Addierung der Beträge  auch ohne Makro hinzubekommen wäre, glaube ich das vorhandene Makro selber entsprechend abändern zu können.

LG RF


Angehängte Dateien Thumbnail(s)
   
Und nichts kann mich aufhalten...! - Mist, ne Kindersicherung.
Antworten Top
#4
Hallo RF,

ich hab das mal ausprobiert und bei mir klappt das Beispiel. Zwei Fragen:

Hast du berücksichtigt, dass du bei Sendungen > Seriendruck starten eingestellt hast: Verzeichnis?
Falls das falsche Ergebnis in der Seriendruckvorschau auftaucht: Übergeh diesee und führe  sofort Fertigststellen und zusammenführen > Einzelne Dokumente bearbeiten aus. Wie schaut es dann aus?

Im übrigen meine ich, dass du hier die umständlichste der drei Varianten gewählt hast. Die Variante mit dem DataBase-Feld ist relativ einfach, wenn erst mal eine eindeutige Liste der Städte ( bei dir: Namen) existiert. Die könntest du in Excel online mittels der Funktion = Eindeutig ruckzuck herstellen und als Werte in dein Excel 2007 rüberkopieren (ich habs nicht getestet, aber es sollte gehen).

Was die Summen pro Teilnehmer betrifft, das ist schon zu machen, sowohl in der DataBase-Variante als auch in der Feld-Variante. Ich hab das vor Jahren mal durchexerziert und fand es extrem mühsam. Aber wenn du möchtest, hier ist die Anleitung dazu.


Angehängte Dateien
.pdf   Gruppierte Serienbriefe_mit_Feldern.pdf (Größe: 368,55 KB / Downloads: 5)
Antworten Top
#5
Hallo,

als Anlage mal eine Datenquelle nach deinen Wünschen(Hoffe ich).

Die Tabelle "SB_Daten" ist für die direkte Verwendung im Serienbrief.

Kleiner Tip: Serienbrief gestalten, ausgeben und fertig.

VG

Uwe


Angehängte Dateien
.xlsx   Datenquelle.xlsx (Größe: 13,19 KB / Downloads: 2)
Antworten Top
#6
Super, vielen Dank für eure Hilfe...
Ich habe mir jetzt mal beides kurz angeschaut und denke, daß ich klar kommen sollte...
Wenn nicht, melde ich mich wieder!!
Ich teste das ganze, wenn ich die Tage wieder Zeitz dafür habe.

@Gerhard H: Deine Anleitung war für meine Bran.exe , gefühlt, sehr verständlich - super geschrieben!!

LG RF
Und nichts kann mich aufhalten...! - Mist, ne Kindersicherung.
Antworten Top
#7
Ich habe nahezu fertig...
Es hat soweit gut geklappt und ich bin fast am Ziel - fast ...
Mit der Anleitung von @Gerhard H ist der erste Teil meines Auftrages erfüllt!

Ich habe zum einen - zwar nur - einen Schönheitsfehler auf dem letzten Blatt einer Serie...
Da wird der Inhalt mit ausgegeben, obwohl die Feldinhalte leer sind - Das Blatt ist also unnötig/überflüssig!

... und/aber - zum anderen- ein Problem mit dem Makro...
Nachdem ich das Makro ausführe, bricht das Makro im ersten Brief ab und es erscheint folgende Fehlermeldung:
(Der Speicherpfad wird bis dahin soweit korrekt generiert!)

"Unbekannter Fehler 75 - Bitte Makro erneut ausführen."

Mit vba kenne ich mich soweit überhaupt nicht aus - Der Makro-Code lautet wie folgt:
Code:
Sub Serien_PDF_erstellen()
'
' MakroSerien_PDF_erstellen
'
' Variantenänderung (Kommentarmarkierungen setzen/löschen):
'  Zeile 65-68/74: Value im Ordner oder Dateinamen
'  Zeile 75/76: Value im Dateinamen
'  Zeile 85/86: PDF-Format x oder a
'
' Seriendruckfeld codieren:
'  Zeile 65, 74, 75, 81
'
'
' Definition der Variablen
'============================================================================
    Dim iBrief As Integer, sBrief As String
    Dim AppShell As Object
    Dim BrowseDir As Variant
    Dim Path As String, Path2 As String
    Dim dateiName As String

' Errhorhandler
'============================================================================
    On Error GoTo ErrorHandling

' Auswahlfenster Pfad - Windows-Fenster  wird während Programm-Ausführung eingeblendet
'============================================================================
    Set AppShell = CreateObject("Shell.Application")
    Set BrowseDir = AppShell.BrowseForFolder(0, "Bitte den Speicherort auswählen", &H4000, 17)
        Path = BrowseDir.items().Item().Path

    If Path = "" Then GoTo ErrorHandling

' Inputfenster Dateiname - Windows-Fenster wird während Programm-Ausführung eingeblendet
'============================================================================
    dateiName = InputBox("Bitte den Dateinamen angeben", , "")

    If dateiName = "" Then GoTo ErrorHandling

' Unterordner definieren, in welchen die Serien-PDF-Dateien gespeichert werden sollen
'============================================================================
    Path = Path & "\Serienbrief-" & Format(Now, "dd.mm.yyyy-hh.mm.ss") & "\"
    MkDir Path

    On Error GoTo ErrorHandling

' Hinweisfenster "Ausblenden" - Windows-Fenster wird während Programm-Ausführung eingeblendet
'============================================================================
    MsgBox "Serienbrief-Dateien werden jetzt erstellt. Dieser Vorganag kann einige Minuten dauern - Word wird während dieser Zeit ausgeblendet", vbOKOnly + vbInformation
    Application.Visible = False

' Erstelle Serienbrief Stapelablauf
'============================================================================
    With ActiveDocument.MailMerge
        .DataSource.ActiveRecord = 1
        Do
            .Destination = wdSendToNewDocument
            .SuppressBlankLines = True
            With .DataSource
                .FirstRecord = .ActiveRecord
                .LastRecord = .ActiveRecord

' Value-Unterordner definieren, in welchen die PDF-Dateien gespeichert werden sollen
'============================================================================
            Path2 = Path & .DataFields("Name").Value & "\"
            MkDir Path2

            On Error GoTo ErrorHandling

' Dateinamen definieren für PDF-Dateien
'============================================================================
'          Variante mit oder ohne Value-fix im Dateinamen:
'          ============================================================================
'            sBrief = Path & Format(Now, "yyyymmdd") & " - " & dateiName & .DataFields("ManMitgl").Value & ".pdf"
'            sBrief = Path2 & Format(Now, "yyyymmdd") & " - " & dateiName & .DataFields("ManMitgl").Value & ".pdf"
            sBrief = Path2 & dateiName & ".pdf"

            End With
            .Execute Pause:=False

            If .DataSource.DataFields("Name").Value > "" Then

'              Dateioformat: PDF/x oder PDF/a:
'              ============================================================================
'                ActiveDocument.SaveAs FileName:=sBrief, FileFormat:=wdFormatPDF
                ActiveDocument.ExportAsFixedFormat outputfilename:=sBrief, exportformat:=wdExportFormatPDF, UseISO19005_1:=True

            End If
            ActiveDocument.Close False

            If .DataSource.ActiveRecord < .DataSource.RecordCount Then
                .DataSource.ActiveRecord = wdNextRecord
            Else
                Exit Do
            End If
        Loop
    End With

' error handling
'============================================================================
ErrorHandling:
    Application.Visible = True

    If Err.Number = 76 Then
        MsgBox "Der ausgewählte Speicherort ist ungültig", vbOKOnly + vbCritical
    ElseIf dateiName = "" Then
        MsgBox "Der Dateiname ist ungültig", vbOKOnly + vbCritical
    ElseIf Err.Number = 5852 Then
        MsgBox "Das Dokument ist kein Serienbrief"
    ElseIf Err.Number = 4198 Then
        MsgBox "Der ausgewählte Speicherort ist ungültig", vbOKOnly + vbCritical
    ElseIf Err.Number = 91 Then
        MsgBox "Erstellung von Serienbriefen abgebrochen", vbOKOnly + vbExclamation
    ElseIf Err.Number > 0 Then
        MsgBox "Unbekannter Fehler: " & Err.Number & " - Bitte Makro erneut ausführen.", vbOKOnly + vbCritical
    Else
        MsgBox "Serienbriefe erfolgreich erstellt", vbOKOnly + vbInformation
    End If

End Sub

Wie ist das zu beheben??

LG RF


Angehängte Dateien Thumbnail(s)
   

.pdf   test serie gesamt.pdf (Größe: 337,7 KB / Downloads: 3)
.pdf   test serie.pdf (Größe: 319,52 KB / Downloads: 3)
Und nichts kann mich aufhalten...! - Mist, ne Kindersicherung.
Antworten Top
#8
Hallo RF,

diese Fehlermeldung hat der Autor des Makros im Error-Handler für den "Weiß auch nicht"-Fall selbst definiert.

Jetzt könnte man sich auf die Fehlersuche begeben, aber statt dessen könntest du mal die folgende Variante ausprobieren.
Sie legt für jeden Datensatz ein PDF in einem gemeinsamen Ordner ab. Den Pfad dorthin musst du in der Zeile

pfad = "....."

anpassen. Den gewünschten Dateinamen musst du in der Zeile
dateiname = "...." an deine Seriendruckfelder anpassen. Aktuell zieht er sich den Namen aus dem Seriendruckfeldern "VorName" und "Nachname".

Falls du für jedes PDF einen eigenen Ordner brauchst, könnte man das Makro noch abändern. Aber teste das erst mal so.

Code:
Sub JederDatensatz1Datei()
'*****dieses Makro vom Seriendruck-Hauptdokument aus laufen lassen (statt Dokumente zusammenführen)*********

Dim i As Long, anzahl As Long
Dim pfad As String
Dim dateiname As String

pfad = "C:\1temp\srbrf\" '***Anpassen!


With ActiveDocument.MailMerge
        If .MainDocumentType = wdNotAMergeDocument Then
           MsgBox "Das Dokument ist noch nicht mit einer Seriendruckquelle verbunden." & vbLf & _
           "Bitte nachholen."
                      Exit Sub
        End If
    
    'Anzahl Datensätze feststellen, Abbruch bei 0
    .DataSource.ActiveRecord = wdLastDataSourceRecord
    anzahl = .DataSource.ActiveRecord
        If anzahl = 0 Then
            MsgBox "Es wurden keine Datensätze gefunden."
            Exit Sub
        End If

    'beginnen mit dem ersten Datensatz
    .DataSource.ActiveRecord = 1
    .Destination = wdSendToNewDocument
   
        For i = 1 To anzahl
          .DataSource.ActiveRecord = i
         
          'Speicherpfad und Dateiname:
          dateiname = pfad & Application.PathSeparator & .DataSource.DataFields("Name").Value & "_" & .DataSource.DataFields("Ort").Value '***Anpassen
   
          'macht dem Seriendruck vor, dass es bei jedem Durchgang nur 1 Datensatz gibt
          .DataSource.FirstRecord = i
          .DataSource.LastRecord = i
          .Execute
        
          With ActiveDocument
              'Schönheitssache: löscht den abschließenden Abschnittsumbruch
              .Range.Find.Execute findtext:="^b", replacewith:=""
             
              'Speichern als .docx
              '.SaveAs FileName:=dateiname & ".docx", AddToRecentFiles:=False
              '.Close
             
              ' oder speichern als pdf
              ActiveDocument.ExportAsFixedFormat OutputFileName:= _
              dateiname & ".pdf", ExportFormat:=wdExportFormatPDF, OpenAfterExport:=False
              .Close savechanges:=False
          End With
           
            'Verschnaufpause für Windows
            If i Mod 20 = 1 Then DoEvents
           
        Next i
       
    .DataSource.FirstRecord = 1
End With
MsgBox anzahl & " Dateien erstellt."
End Sub
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste