VBA / 使用Excel VBA將Word轉換成PDF 修改版

延續上一篇 VBA / 使用Excel VBA將Word轉換成PDF

這次要修改彰化一整天的檔案

達成Word批次轉換成PDF的功能

由於是修改別人的檔案,因此就只呈現修改的部分

主要程序有三個

Public Sub cmdClear()
Public Sub cmdConvertPDF()
Public Sub cmdSelectFile()

以及一個自訂函數Function rinstr(),用來取得 \ 或 . 的位置

這次的修改是從PPT轉檔改成Word轉檔

所以只要修改Public Sub cmdConvertPDF()就可以了

首先是引用物件的宣告要改成引用Word library

Dim wordapp As Word.Application '宣告為Microsoft Word 檔
Dim wordfile As Word.Document   '宣告為Word的Document物件

 

這裡是如果沒有引用的話, 忽略報錯並設定物件的引用

On Error Resume Next            '忽略後續程式的報錯
Set wordapp = GetObject(, "word.Application")
If wordapp Is Nothing Then
	Set wordapp = CreateObject("word.Application")
End If
On Error GoTo 0                 '恢復預設狀態,即開始報錯

 

轉檔的部分,基本上就是前一篇的方式

這邊我加了2個判斷式

用來判斷是否為受保護檢視,以及是否有追蹤修訂

'wordapp.Visible = True
wordapp.Visible = False
'wordapp.Activate

'判斷是否為受保護檢視
If ProtectedViewWindows.Count > 0 Then
   ProtectedViewWindows(1).Edit
End If
        
'判斷是否有追蹤修訂,如果有則全部接受
If wordfile.Revisions.Count >= 1 Then
   wordfile.Revisions.AcceptAll
End If

 

Public Sub cmdConvertPDF()跟Public Sub cmdSelectFile()中會引用Function rinstr()

從程序傳入兩個參數

一個是檔案的完整路徑的字串

一個是要取得位置的字元,例如:\ 跟 .

透過字串長度的迴圈,逐一利用Mid來比對是否符合,如果符合就把字元位置記錄下來

因為整個迴圈跑完就會知道目標字元所在的最後位置,也就是最後一個符合字串的位置

目的是用來切割字串,方便後面取得檔案名稱或者路徑

蠻奇妙的方式

在Public Sub cmdSelectFile()中使用了內建函數 InStr,剛好是相反的功能

是取得搜尋字串中出現的第一個目標字串位置

備註:

之前一直搞不懂為什麼 方法( 引數 )  跟 方法 引數,例如:MsgBox( 引數 )  跟MsgBox 引數

這兩者有什麼不同

後來才知道如果前面有個變數用來接收回傳值時,引數就需要用括號包起來

例如:result = MsgBox( 引數 ) 

參考:在程式碼中使用括號

 

其實我還是搞不太清楚

Dim wordapp As Word.Application 是宣告為Microsoft Word 檔,並非是Word裡的Application物件

或者可能Word裡的Application物件本身就是代表Microsoft Word 檔

參考:在 Microsoft Office 應用程式中控制其他 Microsoft Office 應用程式

參考:Application 物件 (Word)
 

參考資源

如何用vba判断打开的文件是否处于受保护视图?

How to use Word Object when Protected View is on?