Scripting Guy 為您解答問題

Hey, Scripting Guy!

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

資源

如何在開啟 Excel 試算表時移除密碼?

Hey, Scripting Guy! Question

嗨,Scripting Guy!如何在開啟 Excel 試算表時移除密碼?


        -- JE

Hey, Scripting Guy! Answer

JE,您好。您知道嗎?有件大事終於發生了:在撰寫本專欄兩年半之後,我們終於再也想不出什麼好寫了。那個可以告知您是否有人躲在車子後座的「心跳感應器」呢?我們大約一週以前就已經討論過了 (英文)。棒球傳奇人物:綽號「全壘打」的 Frank Baker 的輝煌戰績呢?老掉牙的新聞了。我們很久以前也討論過了 (英文)。「祖父母日」的由來呢?套句老話:這已經是陳年往事 (英文) 了。

事實上,就我們所知,我們幾乎已經討論過所有主題了(呃,我們應該可以重新回顧一下。不過,Scripting Editor 不太喜歡我們談論她的掃把。此外,我們已經在某個專欄中提到這點)。老實說,真的沒有任何主題可以談論了。下個禮拜或下個月再問問我們好了。到時候可能會有點東西值得與您分享。

不過,仔細想想,我們還有一件事沒試過:我們可以單純地回答問題,而不用閒聊,例如 Scripting Guy 騎健身腳踏車的瀕死經驗 (英文)。雖然這有點不符合本專欄的特色,但是我們認為值得一試。儘管如此,我們也不想要讓這點成為習慣。畢竟,如果所有專欄的討論內容都是有關指令碼的東西,您還會想要閱讀每日指令碼專欄嗎?反正,Scripting Guy 永遠會給新事物一次嘗試的機會:


Set objExcel = CreateObject("Excel.Application") 

objExcel.Visible = TRUE 
objExcel.DisplayAlerts = FALSE

Set objWorkbook = objExcel.Workbooks.Open("C:\Scripts\Test.xls",,,,"L$6tg4HHE")

objWorkbook.Password = ""
objWorkbook.SaveAs "C:\Scripts\Test.xls"


您知道哪些電視廣告快把我們搞瘋了嗎?就是那個 - 喔,抱歉。習慣成自然。我們說過今天只談論指令碼,對吧?好,在這種情況下,我們擁有一份已經受到密碼保護的 Excel 試算表 (C:\Scripts\Test.xls)(我們假設只有設定可開啟檔案的密碼。如果您也設定了可修改檔案的密碼,就必須輸入該密碼)。若要開啟試算表,您必須提供密碼:L$6tg4HHE(沒錯,這 Scripting Editor 的中間名。感謝您注意到這點)。我們需要一個可進行兩項動作的指令碼:開啟試算表 (系統將要求我們提供密碼),然後移除密碼保護。這辦得到嗎?讓我們來看一下。

不過,該做的事還是要先做。那麼,克里夫蘭的天氣如何呢?整個四月都在下雪嗎?真糟。不過,往好的方面來看,4 場比賽因大雪取消確實讓「西雅圖水手隊」過了幾天不必輸球的日子。不用說,一旦他們再度開始比賽,一定會慘敗-

抱歉,這比我們想像得要困難。該是專注於手上工作的時候了。如您所見,我們一開始會建立 Excel.Application 物件的執行個體。然後,我們將 Visible 屬性設定為 True 並將 DisplayAlerts 屬性設定為 False。將 Visible 屬性設定為 True 只是確保我們能夠在螢幕上檢視 Excel 的執行個體。同時,將 DisplayAlerts 設定為 False 則會在指令碼執行時,隱藏 Excel 訊息方塊和警告的顯示。我們是否真的要這樣做?或許不用。不過,當我們準備要儲存試算表時,Excel 預設會通知我們 Test.xls 的複本已經存在,並詢問我們是否真的想要覆寫現有的複本。我們不想要處理該訊息方塊,所以將 DisplayAlerts 設定為 False 可確保我們不用這樣做。

一旦 Excel 開啟並執行 (而且可能已設定完成) 時,我們接著要使用下面這行程式碼來開啟檔案 C:\Scripts\Test.xls:


Set objWorkbook = objExcel.Workbooks.Open("C:\Scripts\Test.xls",,,,"L$6tg4HHE")


請注意我們在這裡進行的動作。在此,我們將呼叫 Workbooks.Open 方法,後面接著想要開啟之檔案的完整路徑。這應該很簡單。然後,我們設有一些逗號 (逗號之間沒有任何內容),後面接著試算表密碼:


,,,, "L$6tg4HHE"


這些內容是要做什麼?呃,Open 方法會接受許多參數,而其中大部分都是選擇性參數。我們對於參數 2 至 4 (UpdateLinks、ReadOnly 和 Format) 沒有興趣。不過,我們對於參數 5 (Password) 興趣。那麼,為什麼我們不單獨列出有興趣的兩個參數就好,像下面這樣:


Set objWorkbook = objExcel.Workbooks.Open("C:\Scripts\Test.xls","L$6tg4HHE")


您的想法完全正確:藉由行程式碼,密碼就會顯示在針對參數 2 所保留的空位中。但是,您可能會想,這樣做沒有用啊。不過,該密碼必須是提供給 Open 方法的第五個參數。此外,確保密碼會顯示成第五個參數的唯一方法就是在檔案路徑與密碼之間加入空白的參數。也就是,一組逗號 (逗號之間沒有任何內容)。

這種說明方式真的很複雜。難怪我們不想要經常這樣做!

假設我們已提供正確的密碼,至此已完成兩部分程序的步驟 1 了:我們將擁有已開啟的 Test.xls。現在剩下的作業就是移除密碼保護。為了完成作業,我們要先將活頁簿的 Password 屬性值設定為沒有任何內容:


objWorkbook.Password = ""


然後,為了確保系統會套用變更並移除密碼,我們要呼叫 SaveAs 方法,仔細地使用現有的檔案名稱和檔案路徑來儲存檔案:


objWorkbook.SaveAs "C:\Scripts\Test.xls"


這樣會產生什麼結果呢?假設我們繼續並關閉 Test.xls,然後嘗試重新開啟此檔案。我們是否必須提供密碼才能開啟試算表呢?拜託,您對 Scripting Guy 沒有信心嗎?

好吧,您說得沒錯。但是,至少您能在不提供密碼的情況下開啟試算表。

那麼,我們已經完成了,不是嗎?我們必須承認這一次有趣的練習。不過,可能只有一次。畢竟,Scripting Guy 的生活豐富又精彩,所以不久之後一定會發生值得談論的事情。

好了,這也沒有說錯。從另一方面來講,沒有事情好聊這點對我們而言從來就不是問題,不是嗎?明天請密切留意另一則令人興奮的《嗨,Scripting Guy!》吧。

顯示: