官术网_书友最值得收藏!

2.3 使用WshShell操作注冊表

WshShell對象可以運行程序、操作注冊表、創建快捷方式、訪問系統文件夾、管理環境變量等。

要在VBA中使用該對象,需要向工程添加外部引用“Windows Script Host Object Model”,如圖2-26所示。

圖2-26 添加外部引用

代碼中聲明為:

    Dim WS As New IWshRuntimeLibrary.WshShell

后期綁定方式為:

    Set WS = CreateObject("WScript.Shell")

WshShell對象中,用于操作注冊表的函數有如下三個。

 RegRead:讀注冊表項。

 RegWrite:寫注冊表項。

 RegDelete:刪除注冊表項。

2.3.1 讀注冊表項

在使用RegRead函數時,只需要一個注冊表項的完整路徑即可返回注冊表值。

Excel 2013的宏安全性設置其實是保存在注冊表中的,通過查看注冊表編輯器,按照如下路徑可以找到Security節點,如圖2-27所示。

    HKEY_CURRENT_USER\Software\Microsoft\Office\15.0\Excel\Security

圖2-27 注冊表信息

可以看到下面有一個Key為VBAWarnings,Key的取值對應于Excel宏安全性的設置(從上到下的4個單選按鈕對應的屬性值依次是4、2、3、1),如圖2-28所示。

圖2-28 VBA安全性級別與注冊表的對應關系

也就是說,手工在Excel中修改了宏安全性級別,注冊表會同步變化;反之,通過注冊表修改VBAWarnings的屬性值,Excel的宏安全性也同步發生變化。

下面的代碼用來判斷當前Excel的宏安全性。

以上代碼運行后,返回一個十進制數1,表示“啟用所有宏”。

注意 如果RegRead函數中的注冊表路徑不存在,則會彈出“自動化”錯誤,如圖2-29所示。

為了確保注冊表路徑書寫不出問題,可以在注冊表編輯器中右擊節點,在彈出菜單中選擇“復制項名稱”命令,可以把完整路徑復制到剪貼板,如圖2-30所示。

圖2-29 注冊表路徑不存在引起的錯誤

圖2-30 復制項名稱

2.3.2 寫注冊表項

與RegRead函數相對應的是RegWrite方法,該方法用于修改注冊表的值。

RegWrite方法包含以下3個參數。

 Name:注冊表的路徑字符串。

 Value:要設定的值。

 Type:注冊表項的類型,可以是REG_SZ(字符串值)、REG_DWORD(DWORD 32位置)、REG_BINARY(二進制值)。

下面的過程,通過改變注冊表值,自動修改Excel 2013的宏安全性為“禁用所有宏,并發出通知”。

代碼分析:根據注冊表編輯器,可以看到該注冊表項的類型是一個DWORD值,因此Type參數設置為“REG_DWORD”。

2.3.3 刪除注冊表項

RegDelete方法的語法非常簡單,只需要規定注冊表項的路徑即可。

下面的代碼刪除注冊表中的Key VBAWarnings。

實際上,注冊表和資源管理器類似,也是一個樹狀結構,嚴格地講,RegDelete方法不僅可以刪除Key,還可以刪除各層級的文件夾。也就是說:

    RegDelete "HKEY_CURRENT_USER\Software\Microsoft\Office\15.0\Excel\Security\"

理論上可以刪除Security整個文件夾,但微軟不允許用戶刪除,因此運行時可能會出錯。

最后演示一個用代碼自動讀取、設置記事本的字體名稱。Notepad是Windows系統的默認程序,屬于微軟開發的產品。在注冊表中查看該節點,可以看到右側有大量的Key,這些其實就是記事本的配置信息,如圖2-31所示。

圖2-31 記事本程序的注冊表信息

可以看到字體名稱的Key是lfFaceName,這是一個REG_SZ字符串,當前字體為“宋體”。

下面的過程首先讀取記事本程序的字體名稱,然后用RegWrite方法設置為“華文仿宋”。

運行上述代碼后,再次打開記事本程序,可以看到字體風格已改變,如圖2-32所示。

圖2-32 修改注冊表,從而修改記事本程序的字體設置

2.3.4 創建新項

在編程過程中,除了修改現有項目外,很多情況下需要創建新的子項。

例如HKEY_CURRENT_USER\Software\Microsoft\Office\Excel\Addins\customUI_Excel這個注冊表項類似于資源管理器中的文件夾,該注冊表項的本身屬性是一個字符串:“By Ryueifu”,此外,該注冊表項還包括4個屬性子項。

 Description字符串子項:屬性值是CustomUI_Excel。

 FriendlyName字符串子項:屬性值是CustomUI_Excel。

 LoadBehavior整數子項:屬性值是2。

 Manifest字符串子項:屬性值是一個路徑文本。

右擊注冊表項,可以在彈出菜單中為已有子項的注冊表項添加新的子項,如圖2-33所示。

圖2-33 為注冊表創建新項

在注冊表中右擊customUI_Excel注冊表項,在彈出菜單中可以新建屬性子項,也可以新建類似于文件夾一樣的目錄子項。

使用VBA同樣可以創建新項。下面的過程包含4個修改注冊表命令,其中前兩個修改現有子項的數值,第3個命令增加一個名為Version的屬性子項,第4個命令增加一個名為User的目錄子項。

運行上述過程,customUI_Excel的注冊表項發生變化,如圖2-34所示。

圖2-34 使用代碼自動修改注冊表

需要特別注意的是,注冊表路徑末尾是否添加反斜杠,對操作后的影響非常大,例如RegWrite Name:=parent & "customUI_Excel\", Value:="Ryukou"這一句的含義是修改customUI_Excel的默認屬性為Ryukou。

如果寫成RegWrite Name:=parent & "customUI_Excel", Value:="Ryukou"則表示在Addins這個注冊表項下面創建一個名為customUI_Excel的屬性子項!

因此,在VBA中使用RegRead、RegWrite和RegDelete方法對注冊表項進行操作時,一定要思考加與不加反斜杠的區別。

以上內容的源代碼文件為“實例文檔08.xlsm”。

主站蜘蛛池模板: 左贡县| 文成县| 嘉祥县| 海兴县| 阿瓦提县| 开平市| 都匀市| 墨竹工卡县| 邹城市| 寿光市| 乳源| 喀喇沁旗| 扶风县| 和静县| 锡林郭勒盟| 扬州市| 安吉县| 云浮市| 沂水县| 松溪县| 棋牌| 东港市| 龙胜| 苍溪县| 项城市| 晋江市| 方山县| 西盟| 宾川县| 绥化市| 德格县| 福州市| 塔城市| 黄石市| 江川县| 泗阳县| 万载县| 台南县| 武安市| 寻乌县| 大新县|