You are currently viewing چگونه فایل اکسل را با VBA به PDF تبدیل کنیم؟
کاور پست آموزشی تبدیل فایل‌های Excel به PDF با استفاده از کدنویسی VBA

چگونه فایل اکسل را با VBA به PDF تبدیل کنیم؟

ذخیره فایل اکسل به صورت PDF یکی از نیازهای رایج کاربران است، به‌ویژه هنگام ارسال گزارش‌های مالی یا مستندات رسمی که نباید ویرایش شوند. در این پست راه‌حل‌های ساده تا پیشرفته کدنویسی VBA برای تبدیل اکسل به PDF را یاد می‌گیرید؛ از تبدیل یک شیت ساده گرفته تا پرینت چند صفحه جداگانه و مدیریت مسیر ذخیره‌سازی.

روش‌های معمول ذخیره PDF در اکسل (بدون VBA)

اکسل به صورت پیش‌فرض امکان ذخیره فایل به فرمت PDF را دارد: از منوی File → Save As → PDF یا File → Export → Create PDF/XPS می‌توانید شیت یا کل ورک‌بوک را به PDF تبدیل کنید. اما این روش دستی است و برای تکرارهای زیاد، گزارش‌های روزانه یا فایل‌های چندبخشی وقت‌گیر است. اینجاست که VBA با اتوماسیون خود، زمان را نجات می‌دهد.

کد ساده‌ی VBA برای ذخیره شیت فعال به PDF

این کد، شیت فعال را با همان نام فایل اکسل در همان مسیر ذخیره می‌کند:

Sub SaveActiveSheetAsPDF()
    Dim FilePath As String
    FilePath = ThisWorkbook.Path & "\" & "شیت_فعال.pdf"
    ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=FilePath
    MsgBox "فایل با موفقیت ذخیره شد: " & FilePath
End Sub
  • ThisWorkbook.Path : مسیر فایل اکسل جاری
  • ActiveSheet : فقط شیت فعال
  • ExportAsFixedFormat : متد اصلی برای خروجی گرفتن PDF

انتخاب چند شیت و تبدیل آنها در یک فایل PDF واحد

برای ذخیره چند شیت در یک فایل PDF:

Sub SaveMultipleSheetsAsPDF()
    Dim SheetsToPrint As Variant
    SheetsToPrint = Array("Financial Report", "Credit note invoice") 'نام شیت‌ها
    Sheets(SheetsToPrint).Select
    ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, _
        Filename:=ThisWorkbook.Path & "\چند_شیت.pdf"
    Sheets(1).Select 'برگشت به حالت عادی
End Sub

ذخیره و تبدیل هر شیت در یک فایل PDF جداگانه

Sub SaveAllSheetsAsSeparatePDFs()
    Dim ws As Worksheet
    Dim Filename As String
    
    For Each ws In ThisWorkbook.Worksheets
        Filename = ThisWorkbook.Path & "\" & ws.Name & ".pdf"
        ws.ExportAsFixedFormat Type:=xlTypePDF, Filename:=Filename
    Next ws

    MsgBox "با موفقیت انجام شد."
End Sub

نکته مهم:

در صورتی که نام شیت شامل کاراکترهای غیرمجاز در نام فایل نظیر "\", "/", ":", "*", "?", """", "<", ">", "|" باشد، ماکرو با موفقیت به پایان نخواهد رسید و خطای حین اجرای -2147024773(8007007b) ایجاد خواهد گردید و ماکرو متوقف خواهد شد.

پیام خطای "Document not saved" در VBA اکسل
پنجره پیام خطای حین اجرای VBA که عدم موفقیت در ذخیره‌سازی سند را نشان می‌دهد.

برای رفع مشکل بالا می‌توانید از تابع کمکی زیر استفاده کنید و نام شیت اکسل را قبل از استفاده در بعنوان نام فایل از کاراکترهای غیرمجاز تمیز کنید. این تابع کاراکترهای غیرمجاز (آرایه InvalidChars) را در رشته s (ورودی تابع) را با کاراکتر زیرخط (_) جایگزین می‌نماید.

Private Function CleanFileName(s As String) As String
    Dim InvalidChars As Variant
    Dim i As Long
    InvalidChars = Array("\", "/", ":", "*", "?", """", "<", ">", "|")
    For i = LBound(InvalidChars) To UBound(InvalidChars)
        s = Replace(s, InvalidChars(i), "_")
    Next i
    s = Trim(s)
    If Len(s) = 0 Then s = "Sheet"
    CleanFileName = s
End Function

Sub SaveAllSheetsAsSeparatePDFs()
    Dim ws As Worksheet
    Dim Filename As String
    
    For Each ws In ThisWorkbook.Worksheets
        Filename = ThisWorkbook.Path & "\" & CleanFileName(ws.Name) & ".pdf"
        ws.ExportAsFixedFormat Type:=xlTypePDF, Filename:=Filename
    Next ws

    MsgBox "با موفقیت انجام شد."
End Sub

تعیین نام فایل و مسیر به صورت پویا

ذخیره فایل با تاریخ روز:

Sub SaveWithDate()
    Dim FileName As String
    FileName = "گزارش_" & Format(Date, "yyyy-mm-dd") & ".pdf"
    ThisWorkbook.ExportAsFixedFormat Type:=xlTypePDF, _
        Filename:=ThisWorkbook.Path & "\" & FileName
End Sub

پرینت و تبدیل به PDF با استفاده از فایل دیالوگ

کاربر می‌تواند مسیر دلخواه را انتخاب کند:

Sub SavePDFWithDialog()
    Dim FilePath As Variant
    FilePath = Application.GetSaveAsFilename( _
                InitialFileName:="گزارش.pdf", _
                FileFilter:="PDF Files (*.pdf), *.pdf")
    If FilePath <> False Then
        ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=FilePath
        MsgBox "فایل در مکان انتخابی ذخیره شد."
    End If
End Sub

پرینت یک شیت به چند فایل با Page Break

هر صفحه در یک فایل PDF مجزا ذخیره می‌شود:

Sub ExportByPageBreaks()
    Dim ws As Worksheet, rng As Range
    Dim pb As HPageBreak, startRow As Long, endRow As Long
    Dim i As Long, FilePath As String
    
    Set ws = ActiveSheet
    FilePath = ThisWorkbook.Path & "\Page_"
    startRow = 1
    i = 1
    
    For Each pb In ws.HPageBreaks
        endRow = pb.Location.Row - 1
        Set rng = ws.Rows(startRow & ":" & endRow)
        rng.ExportAsFixedFormat Type:=xlTypePDF, _
            Filename:=FilePath & i & ".pdf"
        startRow = pb.Location.Row
        i = i + 1
    Next pb
    
    'صفحه آخر
    Set rng = ws.Rows(startRow & ":" & ws.UsedRange.Rows.Count)
    rng.ExportAsFixedFormat Type:=xlTypePDF, _
        Filename:=FilePath & i & ".pdf"
        
    MsgBox "ذخیره " & i & " صفحه کامل شد."
End Sub

مدیریت خطا

برای جلوگیری از توقف برنامه در صورت بروز مشکل:

Sub SavePDF_WithErrorHandling()
    On Error GoTo ErrHandler
    ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=ThisWorkbook.Path & "\Test.pdf"
    MsgBox "با موفقیت انجام شد."
    Exit Sub
ErrHandler:
    MsgBox "خطا: " & Err.Description
End Sub

ایجاد و اجرای ماکروها در اکسل

  1. وارد منوی Developer شوید و گزینه Visual Basic را انتخاب کنید. اطلاعات بیشتر درباره نحوه فعال کردن منوی Developer را می‌توانید در صفحه چگونه سربرگ توسعه دهنده را در اکسل فعال نمایم؟ مشاهده نمایید.
  2. از منوی Insert، گزینه Module را انتخاب کنید تا یک ماژول جدید ایجاد شود. آموزش تصویری نحوه افزودن ماژول استاندارد در VBA را می‌توانید در صفحه ماژول در VBA مشاهده نمایید.
  3. روی آیکون Module1 از پنجره Project Explorer دوبار کلیک نمایید تا پنجره کد مربوط به این ماژول باز شود. (برای آشنایی بیشتر با ویرایشگر کد VBA یا VBE می‌توانید این صفحه را مشاهده نمایید)
  4. کد زیر را در پنجره کد Module1 کپی نمایید.

کدهای VBA تبدیل اکسل به PDF

'=== 1. Save the active sheet as a PDF ===
Sub SaveActiveSheetAsPDF()
    Dim FilePath As String
    FilePath = ThisWorkbook.Path & "\" & "شیت_فعال.pdf"
    ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=FilePath
    MsgBox "فایل با موفقیت ذخیره شد: " & FilePath
End Sub

'=== 2. Save multiple specific sheets as one PDF ===
Sub SaveMultipleSheetsAsPDF()
    Dim SheetsToPrint As Variant
    SheetsToPrint = Array("Financial Report", "Credit note invoice") 'نام شیت‌ها
    Sheets(SheetsToPrint).Select
    ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, _
        Filename:=ThisWorkbook.Path & "\چند_شیت.pdf"
    Sheets(1).Select 'برگشت به حالت عادی
End Sub

'=== 3. Helper function to clean invalid file name characters ===
Private Function CleanFileName(s As String) As String
    Dim InvalidChars As Variant
    Dim i As Long
    InvalidChars = Array("\", "/", ":", "*", "?", """", "<", ">", "|")
    For i = LBound(InvalidChars) To UBound(InvalidChars)
        s = Replace(s, InvalidChars(i), "_")
    Next i
    s = Trim(s)
    If Len(s) = 0 Then s = "Sheet"
    CleanFileName = s
End Function

'=== 4. Save all sheets as separate PDF files ===
Sub SaveAllSheetsAsSeparatePDFs()
    Dim ws As Worksheet
    Dim Filename As String
    
    For Each ws In ThisWorkbook.Worksheets
        Filename = ThisWorkbook.Path & "\" & CleanFileName(ws.Name) & ".pdf"
        ws.ExportAsFixedFormat Type:=xlTypePDF, Filename:=Filename
    Next ws

    MsgBox "با موفقیت انجام شد."
End Sub

'=== 5. Save the entire workbook with current date in the file name ===
Sub SaveWithDate()
    Dim FileName As String
    FileName = "گزارش_" & Format(Date, "yyyy-mm-dd") & ".pdf"
    ThisWorkbook.ExportAsFixedFormat Type:=xlTypePDF, _
        Filename:=ThisWorkbook.Path & "\" & FileName
End Sub

'=== 6. Save using a Save As dialog (user selects location) ===
Sub SavePDFWithDialog()
    Dim FilePath As Variant
    FilePath = Application.GetSaveAsFilename( _
                InitialFileName:="گزارش.pdf", _
                FileFilter:="PDF Files (*.pdf), *.pdf")
    If FilePath <> False Then
        ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=FilePath
        MsgBox "فایل در مکان انتخابی ذخیره شد."
    End If
End Sub

'=== 7. Save each page (based on horizontal page breaks) as a separate PDF ===
Sub ExportByPageBreaks()
    Dim ws As Worksheet, rng As Range
    Dim pb As HPageBreak, startRow As Long, endRow As Long
    Dim i As Long, FilePath As String
    
    Set ws = ActiveSheet
    FilePath = ThisWorkbook.Path & "\Page_"
    startRow = 1
    i = 1
    
    For Each pb In ws.HPageBreaks
        endRow = pb.Location.Row - 1
        Set rng = ws.Rows(startRow & ":" & endRow)
        rng.ExportAsFixedFormat Type:=xlTypePDF, _
            Filename:=FilePath & i & ".pdf"
        startRow = pb.Location.Row
        i = i + 1
    Next pb
    
    'صفحه آخر
    Set rng = ws.Rows(startRow & ":" & ws.UsedRange.Rows.Count)
    rng.ExportAsFixedFormat Type:=xlTypePDF, _
        Filename:=FilePath & i & ".pdf"
        
    MsgBox "ذخیره " & i & " صفحه کامل شد."
End Sub

'=== 8. Save with basic error handling ===
Sub SavePDF_WithErrorHandling()
    On Error GoTo ErrHandler
    ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=ThisWorkbook.Path & "\Test.pdf"
    MsgBox "با موفقیت انجام شد."
    Exit Sub
ErrHandler:
    MsgBox "خطا: " & Err.Description
End Sub

فیلم آموزشی تبدیل اکسل به PDF با استفاده از ‌VBA

فیلم آموزش مرحله‌به‌مرحله ایجاد و اجرای ماکروهای VBA برای ذخیره فایل‌های Excel به صورت PDF

کاربردهای واقعی (مثال ایرانی)

  • ارسال خودکار گزارش‌های حسابداری ماهانه به مدیران سازمان.
  • ذخیره و بایگانی صورت وضعیت پروژه‌های دولتی در قالب PDF.
  • تهیه سریع فاکتور فروش برای مشتریان بدون نیاز به تنظیمات دستی.

جمع‌بندی و پیشنهادات

  • متد ExportAsFixedFormat هسته اصلی تبدیل اکسل به PDF است.
  • می‌توانید با ترکیب این کدها، سیستم‌های اتوماسیون مالی یا گزارش‌گیری خودکار بسازید.
  • برای راحتی کاربر، یک دکمه (Form Control Button) روی شیت قرار دهید و ماکروهای بالا را به آن متصل کنید.

دیدگاهتان را بنویسید