2022/02/28

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

延續前面 

VBA / 使用Excel VBA將Word轉換成PDF 

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

結合原始版本─Ppt批次轉換成PDF,跟修改的版本─Word批次轉換成PDF

其實就是用判斷式來處理,如果副檔名是doc或docx就執行Word轉檔,否則就執行Ppt轉檔

由於在原始程式裡面就有透過尋找”.”來找出檔名的程式判斷

因此,只需要改用MID()就可以找出副檔名

由於原始程式是別人的,所以還是只說明有修改的部分

Filename = Range("b" & i)
        
n = rinstr(Filename, ".")
        
'檔案名稱
strFileName = Left(Filename, n - 1)
        
'副檔名
extendFileName = Mid(Filename, n + 1)

 

原始程式在選取檔案的時候,會分別將資料夾路經跟含副檔名完整的檔案名稱寫入資料表的A欄與B攔

因此在轉檔的時候,程式會去抓取B欄的完整檔案名稱

透過自訂函數rinstr()找出”.”的位置,再透過Left()函數取出檔案名稱,而這是為了之後另存新檔用的

所以只需要根據已經找出”.”的位置,改用Mid()函數,就能夠找出副檔名

(Mid()如果省略第3個引數,就會傳回從第2個引數指定的位置開始一直到字串結尾的所有字元)

原始版會顯示開啟的檔案,我改成隱藏

之前在使用的時候,曾經遇到開啟的檔案因為崁入電腦沒有的特殊字型,會詢問是否用唯讀的方式,這樣會中斷程式執行

所以我直接改成用唯讀的方式來開啟,只是不知道這樣有沒有用

Set ppPres = ppApp.Presentations.Open(Filename:=Fullpath & Filename, ReadOnly:=True, WithWindow:=msoFalse)

備註

VBA If判斷式 如果要再加上Or 或者And比較

必須是 If 變數1=條件1 Or 變數1=條件2

也就是即使是相同的變數,都要完整地列出來

參考:[求助] 关于IF语句中and和or用法的求助!

 

參考資源

VBA Excel FileDialog to set/reset filters

How can I programmatically open Powerpoint without seeing the window?

簡報內嵌字型為什麼會失敗?

PowerPoint: Remove Embedded Fonts

How to check whether the presentation contains some non-standard font?

Presentation.SaveAs 方法 (PowerPoint)

2022/02/27

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?