ذخیره فایل اکسل به صورت 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) ایجاد خواهد گردید و ماکرو متوقف خواهد شد.

برای رفع مشکل بالا میتوانید از تابع کمکی زیر استفاده کنید و نام شیت اکسل را قبل از استفاده در بعنوان نام فایل از کاراکترهای غیرمجاز تمیز کنید. این تابع کاراکترهای غیرمجاز (آرایه 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
ایجاد و اجرای ماکروها در اکسل
- وارد منوی Developer شوید و گزینه Visual Basic را انتخاب کنید. اطلاعات بیشتر درباره نحوه فعال کردن منوی Developer را میتوانید در صفحه چگونه سربرگ توسعه دهنده را در اکسل فعال نمایم؟ مشاهده نمایید.
- از منوی Insert، گزینه Module را انتخاب کنید تا یک ماژول جدید ایجاد شود. آموزش تصویری نحوه افزودن ماژول استاندارد در VBA را میتوانید در صفحه ماژول در VBA مشاهده نمایید.
- روی آیکون Module1 از پنجره Project Explorer دوبار کلیک نمایید تا پنجره کد مربوط به این ماژول باز شود. (برای آشنایی بیشتر با ویرایشگر کد VBA یا VBE میتوانید این صفحه را مشاهده نمایید)
- کد زیر را در پنجره کد 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
کاربردهای واقعی (مثال ایرانی)
- ارسال خودکار گزارشهای حسابداری ماهانه به مدیران سازمان.
- ذخیره و بایگانی صورت وضعیت پروژههای دولتی در قالب PDF.
- تهیه سریع فاکتور فروش برای مشتریان بدون نیاز به تنظیمات دستی.
جمعبندی و پیشنهادات
- متد
ExportAsFixedFormatهسته اصلی تبدیل اکسل به PDF است. - میتوانید با ترکیب این کدها، سیستمهای اتوماسیون مالی یا گزارشگیری خودکار بسازید.
- برای راحتی کاربر، یک دکمه (Form Control Button) روی شیت قرار دهید و ماکروهای بالا را به آن متصل کنید.
بیشتر بخوانید
چگونه در VBA به دادههای یک فایل اکسل دیگر دسترسی پیدا کنیم؟
آموزش جامع تبدیل تاریخ شمسی به میلادی و بالعکس در VBA
چگونه دادهها را در اکسل با VBA مرتبسازی چندسطحی کنیم؟
چگونه چند شیت اکسل را با VBA در یک شیت ادغام کنیم
اتصال VBA به MYSQL | انتقال داده ها از MYSQL به اکسس و اکسل
افزودن متغیر به رشته | چگونه متغیر را به یک رشته ثابت اضافه نمایم؟
ماکرو در اکسل | چگونه در اکسل ماکرو ایجاد، ذخیره و اجرا نمایم؟