Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

Makro gibt zu viele Briefe aus
#1
Guten Morgen zusammen,

folgendes: in einer Excel Datei soll ein Serienbrief erstellt werden, dazu werden Daten von Tabelle 1 in Tabelle 3 übertragen und letztendlich per Button der Serienbrief gestartet.

Die max. Anzahl an Brief ist auf 50 Stück beschränkt. Nachfolgender Code erstellt und öffnet den Serienbrief- Problem hier ist, wenn ich z.B. nur 20 Briefe habe, werden trotzdem 50 Word Blätter angezeigt und es kommt die Meldung, "Feldfehlerberechnung in X bis Y".

Hat Jemand eine Idee, wie man die noch in den Griff bekommen kann, also dass nur die Anzahl ausgeben wird, die auch tatsächlich gebraucht wird?

Viele Grüße 

Basti

Hier der Code:


Code:
Sub Rechnung_erstellen()
    '----------------------< fp_Excel_Word_Serienbrief_erstellen() >---------------------
    Dim ws As Worksheet
    Set ws = ActiveSheet
    Dim varRange As Excel.Range
   
   
   
    '*diese Funktion oeffnet den Serienbrief BR-Mittelung
    Dim sFilename As String
    sFilename = ThisWorkbook.Path & "\" & ThisWorkbook.Path & "\" & "Rechnung.docx"
        '< check Document >
    Dim fs As New FileSystemObject
    If fs.FileExists(sFilename) = False Then
        MsgBox "Die Datei existiert nicht" & vbCrLf & "Dateiname:" & sFilename, vbCritical, " Rechnung.docx ()"
        Exit Sub
    End If
    '</ check Document >
   
    '< Word starten >
    Dim wordApp  As Object 'As New Word.Application    'Word-dll
    Set wordApp = CreateObject("Word.Application")
    wordApp.Visible = True
    '</ Word starten >
   
    '< Word Document oeffnen >
    'Dim doc As Object
    Dim doc As Word.Document   'word-dll
    Set doc = CreateObject("Word.Document")
    Set doc = wordApp.Documents.Open(sFilename, ConfirmConversions:=False, ReadOnly:=False, AddToRecentFiles:=False)
    '</ Word Document oeffnen >
   
    Dim wb As Workbook
    Set wb = ThisWorkbook
   
    Dim sExcel_Filename As String
    sExcel_Filename = ThisWorkbook.FullName
   
    '< Datenquelle einstellen >
    '*Datenquelle für den Seriendruck
    If wordApp.Build Like "12*" Then
        '-< Ist_Office2007 >-
        doc.MailMerge.OpenDataSource Name:=sExcel_Filename _
        , Connection:="Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & sExcel_Filename & ";Mode=Read;Extended Properties=""HDR=YES;IMEX=1;Jet OLEDB:Eng;TypeGuessRows=0;" _
        , SQLStatement:="SELECT * FROM `Adressen`", SQLStatement1:=" WHERE Anschreiben='1'", SubType:=1
        '*subtype:=1=wdMergeSubTypeAccess
      
        '-</ Ist_Office2007 >-
    Else
        '-< Ist_Office2010 >-
        doc.MailMerge.OpenDataSource Name:=sExcel_Filename, Connection:="Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & sExcel_Filename
        ', SQLStatement:="SELECT * FROM 'Adressen$'"
        ' _
        , Connection:="Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & sExcel_Filename & ";Mode=Read;Extended Properties=""HDR=YES;IMEX=1;Jet OLEDB:Eng;TypeGuessRows=0;" _
        , SQLStatement:="SELECT * FROM `Adressen`", SQLStatement1:=" WHERE Anschreiben<>''", SubType:=1
        '*subtype:=1=wdMergeSubTypeAccess
        '-</ Ist_Office2010 >-
    End If
    '</ Datenquelle einstellen >
 
 
 
    '< Serienbrief erzeugen >
    If Err.Number = 9 Then
        'Fehler Maric... Update()
        Err.Clear
        doc.MailMerge.Execute
    ElseIf Err.Number <> 0 Then
        MsgBox "Fehler beim Daten holen Word von Excel." & vbCrLf & Err.Description, vbCritical, " Rechnung.docx ()"
    Else
        doc.MailMerge.Execute
    End If
    '</ Serienbrief erzeugen >
   
    '< Hauptdocument schliessen >
    doc.Close False
    '</ Hauptdocument schliessen >
   
End Sub
Antworten Top
#2
Hallo Basti,

das findest du nicht in Deinem Excel-Code, denn die Anzahl stammt aus der Serienbriefeinstellung in Word und ist dort offensichtlich fest eingestellt.

Genau um dieses alles zu umgehen hatte ich dir in einem anderen Thread den Hinweis/Tipp gegeben deinen Serienbrief in Excel selbst zu gestalten, denn da kannst du die Druckanzahl dann beliebig abfragen und festlegen.
Da es sich offentlich um Rechnungsformulare handelt, wäre m.E. die Tabellenkalkulation besser geeignet, als ein Textbearbeitungsprogramm, zumal du die zu verwendenden Daten sowieso in Excel generierst.
[Bild: attachment-190.gif]
Gruß Günter
aus der Helden-, Messe-, Musik-, Buch-, Universitäts- und Autostadt Leipzig
Antworten Top
#3
Hi,

mir ist leider nicht klar wie ich in Excel einen Brief erstellen könnte, und dann vielleicht auch noch auf bis zu 50 Stück gleichzeitig ausdrucken zu lassen?

Viele Grüße

Basti
Antworten Top
#4
Hallo Basti,

warum soll das so schwer sein, einen Brief auf einer Exceltabelle aufzubauen?
Ich habe einmal aus einem Projekt von mir solch einen ausgegliedert und dir hier angehangen.
Die einzelnen Daten werden mittels VBA-Makro aus einer Verwaltungsdatei übertragen (können natürlich auch als Bezüge von anderen Tabellenblattzellen erfolgen) und auf einem gedruckten Vordruck ausgedruckt.
Man kann auch den Kopf- und den Fuß komplett gestalten (Formenlogo als jpg-Bild einfügen).

Die Druckanzahl des jeweiligen Dokumentes wird dann über der Makro angestoßen, in welchem man die Anzahl festlegen kann, z.B. mit solch einem Code:

Code:
Option Explicit
Dim Anzahl As Integer

Sub Beleg_drucken()
    Anzahl = InputBox("Gib die Anzahl der Ausdrucke an", "Menge festlegen")
    ActiveWindow.SelectedSheets.PrintOut Copies:=Anzahl, Collate:=True, _
        IgnorePrintAreas:=False
End Sub

Der Code kommt hinter das Tabellenblatt der Datei und wird mittels eines Buttons auf dem zu druckenden Beleg gestarten (Siehe angehängtes Beispiel!).
Er fragt nach dem Start nach der Anzahl, die du drucken willst und druckt dann die entsprechende Anzahl aus.
Natürlich kann man den Code noch verfeinern, z.B. mit der Auswahl eines bestimmten Druckers usw.


Angehängte Dateien
.xlsm   Testbrief.xlsm (Größe: 21,83 KB / Downloads: 3)
[Bild: attachment-190.gif]
Gruß Günter
aus der Helden-, Messe-, Musik-, Buch-, Universitäts- und Autostadt Leipzig
Antworten Top


Gehe zu:


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