Share via


嗨,Scripting Guy!

嗨,Scripting Guy!

歡迎使用 TechNet 專欄,Microsoft Scripting Guys 會在此為您解答有關系統管理指令碼的常見問題。您有關於系統管理指令碼方面的問題嗎?請將電子郵件傳送到 scripter@microsoft.com。我們無法保證能夠逐一回答每個問題,不過我們會盡力而為。

今天的問題:如何得知 Excel 活頁簿是否開啟,如果沒有開啟,又該如何開啟它?


如何判別 Excel 活頁簿是否開啟,如果沒有開啟,又該如何開啟它?

嗨,Scripting Guy! 我要如何判別 Excel 活頁簿是否開啟,如果沒有開啟,又該如何開啟它?

-- RK

RK,您好。我們偶爾看到一個問題時會想,「這個問題我來就行了;像這麼簡單的問題,要不了幾分鐘就搞定,剩下的時間就留著好好吃頓午飯。」可是只要我們這麼一想,它就偏偏不如我們想的簡單,也不是區區幾分鐘就能解決。不過,我們總是不明白,為什麼每次遇到這個問題都要傷透腦筋。

當然,我們還是打算享用大餐,不過那就跟這個沒關係了。

我們是怎麼卡在這裡的? 我們都知道 Excel 的 Workbooks 集合,可以傳回所有開啟的活頁簿清單。蠢在我們都假設它代表所有開啟的活頁簿 (對,我們也知道大家說的假設是什麼意思)。

很不巧,Workbooks 集合只適用於特定的 Excel 執行個體;換句話說,只建立新的 Excel 執行個體,根本沒辦法獲得所有開啟的活頁簿清單,必須一一繫結到每一個執行中的 Excel 執行個體,查詢其 Workbooks 集合,然後將那些集合全部納入一份清單中才行。理論上這是可行的,不過…

所以我們就想:「算了,那是因為我們沒辦法解決 Microsoft Excel 的問題嘛,碰到不會使用 Excel 的情況時,大部份的人會怎麼做呢?」只要我們這麼一想,答案就呼之欲出了: 就用 Microsoft Word 來脫離苦海吧。

沒錯,Microsoft Word。您也知道,Word 擁有 Tasks 集合,可以複製許多 Windows 工作管理員的功能 (如果想再深入探討 Tasks 集合,請參閱 Scripting for Microsoft Office Center 的《Build Your Own Task Manager Using Microsoft Word》(英文) 一文)。如您所見,[工作管理員] 會依檔名顯示開啟的活頁簿名稱:

 

工作管理員


我們想說可以在 Word 使用 Tasks 集合,看看特定的活頁簿是否開啟,如果沒有開啟,就開啟它。可是它們卻產生了最最不可思議的方案可以暫時解決這個問題,連 Scripting Guy 都想不到:

Set objShell = CreateObject("Wscript.Shell")
Set objWord = CreateObject("Word.Application")
Set colTasks = objWord.Tasks
i = 0
For Each objTask in colTasks
    strName = LCase(objTask.Name)
    If Instr(strName, "inventory.xls") Then
        i = 1
    End If
Next
strCmdLine = "excel.exe " & chr(34) & "C:\Scripts\Inventory.xls" & chr(34)
If i = 0 Then
    objShell.Run strCmdLine, 3
End If
objWord.Quit

指令碼看起來沒什麼問題:我們只要建立一個 WSH Shell 物件的執行個體就行了 (必要時,可以用它來開啟有問題的活頁簿)。然後再建立 Word.Application 物件的執行個體,利用 Tasks 屬性來擷取目前在電腦上執行的工作集合 (這些工作包括所有您在 [工作管理員] 的 [應用程式] 索引標籤中看到的項目)。我們也會把一個名叫 i 的變數設為 0,原因待會馬上就為您解說。

接著就對工作集合的每一個工作重複同樣的步驟,先抓取一個工作,將小寫版的工作名稱儲存在名叫 strName 的變數中;如下所示:

strName = LCase(objTask.Name)

然後再使用 VBScript 的 InStr 函式,看看能不能在工作名稱中找到「inventory.xls」字串。如果找到了,就表示 Inventory.xls 已經開啟,我們可以把 i 值設為 1。如果找不到,就表示 Inventory.xls 尚未開啟,i 的值仍然保持為 0。接下來就是對其他的工作重複同樣的步驟。

結束迴圈時,會檢查一下 i 的值。如果 i 等於 0,就要執行兩個動作。首先要建立一個命令字串來呼叫 Excel.exe,把通往 Inventory.xls 的路徑作為命令列參數。如下所示:

strCmdLine = "excel.exe " & chr(34) & "C:\Scripts\Inventory.xls" & chr(34)

接下來,再以 Run 方法呼叫這個命令字串。除了命令字串之外,還要再加上另一個 Run 參數: 3 這個值,代表「在最大化視窗中開啟這個檔案,並且讓它成為作用中的視窗」。接著就呼叫 Quit 方法,結束 Microsoft Word (這些都不會出現在畫面上),然後就可以各忙各的。

對,我們都知道這個方法聽起來很不可思議,不過它就是行得通。當然它也並非絕對沒問題;那是因為 Tasks 集合只會抓取檔名,而不是完整的檔案路徑。如果您是開啟 D:\Archive\Old Inventory Files\January 2004\Inventory.xls 檔,可能就會發生問題;這個指令碼只會看到檔案名稱 – Inventory.xls,並且假設 C:\Scripts\Inventory.xls 已經開啟了。我們都認為總有一天會解決這個問題,只是不知道要等到什麼時候。


如需詳細資訊

查看嗨,Scripting Guy!- 過往文件

 

回到頁首 回到頁首