
Ich habe keine große Erfahrung mit Excel VBA, versuche aber, ein Makro zu erstellen, das einen Bereich angegebener Zellen als PDF druckt und über Outlook sendet.
Folgendes bekomme ich nicht zum Laufen:
- Es wird nicht im angegebenen Ordner in Zelle N9 meines Dokuments gespeichert
- Das PDF wird nicht unter dem in Zelle N10 angegebenen Namen gespeichert
- Am wichtigsten ist, dass das PDF nicht in dem angegebenen Bereich gedruckt wird, den ich in Zelle N4 habe
- Gibt es auch eine Möglichkeit, den Teil zu umgehen, in dem der Ordner angegeben werden muss, in dem die PDF gespeichert werden soll? Gehen Sie einfach direkt zur E-Mail
Hier ist dieBeispieldatei
Hier ist der Code, den ich bisher habe, ich habe keine Erfahrung mit VBA
Sub Saveaspdfandsend()
Dim xSht As Worksheet
Dim xFileDlg As FileDialog
Dim xFolder As String
Dim xYesorNo As Integer
Dim xOutlookObj As Object
Dim xEmailObj As Object
Dim xUsedRng As Range
Set xSht = ActiveSheet
Set xFileDlg = Application.FileDialog(msoFileDialogFolderPicker)
If xFileDlg.Show = True Then
xFolder = xFileDlg.SelectedItems(1)
Else
MsgBox "You must specify a folder to save the PDF into." & vbCrLf & vbCrLf & "Press OK to exit this macro.", vbCritical, "Must Specify Destination Folder"
Exit Sub
End If
xFolder = ActiveSheet.Range("n9")
xFolder = xFolder + "\" + xSht.Name + ".pdf"
'Check if file already exist
If Len(Dir(xFolder)) > 0 Then
xYesorNo = MsgBox(xFolder & " already exists." & vbCrLf & vbCrLf & "Do you want to overwrite it?", _
vbYesNo + vbQuestion, "File Exists")
On Error Resume Next
If xYesorNo = vbYes Then
Kill xFolder
Else
MsgBox "if you don't overwrite the existing PDF, I can't continue." _
& vbCrLf & vbCrLf & "Press OK to exit this macro.", vbCritical, "Exiting Macro"
Exit Sub
End If
If Err.Number <> 0 Then
MsgBox "Unable to delete existing file. Please make sure the file is not open or write protected." _
& vbCrLf & vbCrLf & "Press OK to exit this macro.", vbCritical, "Unable to Delete File"
Exit Sub
End If
End If
Set xUsedRng = xSht.UsedRange
If Application.WorksheetFunction.CountA(xUsedRng.Cells) <> 0 Then
'Save as PDF file
xSht.ExportAsFixedFormat Type:=xlTypePDF, FileName:=xFolder, Quality:=xlQualityStandard
'Create Outlook email
Set xOutlookObj = CreateObject("Outlook.Application")
Set xEmailObj = xOutlookObj.CreateItem(0)
With xEmailObj
.Display
.To = ActiveSheet.Range("n5")
.CC = ActiveSheet.Range("n6")
.Subject = ActiveSheet.Range("n7")
.HTMLBody = "<font face=" & Chr(34) & "Calibri" & Chr(34) & " size=" & Chr(34) & 4 & Chr(34) & ">" & "Good day dear Master," & "<br> <br>" & ActiveSheet.Range("n8") & "<br> <br>" & Signature & "</font>"
.Attachments.Add xFolder
If DisplayEmail = False Then
'.Send
End If
End With
Else
MsgBox "The active worksheet cannot be blank"
Exit Sub
End If
End Sub
Antwort1
"Ich bin sehr unerfahren mit Excel VBA"
Da ist aber jemand bescheiden.
Ich sehe nichts, worauf ich zeigen und sagen könnte: „Das ist das Problem“, aber Ihr Code verweist ständig darauf ActiveSheet
und das kann sehr gefährlich sein.
Das Problem bei ActiveSheet
dieser Art des Hämmerns ist, dass Sie nicht sicher sein können, ob es das ActiveSheet
ist, was Sie erwarten. Ich habe 6 Aufrufe dafür gezählt, das sind 6 Möglichkeiten, dass eine beliebige Anzahl von Dingen das aktive Blatt ändert und Ihr Programm entgleisen lässt.
Wenn Sie mit dem falschen Arbeitsblatt zu arbeiten beginnen, passieren merkwürdige Dinge. Beispielsweise kann eine Datei nicht gespeichert werden, weil die falsche Zelle gelesen wurde. Oder der Ausdruck funktioniert nicht richtig, weil das Programm das UsedRange
falsche Blatt liest.
Nun, ich sage nicht, dass dies die Ursache des Problems ist, aber Ihr Code ist gut genug geschrieben, dass ich ein Problem ausschließen kann, und dieses kann ich nicht ausschließen.