- Office VBA開發經典:中級進階卷
- 劉永富 劉行
- 1654字
- 2019-11-22 18:29:06
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”。
- Boost C++ Application Development Cookbook(Second Edition)
- Vue.js 2 and Bootstrap 4 Web Development
- CentOS 7 Linux Server Cookbook(Second Edition)
- 碼上行動:零基礎學會Python編程(ChatGPT版)
- Learning Python Design Patterns(Second Edition)
- Interactive Applications Using Matplotlib
- Oracle Exadata專家手冊
- Android底層接口與驅動開發技術詳解
- Java實戰(第2版)
- Vue.js 2 Web Development Projects
- 時空數據建模及其應用
- 深度學習原理與PyTorch實戰(第2版)
- Python預測分析與機器學習
- Get Your Hands Dirty on Clean Architecture
- Mastering Bootstrap 4