天天看點

Word VBA:批量轉PDF且保留書簽一、前提說明二、Word自帶轉PDF方法三、VBA代碼另存和導出和手動的差别四、批量操作代碼

目錄

一、前提說明

1.讨論範圍

2.示例文檔說明

二、Word自帶轉PDF方法

1.另存

2.列印

3.導出

(1)點選【檔案】-【導出】-【建立PDF/XPS文檔】

​(2)點選上圖右側【建立PDF/XPS文檔】,在彈出的導出按鈕中,也有【選項】按鈕,點選可以在對話框中設定導出PDF時的标簽選項

三、VBA代碼另存和導出和手動的差别

1.另存

2.導出

(1)方法

(2)參數

(3)示例代碼

四、批量操作代碼

1.示例代碼

2.注意

一、前提說明

1.讨論範圍

這裡隻讨論通過Word軟體自帶的方法完成生成PDF時建立PDF标簽的方法,外部插件不在探讨和研究範圍

2.示例文檔說明

Word VBA:批量轉PDF且保留書簽一、前提說明二、Word自帶轉PDF方法三、VBA代碼另存和導出和手動的差别四、批量操作代碼

​示例文檔

示例文檔裡面有兩處标題和一處書簽。

二、Word自帶轉PDF方法

1.另存

點選【檔案】-【另存為】,格式選【PDF】

Word VBA:批量轉PDF且保留書簽一、前提說明二、Word自帶轉PDF方法三、VBA代碼另存和導出和手動的差别四、批量操作代碼

手動【另存】菜單

​可以看到在儲存選項中,有根據标題和Word書簽建立書PDF簽選項的選項。

2.列印

點選【檔案】-【列印】,選擇虛拟列印機最好的微軟自帶的

Word VBA:批量轉PDF且保留書簽一、前提說明二、Word自帶轉PDF方法三、VBA代碼另存和導出和手動的差别四、批量操作代碼

【列印】菜單

​可以看到,在【列印機屬性】中是沒有PDF标簽的設定選項的

3.導出

(1)點選【檔案】-【導出】-【建立PDF/XPS文檔】

Word VBA:批量轉PDF且保留書簽一、前提說明二、Word自帶轉PDF方法三、VBA代碼另存和導出和手動的差别四、批量操作代碼

導出-1

​(2)點選上圖右側【建立PDF/XPS文檔】,在彈出的導出按鈕中,也有【選項】按鈕,點選可以在對話框中設定導出PDF時的标簽選項

Word VBA:批量轉PDF且保留書簽一、前提說明二、Word自帶轉PDF方法三、VBA代碼另存和導出和手動的差别四、批量操作代碼

導出-2

​綜上測試與觀察,得出結論:

手動方式中,可以通過另存和導出兩種方式,完成Word轉PDF時根據Word标題或書簽建立PDF标簽的任務。

手動建立PDF方式比較

手動建立PDF的方式 能否根據Word标題或标簽建立PDF書簽
另存
列印
導出

三、VBA代碼另存和導出和手動的差别

注:這裡以另存激活文檔(目前正打開的文檔)為PDF舉例

1.另存

另存至少需要寫兩個參數:檔案名和格式

Sub 另存PDF_不能建立書簽() 
    ActiveDocument.SaveAs2 fileName:="E:\Zhuomian_CJ\Test01.PDF", fileFormat:=wdFormatPDF
End Sub
           

但是,Word VBA另存的方法中是沒有建立PDF書簽的參數的,通過官方文檔也可以證明:

Word VBA:批量轉PDF且保留書簽一、前提說明二、Word自帶轉PDF方法三、VBA代碼另存和導出和手動的差别四、批量操作代碼

​另存方法概覽

Word VBA:批量轉PDF且保留書簽一、前提說明二、Word自帶轉PDF方法三、VBA代碼另存和導出和手動的差别四、批量操作代碼

​另存【SaveAs2】參數1

Word VBA:批量轉PDF且保留書簽一、前提說明二、Word自帶轉PDF方法三、VBA代碼另存和導出和手動的差别四、批量操作代碼

​另存【SaveAs2】參數2

此外,我們打開一個用上述這段代碼另存的一個檔案:

Word VBA:批量轉PDF且保留書簽一、前提說明二、Word自帶轉PDF方法三、VBA代碼另存和導出和手動的差别四、批量操作代碼

​檢視【另存】方法的PDF檔案有無書簽

也可以再次證明上述結論。

至此,可以總結:

如果需要用VBA批量操作,我們就隻能通過【導出】的方式達到生成PDF同時建立PDF書簽的要求。

Word VBA建立PDF方式比較

VBA建立PDF的方式 能否根據Word标題或标簽建立PDF書簽
另存
列印
導出

2.導出

(1)方法

我們可以通過【ExportAsFixedFormat】或者【ExportAsFixedFormat2】方法進行導出,二者的差別中此處可以不用管。

(2)參數

通過官方文檔,可以看到所有參數

Word VBA:批量轉PDF且保留書簽一、前提說明二、Word自帶轉PDF方法三、VBA代碼另存和導出和手動的差别四、批量操作代碼

​導出函數和參數概覽

Word VBA:批量轉PDF且保留書簽一、前提說明二、Word自帶轉PDF方法三、VBA代碼另存和導出和手動的差别四、批量操作代碼

導出【ExportAsFixedFormat2】的參數-1

​這裡,前兩個參數是導出的檔案路徑和檔案格式,必須要寫。

Word VBA:批量轉PDF且保留書簽一、前提說明二、Word自帶轉PDF方法三、VBA代碼另存和導出和手動的差别四、批量操作代碼

導出【ExportAsFixedFormat2】的參數-2

​這裡,剪頭标記的參數【CreateBookmarks】,通過說明可以看到就是選擇生成PDF時書簽的參數。

具體怎麼設定呢?點選紫色文字

Word VBA:批量轉PDF且保留書簽一、前提說明二、Word自帶轉PDF方法三、VBA代碼另存和導出和手動的差别四、批量操作代碼

​繼續看一下官方文檔:

Word VBA:批量轉PDF且保留書簽一、前提說明二、Word自帶轉PDF方法三、VBA代碼另存和導出和手動的差别四、批量操作代碼

​書簽選項枚舉

可以清楚看到,三類書簽選項的枚舉常量名稱、值及其說明,此參數根據需要選擇即可。

(3)示例代碼

A.根據Word标題建立PDF書簽

我們将文檔導出到前面示範相同的位置,格式為PDF,書簽參數選擇上圖中的第1種

Sub 導出PDF_根據Word标題建立書簽()
    ActiveDocument.ExportAsFixedFormat2 outputfilename:="E:\Zhuomian_CJ\Test01.PDF", _
        ExportFormat:=wdExportFormatPDF, createBookMarks:=wdExportCreateHeadingBookmarks
End Sub
           

我們看看生成的PDF檔案

Word VBA:批量轉PDF且保留書簽一、前提說明二、Word自帶轉PDF方法三、VBA代碼另存和導出和手動的差别四、批量操作代碼

Word标題生成的PDF書簽

可以看到,PDF中隻有Word文檔中兩處标題對應的書簽。

B.根據Word書簽建立PDF書簽

我們将文檔導出到前面示範相同的位置,格式為PDF,書簽參數選擇上圖中的第3種

Sub 導出PDF_根據Word書簽建立書簽()
    ActiveDocument.ExportAsFixedFormat2 outputfilename:="E:\Zhuomian_CJ\Test01.PDF", _
        ExportFormat:=wdExportFormatPDF, createBookMarks:=wdExportCreateWordBookmarks
End Sub
           

我們看到生成的PDF書簽效果:

Word VBA:批量轉PDF且保留書簽一、前提說明二、Word自帶轉PDF方法三、VBA代碼另存和導出和手動的差别四、批量操作代碼

​Word書簽生成的PDF書簽

可以看到隻有Word書簽的内容,和官方說明文檔完全一樣,沒有問題。

四、批量操作代碼

1.示例代碼

Rem 這裡是主程式,會對主檔案夾及其各級檔案夾下所有Word檔案執行導出操作
    '可以先把要操作的檔案整理有一個檔案夾下,以免有多餘檔案導出
Sub 批量導出PDF主程式()
    Dim fd As FileDialog
    Dim fso As Object
    Dim arr() '存儲每次周遊到的檔案夾的子檔案夾
    Dim brr() '臨時存儲每次周遊到的檔案夾的子檔案夾
    Dim crr() '存儲所有檔案夾
    Dim drr() '存儲所有Word檔案路徑
    Dim myFolder As Object
    Dim subFolder As Variant
    Dim i As Long
    Dim j As Long
    Dim m As Long
    Dim myFile As Object
    Dim 字尾 As String
    Dim t0 As Single
    Dim 書簽類型 As Long
    
    t0 = Timer
    i = 0: j = 0: m = 0
    Set fd = Application.FileDialog(msoFileDialogFolderPicker)
    Set fso = CreateObject("Scripting.FileSystemObject")

    With fd
        .Title = "選擇主檔案夾"
        If .Show Then
            i = i + 1
            ReDim Preserve crr(1 To i)
            crr(i) = .SelectedItems(1)
            arr = crr
            
            書簽類型 = CLng(Trim(InputBox("請輸入書簽類型:" & vbCrLf & "0--不建立書簽" _
                & vbCrLf & "1--根據Word标題建立書簽" & vbCrLf & "2--根據Word書簽建立書簽", "書簽類型", 1)))
            Do While Not InStr("012", CStr(書簽類型)) > 0
                Select Case MsgBox("輸入不符合要求,請:" & vbCrLf & "重新輸入(是)" & vbCrLf & "退出程式(否):", vbInformation + vbYesNo, "錯誤提示")
                    Case vbYes
                        書簽類型 = CLng(Trim(InputBox("請輸入書簽類型:" & vbCrLf & "0--不建立書簽" _
                            & vbCrLf & "1--根據Word标題建立書簽" & vbCrLf & "2--根據Word書簽建立書簽", "書簽類型", 1)))
                    Case vbNo
                        Exit Sub
                End Select
            Loop
            
            On Error Resume Next
            Do While Err.Number = 0
                For j = LBound(arr) To UBound(arr)
                    Set myFolder = fso.GetFolder(arr(j))
                    If myFolder.subFolders.Count > 0 Then
                        For Each subFolder In myFolder.subFolders
                            i = i + 1
                            ReDim Preserve crr(1 To i)
                            crr(i) = subFolder.Path
                            
                            m = m + 1
                            ReDim Preserve brr(1 To m)
                            brr(m) = subFolder.Path
                        Next
                    End If
                Next
                m = 0
                arr = brr
                Erase brr
            Loop
            On Error GoTo 0
            
            i = 0
            For j = LBound(crr) To UBound(crr)
'                Debug.Print j, crr(j)
                Set myFolder = fso.GetFolder(crr(j))
                For Each myFile In myFolder.Files
                    字尾 = fso.GetExtensionName(myFile.Path)
                    If 字尾 Like "doc*" And Not 字尾 Like "*~$*" Then
                        i = i + 1
                        ReDim Preserve drr(1 To i)
                        drr(i) = myFile.Path
                    End If
                Next
            Next
            
            For j = LBound(drr) To UBound(drr)
                Rem 此處以下為調用的處理過程
                
                Application.ScreenUpdating = False
                Call 導出PDF_建立書簽(drr(j), 書簽類型)
                Application.ScreenUpdating = True
                
                Rem 此處以上為調用的處理過程
                Debug.Print Format(j, String(Len(CStr(UBound(drr))), "0")), drr(j), "導出完成"
            Next
        End If
    End With
    
    Set fd = Nothing
    Set fso = Nothing
    Set myFolder = Nothing
    On Error Resume Next
    Debug.Print "完成   共導出" & UBound(drr) & "個檔案為PDF   用時" & Timer - t0 & "秒"
End Sub

Sub 導出PDF_建立書簽(檔案名, 書簽類型 As Long)
    Dim aDoc As Document
    Dim fso As Object
    Dim 檔案名1 As String
    
    Set aDoc = Documents.Open(檔案名)
    Set fso = CreateObject("Scripting.FileSystemObject")
    
    檔案名1 = fso.GetBaseName(檔案名)
    aDoc.ExportAsFixedFormat2 outputfilename:=aDoc.Path & "\" & 檔案名1 & ".PDF", _
        ExportFormat:=wdExportFormatPDF, CreateBookMarks:=書簽類型
    
    aDoc.Close wdDoNotSaveChanges
    Set aDoc = Nothing
    Set fso = Nothing
End Sub
           

2.注意

會對所選主檔案夾及其各級檔案夾下所有Word檔案執行導出操作。(注釋也有說明)

繼續閱讀