Eine objektorientierte Programmiersprache, die von Microsoft entwickelt wurde und in .NET verwendet werden kann.
Excel VBA Schaltfläche erzeugt Fehler beim Drucken und Laufzeitfehler 1004
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