這三個問題都問到了 VBS 核心控制的關鍵。以下為您用最簡單、直白的方式逐一解答:
1️⃣ GetObject 的第一個參數是什麼?
GetObject( [pathname], [class] ) 一共可以帶兩個參數:- 第一個參數是「檔案路徑」:如果你有指定路徑(例如
"C:\test.docx"),電腦會直接去開啟那個檔案。 - 故意留空(沒有提供)的意思:代表不指定任何特定檔案。這時候 VBS 就不會去開新檔案,而是直接去 Windows 系統的記憶體中,尋找目前「已經在畫面上執行」的 Word 主程式(由第二個參數
"Word.Application"指定)。
2️⃣ On Error GoTo 0 是什麼意思?
簡單來說,它是恢復成「一出錯就讓程式死掉」的預設狀態。
- 程式前面寫了
On Error Resume Next:意思是「遇到錯誤不要管我,假裝沒看到,繼續執行下一行」。 - 中間寫了
On Error GoTo 0:意思是「停止上面那個假裝沒看到的報錯模式」。從這行之後,只要程式再發生任何錯誤,就會立刻跳出黃色驚嘆號並強制中斷。 - 為什麼要這樣做?:因為我們只想在「抓不到 Word 程式」時忽略錯誤(自己用代碼檢查),後面正式在存檔、關閉時,如果發生其他意外,我們希望程式立刻停下來報錯,才不會讓錯誤像滾雪球一樣變大。
3️⃣ 參數失效或失敗,是用 Err 變數控制嗎?
是的,完全正確。
在 VBS 中,
Err 是一個系統內建的全域物件(Global Object),專門用來捕捉和處理錯誤。當您發現呼叫常常失敗時,通常會搭配以下三部曲來進行精準控制:- 開啟追蹤:在呼叫可能失敗的代碼前,加上
On Error Resume Next。 - 用
Err檢查結果:Err.Number:如果不等於 0,代表剛才那行指令失敗了。Err.Description:會告訴你具體的失敗原因(例如:找不到檔案、拒絕存取)。
- 清除與重設:
Err.Clear:把錯誤記錄歸零(擦乾淨),這樣下次檢查才不會拿到舊的錯誤。On Error GoTo 0:關閉忽略錯誤的模式。
💡 寫法範例:
請問您目前在呼叫 Word 遭遇到的參數失效或失敗,是出現在指定存檔路徑的時候,還是控制特定的 Word 功能(例如轉存 PDF)的時候呢?
(Error 發生是在其他 VBS 狀況時, 先不要討論)
收到,那我們先把焦點集中在 Word 介入的處理上,暫不討論其他錯誤狀況。
針對您原本想要介入既存 Word 並將其存檔關閉的需求,以下為您整理後續的操作方向。
📁 接下來的處理關鍵
因為您的 Word 已經在執行中,當 VBS 介入並執行
objDoc.Save 時,會有以下兩種現實狀況:- 狀況 A(已有檔名):該文件原本就是從電腦某個資料夾打開的(例如
D:\報告.docx)。VBS 執行時會直接背景覆蓋存檔,完全不會打擾使用者。 - 狀況 B(全新未存檔):該文件是使用者剛剛按「新增空白文件」產生的(畫面上顯示
文件1或Document1)。這時 VBS 執行Save時,Word 預設會強行彈出「另存新檔」的視窗,等待使用者用滑鼠點選路徑。
請問您目前要處理的既存 Word 檔案,通常是狀況 A(原本就已經有路徑檔名的舊檔案),還是狀況 B(需要透過 VBS 自動幫全新的空白文件指定存檔路徑與新檔名)呢?
以下是你所說的內容:如何知道現在的文檔是有名字或者沒有?
要判斷一個 Word 文檔到底是「已經存過檔的舊檔案(有名字)」,還是「全新未存檔的空白文件(沒有名字)」,最安全且精準的方法是檢查它的
Path(路徑)屬性。以下是判斷的原理與程式碼寫法:
💡 判斷原理
- 沒有名字(全新文件):因為從來沒有存過檔,所以它的檔案路徑會是空的(
"")。 - 有名字(已存檔檔案):只要存過檔,就一定會有實體資料夾路徑(例如
"C:\Users\Username\Documents")。
📄 程式碼範例
在 VBS 迴圈檢查文檔時,加入
If objDoc.Path = "" 的條件判斷即可:vbs
' ...(前面擷取 objWord 的程式碼省略)...
Dim objDoc
' 逐一檢查所有打開的 Word 文件
For Each objDoc In objWord.Documents
If objDoc.Path = "" Then
' 【狀況 B】這是從未存檔過的新文件(例如:文件1)
' 畫面上會顯示這個名字,但因為 Path 是空的,代表沒真正存檔
MsgBox "檔案「" & objDoc.Name & "」從未存過檔(沒有真正的名字與路徑)!"
' 你可以選擇在這裡幫它指定路徑存檔,例如:
' objDoc.SaveAs2 "C:\Users\您的使用者名稱\Desktop\自動存檔_" & Timer & ".docx"
Else
' 【狀況 A】這是已經有實體路徑的檔案(例如:D:\報告.docx)
MsgBox "檔案「" & objDoc.Name & "」已經有名字了,路徑在:" & objDoc.Path
' 直接覆蓋儲存即可
' objDoc.Save
End If
Next
' ...(後面關閉的程式碼省略)...
請謹慎使用程式碼。
🔍 為什麼不用
objDoc.Name 判斷?因為即使是新文件,Word 畫面上還是會暫時顯示「文件1」或「Document1」,所以
objDoc.Name 永遠都有字串。唯獨 objDoc.Path 在沒存檔前絕對會是空的,這才是最準確的判斷依據。如果檢查到沒有名字的新文件,您會希望 VBS 直接幫它取個暫時的名字存到桌面(例如用當時的時間當檔名),還是直接跳過不處理呢?
沒有留言:
張貼留言