Excel VBA - 셀에 지정된 범위를 PDF로 인쇄하고 Outlook으로 보냅니다.

Excel VBA - 셀에 지정된 범위를 PDF로 인쇄하고 Outlook으로 보냅니다.

저는 Excel VBA에 익숙하지 않지만 지정된 셀 범위를 PDF로 인쇄하고 Outlook으로 보내는 매크로를 만들려고 합니다.

나는 다음 일을 할 수 없습니다:

  • 내 문서 N9 셀의 지정된 폴더에 저장되지 않습니다.
  • 셀 N10에 지정한 이름으로 PDF를 저장하지 않습니다.
  • 가장 중요한 점은 셀 N4에 있는 지정된 범위의 PDF가 인쇄되지 않는다는 것입니다.
  • 또한 PDF를 저장할 폴더를 지정하기 위해 해당 부분을 우회하는 방법이 있습니까? 이메일로 바로 이동하세요.

여기예제 파일

지금까지 내가 가지고 있는 코드는 다음과 같습니다. 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

답변1

"저는 Excel VBA에 대한 경험이 매우 부족합니다."
누군가 겸손해지고 있습니다.

내가 지적하고 "이것이 문제다"라고 말할 수 있는 것은 아무것도 보이지 않습니다. 하지만 귀하의 코드는 지속적으로 를 참조하고 ActiveSheet있으며 이는 매우 위험한 일이 될 수 있습니다.

그런 식으로 망치질할 때의 문제 는 그것이 당신이 기대하는 바가 무엇인지 ActiveSheet확신할 수 없다는 것입니다 . ActiveSheet나는 그것에 대해 6번의 호출을 세었습니다. 이는 활성 시트를 변경하고 프로그램을 탈선시킬 수 있는 6번의 기회입니다.

잘못된 워크시트로 작업을 시작하면 이상한 일이 발생합니다. 잘못된 셀을 읽었기 때문에 파일을 저장할 수 없는 것과 같은 것입니다. 또는 프로그램이 UsedRange잘못된 시트를 읽어서 제대로 인쇄되지 않습니다 .

이것이 문제의 원인이라고 말하는 것은 아니지만 문제를 배제할 수 있을 만큼 코드가 잘 작성되어 있지만 이 문제도 배제할 수는 없습니다.

관련 정보