使用GetSetting函数和SaveSetting函数读写注册表设置

1 颗星2 颗星3 颗星4 颗星5 颗星 (目前还没有人投票)
Loading ... Loading ...

可以使用注册表来存储应用程序的初始和配置的设置。VBA允许读写下列注册表路径中的注册表设置:
\HKEY_CURRENT_USER\Software\VB and VBA Program Settings\{子键}
要在这个注册表路径中读取注册表设置,使用GetSetting函数。要写入注册表设置到该注册表路径中,使用SaveSetting函数。注意,不正确地修改注册表会导致严重的后果,甚至需要重新安装操作系统。
GetSetting函数和SaveSetting函数的语法如下:
SaveSetting(AppName,Section,Key,Setting)
GetSetting(AppName,Section,Key[,Default])
其中:

  • 参数AppName必需,String类型,指定VB and VBA Program Settings键的子键;
  • 参数Section必需,String类型,在参数AppName中指定的键的子键;
  • 参数Key必需,String类型,在参数Section中指定的键的值;
  • 参数Setting必需,String类型或数值型,存储在参数Key指定的值中的一块数据;
  • 参数default可选,String类型,指定当参数Key中没有设置值时返回的数据。

使用DeleteSetting函数删除子键或值,其语法为:
DeleteSetting(AppName[,Section[,Key]]
其中的参数与上述相同。
下面的示例代码创建带有两个值的子键,列出它们的值,然后删除子键并再次试图列出它们的值。

'演示VBA SaveSetting函数和GetSetting函数的使用
Public Sub TestRegistryFunctions()
    '创建带有两个值的子键
    SaveSetting AppName:="MyApp", Section:="MySection", _
        Key:="MyKey", Setting:="MySetting"
    SaveSetting AppName:="MyApp", Section:="MySection", _
        Key:="MyKey2", Setting:="MySetting2"
 
    '显示"MySetting"和"MySetting2"
    MsgBox Prompt:=GetSetting(AppName:="MyApp", _
        Section:="MySection", Key:="MyKey")
    MsgBox Prompt:=GetSetting(AppName:="MyApp", _
        Section:="MySection", Key:="MyKey2")
 
    '删除子键
    DeleteSetting AppName:="MyApp"
 
    '显示空字符串
    MsgBox Prompt:=GetSetting(AppName:="MyApp", _
        Section:="MySection", Key:="MyKey")
    MsgBox Prompt:=GetSetting(AppName:="MyApp", _
        Section:="MySection", Key:="MyKey2")
End Sub

关于GetSetting函数和SaveSetting函数的一些说明

  • 如果忽略GetSetting函数中的参数Default,则认为是一个零长字符串(”")。
  • 参数Section可以是一个嵌套子键的路径,每个子键与其父键之间使用反斜杠隔开。例如,如果参数Section的值为Settings\Coordinates,则表明从HKEY_CURRENT_USER\Software\VB and VBA Program Settings\[AppName]\Settings\Coordinates中检索值。
  • SaveSetting函数不允许改变注册表项的缺省值,否则会产生运行时错误。

下面再看一个示例:

Sub TestTheReg()
    SaveSetting "MyRealGoodApp", _
          "TestBranch\SomeSection\AnotherSection", _
          "TestKey", "10"
    MsgBox "现在看看注册表"
End Sub
 
Sub TestDelete()
    If GetSetting("MyRealGoodApp", _
                "TestBranch\SomeSection\AnotherSection", _
                "") = "" Then
        DeleteSetting "MyRealGoodApp", _
            "TestBranch\SomeSection\AnotherSection", _
            "TestKey"
        MsgBox "再看看注册表"
    End If
End Sub

关于DeleteSetting函数的一些说明

  • 不能使用DeleteSetting函数从注册表的主键里删除那些不是HKEY_CURRENT_USER\Software\VB and VBA Program Settings的子键的项。
  • 如果提供了参数Key,那么只有名为Key的项及其关联的值被删除;如果忽略了参数Key,那么参数Section指定的子键将被删除;如果忽略了参数Section,那么参数AppName的键将被全部删除。
  • DeleteSetting函数不能删除属于任何键的缺省值。

下面再看一个示例,代码如下:

Sub ExperimentWithRegistry()
    Dim vaKeys As Variant
    '创建新的注册表项
    SaveSetting "XLTest", "General", "App_Name", "XLTest"
    SaveSetting "XLTest", "General", "App_Version", "1.0.0"
    SaveSetting "XLTest", "General", "App_Date", "10/11/2003"
    PrintRegistrySettings
    '更新设置
    SaveSetting "XLTest", "General", "App_Version", "1.0.1"
    PrintRegistrySettings
    '获取所有的设置
    vaKeys = GetAllSettings("XLTest", "General")
    PrintAllSettings vaKeys
    '删除设置
    DeleteSetting "XLTest", "General", "App_Name"
    DeleteSetting "XLTest", "General", "App_Version"
    DeleteSetting "XLTest", "General", "App_Date"
    PrintRegistrySettings
End Sub
 
Sub PrintRegistrySettings()
    On Error Resume Next
    Debug.Print "应用程序名:" & _
        GetSetting("XLTest", "General", "App_Name")
    Debug.Print "应用程序版本:" & _
        GetSetting("XLTest", "General", "App_Version")
    Debug.Print "应用程序日期:" & _
        GetSetting("XLTest", "General", "App_Date")
    Debug.Print "------------------------------"
End Sub
 
Sub PrintAllSettings(vaSettings As Variant)
    Dim nItem As Integer
    If IsArray(vaSettings) Then
        For nItem = 0 To UBound(vaSettings)
            Debug.Print vaSettings(nItem, 0) & ": " & _
                vaSettings(nItem, 1)
        Next
    End If
    Debug.Print "------------------------------"
End Sub

其中,使用GetAllSettings函数可以获取某应用程序的一系列键。该函数返回一个二维的Variant型数组,其第一维表示返回的设置,第二维则返回键名或键值。
参考资料:
MSDN,Paul Cornell《Ten Tips for Microsoft Office VBA Library Development
Paul Lomax,《VB & VBA in a Nutshell:the Language》
Steven M. Hansen,《Mastering Excel 2003 Programming with VBA》

相关文章

发表评论