Excel VBA Schaltfläche erzeugt Fehler beim Drucken und Laufzeitfehler 1004

Gürhan Gönülalan 0 Zuverlässigkeitspunkte
2025-08-22T08:53:28.15+00:00

Guten Tag,

ich hatte mir über einen Kurs für die Buchhaltung, das auf Amazon spezialisiert ist, ein Excel Template heruntergeladen und darin meine Daten aus Amazon eingegeben, so wie es in den Videos gezeigt wird.

Es geht darum Einnahmen und Ausgaben Belege in PDF zu erhalten, nachdem man auf eine VBA Schaltfläche "Belege Drucken" klickt.

Sobald ich aber auf diese Schaltfläche klicke, erhalte ich den Fehler "Fehler beim Drucken" und wenn ich dann auf OK klicke, kommt Laufzeitfehler "1004". Fehler der Methode "ExportAsFixedFormat" des Objekts "_Worksheet". Ich vermute das es am Druckbereich liegt oder am Speicherort der Datei.


Kann mich ein Experte unterstützen, das Problem zu lösen? Ziel ist es, dass beim Klick auf die VBA Schaltfläche mir die Belege erzeugt werden. Diese Belege benötige ich für meinen Steuerberater.

Ich arbeite an einem Mac und habe das Office Home & Business 2021 für Mac.

Im VBA-Editor habe ich unter project die Mappe gefunden, auf der man die VBA-Schaltfläche zum Erzeugen der Belege findet. Der Code darin ist folgender:

Sub SD_PDFs_exportieren()

Dim ws As Worksheet

Dim i As Integer

Dim savePath As String

Dim pdfName As String

Dim filenameRange As Range

Dim filenameCell As Range

' Pfad zum Speichern der PDF-Dateien (Speicherort der Excel-Datei)

savePath = ThisWorkbook.Path

' Zeige den Speicherpfad an

MsgBox "Speicherpfad: " & savePath

' Aktives Blatt festlegen

Set ws = ThisWorkbook.ActiveSheet

' Bereich für Dateinamen festlegen (auf Blatt "Print")

Set filenameRange = ThisWorkbook.Sheets("Print").Range("A2:A200")

' Schleife über jede Seite des aktiven Blatts

For i = 1 To ws.PageSetup.Pages.Count

    ' Prüfen, ob Dateiname für diese Seite existiert

    If i <= filenameRange.Rows.Count Then

        Set filenameCell = filenameRange.Cells(i, 1)

        If filenameCell.Value <> "" Then

            ' Zeige den aktuellen Dateinamen an

            MsgBox "Dateiname: " & filenameCell.Value

            ' PDF-Dateiname zusammensetzen

            pdfName = savePath & Application.PathSeparator & filenameCell.Value & ".pdf"

            ' PDF exportieren

            ws.ExportAsFixedFormat Type:=xlTypePDF, _

                FileName:=pdfName, _

                Quality:=xlQualityStandard, _

                IncludeDocProperties:=True, _

                IgnorePrintAreas:=False, _

                From:=i, To:=i, _

                OpenAfterPublish:=False

        Else

            MsgBox "Für Seite " & i & " wurde kein Dateiname gefunden. Zelle: " & filenameCell.Address, vbExclamation

        End If

    Else

        MsgBox "Kein Dateiname für Seite " & i, vbExclamation

    End If

Next i

MsgBox "Alle PDF-Dateien wurden exportiert.", vbInformation

End Sub

Unter Allgemein ist dieser Code eingetragen:
Sub zuordnung_laender()

Dim wsInput As Worksheet

Dim wsOutput As Worksheet

Dim wsInputVAT As Worksheet

Dim wsProtokoll As Worksheet

Dim wsLaenderKey As Worksheet

Dim LastRowInput As Long

Dim LastRowOutput As Long

Dim LastRowInputVAT As Long

Dim LastRowLaenderKey As Long

Dim i As Long

Dim inputData As Variant

Dim inputVATData As Variant

Dim protokollData As Variant

Dim laenderKeyData As Variant

Dim outputData() As Variant

Dim outputRow As Long

' Definiere die Arbeitsblätter

Set wsInput = ThisWorkbook.Sheets("Input Zahlungen")

Set wsOutput = ThisWorkbook.Sheets("Laender")

Set wsInputVAT = ThisWorkbook.Sheets("Input VAT")

Set wsProtokoll = ThisWorkbook.Sheets("Protokoll")

Set wsLaenderKey = ThisWorkbook.Sheets("Laender Key")



' Finde die letzte Zeile im Input-Arbeitsblatt in Spalte G

LastRowInput = wsInput.Cells(wsInput.Rows.Count, "G").End(xlUp).Row



' Finde die letzte Zeile im Ausgabe-Arbeitsblatt in Spalte A

LastRowOutput = wsOutput.Cells(wsOutput.Rows.Count, "A").End(xlUp).Row + 1



' Finde die letzte Zeile im Zweiten Input-Arbeitsblatt in Spalte G

LastRowInputVAT = wsInputVAT.Cells(wsInputVAT.Rows.Count, "G").End(xlUp).Row



' Finde die letzte Zeile im Laender Key-Arbeitsblatt in Spalte A

LastRowLaenderKey = wsLaenderKey.Cells(wsLaenderKey.Rows.Count, "A").End(xlUp).Row



' Lade Daten in Arrays

inputData = wsInput.Range("A1:Q" & LastRowInput).Value

inputVATData = wsInputVAT.Range("A1:CA" & LastRowInputVAT).Value

protokollData = wsProtokoll.Range("A1:A" & LastRowInput).Value

laenderKeyData = wsLaenderKey.Range("A1:B" & LastRowLaenderKey).Value



' Initialisiere das Ausgabe-Array

ReDim outputData(1 To LastRowInput, 1 To 15)



' Schleife durch die Zeilen im Input-Arbeitsblatt

outputRow = 1

For i = 2 To LastRowInput

    If inputData(i, 7) = "Order" Or inputData(i, 7) = "Refund" Or inputData(i, 7) = "Liquidations" Or inputData(i, 7) = "Liquidations Adjustments" Then

        If protokollData(i, 1) <> "Processed" Then

            ' Kopiere die gewünschten Spalten in das Ausgabe-Array

            outputData(outputRow, 1) = inputData(i, 1) ' Settlement ID

            outputData(outputRow, 2) = inputData(i, 8) ' Order ID

            outputData(outputRow, 3) = inputData(i, 12) ' Platform

            outputData(outputRow, 4) = inputData(i, 17) ' Date

            outputData(outputRow, 5) = inputData(i, 13) ' Amount Type

            outputData(outputRow, 6) = inputData(i, 14) ' Amount Description

            outputData(outputRow, 7) = inputData(i, 15) ' Amount

            

            ' Füge die Zeile zum Protokoll hinzu

            protokollData(i, 1) = "Processed"

            

            ' Suche nach Übereinstimmungen im Zweiten Input-Arbeitsblatt "Input VAT"

            Dim j As Long

            For j = 2 To LastRowInputVAT

                If ((inputData(i, 7) = "Liquidations" Or inputData(i, 7) = "Liquidations Adjustments") And InStr(1, inputVATData(j, 8), outputData(outputRow, 3)) > 0) _

                Or ((inputData(i, 7) = "Order" Or inputData(i, 7) = "Refund") And inputVATData(j, 7) = outputData(outputRow, 2)) _

                And (inputVATData(j, 6) = "SALE" Or inputVATData(j, 6) = "LIQUIDATION_SALE") Then

                    ' Füge die gewünschten Daten aus "Input VAT" hinzu

                    outputData(outputRow, 9) = inputVATData(j, 7) ' Transaction Event ID = Order ID

                    outputData(outputRow, 10) = inputVATData(j, 14) ' ASIN

                    outputData(outputRow, 11) = inputVATData(j, 68) ' Sales Depart Country

                    outputData(outputRow, 12) = inputVATData(j, 69) ' Sale Arrival Country

                    outputData(outputRow, 13) = inputVATData(j, 31) ' VAT Rate

                    outputData(outputRow, 14) = inputVATData(j, 79) ' Business Customer VATID

                    

                    ' Bestimme den Ländertyp basierend auf dem Sale Arrival Country

                    Dim k As Long

                    For k = 2 To LastRowLaenderKey

                        If laenderKeyData(k, 1) = outputData(outputRow, 12) Then

                            outputData(outputRow, 15) = laenderKeyData(k, 2) ' Ländertyp

                            Exit For

                        End If

                    Next k

                End If

            Next j

            

            ' Inkrementiere die Ausgabe-Zeile

            outputRow = outputRow + 1

        End If

    End If

Next i



' Schreibe die Ausgabe-Daten zurück in das Arbeitsblatt

wsOutput.Range("A" & LastRowOutput).Resize(outputRow - 1, 15).Value = outputData



' Schreibe die Protokoll-Daten zurück in das Arbeitsblatt

wsProtokoll.Range("A1:A" & LastRowInput).Value = protokollData

End Sub

Unter Module 2 steht dieser Code:

Sub LO_PDFs_exportieren()

Dim ws As Worksheet

Dim i As Integer

Dim savePath As String

Dim pdfName As String

Dim filenameRange As Range

Dim filenameCell As Range



' Pfad zum Speichern der PDF-Dateien

savePath = ThisWorkbook.Path ' Pfad zum Speichern der PDF-Dateien im selben Ordner wie die Excel-Datei

' Aktives Blatt

Set ws = ThisWorkbook.ActiveSheet



' Dateinamen-Bereich auf dem Blatt "Print"

Set filenameRange = ThisWorkbook.Sheets("Print").Range("b2:b200") ' Bereich anpassen



' Schleife über jede Seite des aktiven Blatts

For i = 1 To ws.PageSetup.Pages.Count

    ' Überprüfen, ob der Dateiname für diese Seite vorhanden ist

    If i <= filenameRange.Rows.Count Then

        ' Definiere den Dateinamen für jede Seite aus der entsprechenden Zelle

        Set filenameCell = filenameRange.Cells(i, 1)

        If filenameCell.Value <> "" Then

            pdfName = savePath & Application.PathSeparator & filenameCell.Value & ".pdf"

            

            ' Speichere die aktuelle Seite als PDF

            ws.ExportAsFixedFormat Type:=xlTypePDF, _

                FileName:=pdfName, _

                Quality:=xlQualityStandard, _

                IncludeDocProperties:=True, _

                IgnorePrintAreas:=False, _

                From:=i, To:=i, _

                OpenAfterPublish:=False

        Else

            MsgBox "Für Seite " & i & " wurde kein Dateiname in Zelle " & filenameCell.Address & " gefunden. Die PDF-Datei wird übersprungen.", vbExclamation

        End If

    Else

        MsgBox "Es wurde kein Dateiname für Seite " & i & " gefunden. Die PDF-Datei wird übersprungen.", vbExclamation

    End If

Next i



MsgBox "PDF-Dateien wurden erfolgreich gespeichert!", vbInformation

End Sub

In Module 3 steht dieser Code:

Sub SD_PDFs_exportieren()

Dim ws As Worksheet

Dim i As Integer

Dim savePath As String

Dim pdfName As String

Dim filenameRange As Range

Dim filenameCell As Range



' Pfad zum Speichern der PDF-Dateien

savePath = ThisWorkbook.Path ' Pfad zum Speichern der PDF-Dateien im selben Ordner wie die Excel-Datei



' Aktives Blatt

Set ws = ThisWorkbook.ActiveSheet



' Dateinamen-Bereich auf dem Blatt "Print"

Set filenameRange = ThisWorkbook.Sheets("Print").Range("a2:a200") ' Bereich anpassen



' Schleife über jede Seite des aktiven Blatts

For i = 1 To ws.PageSetup.Pages.Count

    ' Überprüfen, ob der Dateiname für diese Seite vorhanden ist

    If i <= filenameRange.Rows.Count Then

        ' Definiere den Dateinamen für jede Seite aus der entsprechenden Zelle

        Set filenameCell = filenameRange.Cells(i, 1)

        If filenameCell.Value <> "" Then

            pdfName = savePath & Application.PathSeparator & filenameCell.Value & ".pdf"

            

            ' Speichere die aktuelle Seite als PDF

            ws.ExportAsFixedFormat Type:=xlTypePDF, _

                FileName:=pdfName, _

                Quality:=xlQualityStandard, _

                IncludeDocProperties:=True, _

                IgnorePrintAreas:=False, _

                From:=i, To:=i, _

                OpenAfterPublish:=False

        Else

            MsgBox "Für Seite " & i & " wurde kein Dateiname in Zelle " & filenameCell.Address & " gefunden. Die PDF-Datei wird übersprungen.", vbExclamation

        End If

    Else

        MsgBox "Es wurde kein Dateiname für Seite " & i & " gefunden. Die PDF-Datei wird übersprungen.", vbExclamation

    End If

Next i



MsgBox "PDF-Dateien wurden erfolgreich gespeichert!", vbInformation

End Sub

Entwicklertechnologien | VB
Entwicklertechnologien | VB

Eine objektorientierte Programmiersprache, die von Microsoft entwickelt wurde und in .NET verwendet werden kann.

0 Kommentare Keine Kommentare

Ihre Antwort

Antworten können von Fragestellenden als „Angenommen“ und von Moderierenden als „Empfohlen“ gekennzeichnet werden, wodurch Benutzende wissen, dass diese Antwort das Problem des Fragestellenden gelöst hat.