Vba 布尔控件';是否跨系统区域设置处理s值?

Vba 布尔控件';是否跨系统区域设置处理s值?,vba,checkbox,registry,Vba,Checkbox,Registry,我有一个简单的VBA代码,它将复选框控件的当前布尔状态保存到Windows注册表的VBA区域: SaveSetting sAppName, sSection, sKey, CheckBox1 同样,复选框的状态也会初始化,默认值为True,如下所示: CheckBox1 = GetSetting(sAppName, sSection, sKey, "True") 在我发现荷兰用户的PC上的SaveSetting行出现错误94“无效使用null”之前,这是正常工作的 在检查荷兰用户的注册表后,

我有一个简单的VBA代码,它将复选框控件的当前布尔状态保存到Windows注册表的VBA区域:

SaveSetting sAppName, sSection, sKey, CheckBox1
同样,复选框的状态也会初始化,默认值为True,如下所示:

CheckBox1 = GetSetting(sAppName, sSection, sKey, "True")
在我发现荷兰用户的PC上的SaveSetting行出现错误94“无效使用null”之前,这是正常工作的

在检查荷兰用户的注册表后,该值被设置为“Waar”,即荷兰为True。因此,当复选框被初始化时,其值被设置为“Waar”,然后保存设置失败,因为“Waar”未被识别为True,复选框值返回为Null

我惊讶地看到布尔值被保存为区域设置感知,尽管我无法通过将系统区域设置设置为Dutch来复制该行为


这里发生了什么?避免这个问题的正确方法是什么?

没有遇到,但可能(我没有荷兰电脑!)


FWIW,这在这里正如预期的那样工作(在美式英语系统上保存值,在相同的系统上读取它们)。用英语在系统上保存值,然后用荷兰语读回来,反之亦然,我希望失败

Sub test()
    SaveSetting "TestApp", "TestSection", "TestTrueKey", True
    SaveSetting "TestApp", "TestSection", "TestFalseKey", False
End Sub

Sub getback()
    Dim bTest As Boolean
    bTest = GetSetting("TestApp", "TestSection", "TestTrueKey")
    If bTest Then
        MsgBox "True"
    Else
        MsgBox "False"
    End If

    bTest = GetSetting("TestApp", "TestSection", "TestFalseKey")
    If bTest Then
        MsgBox "True"
    Else
        MsgBox "False"
    End If
End Sub
当您将GetSetting的返回值(一个字符串)赋给bool时,VBA正在进行隐式转换;我希望它会使用特定于语言环境的字符串版本


您可能需要编写两个自己的包装函数:GetBoolSetting、SaveBoolSetting。

我做过类似的操作,例如检查复选框的值,然后将“True”或“False”显式保存到注册表。也许这是一个以解决问题而告终的问题,而不是理解实际发生的事情;-)我遇到过同样的事情;我对此的最好解释是,您的SaveSetting/GetSetting始终使用字符串,因此您的布尔值将被转换为字符串值,这将使用本地语言设置。明确保存“真”/“假”似乎是解决这一问题的最佳方法。
Sub test()
    SaveSetting "TestApp", "TestSection", "TestTrueKey", True
    SaveSetting "TestApp", "TestSection", "TestFalseKey", False
End Sub

Sub getback()
    Dim bTest As Boolean
    bTest = GetSetting("TestApp", "TestSection", "TestTrueKey")
    If bTest Then
        MsgBox "True"
    Else
        MsgBox "False"
    End If

    bTest = GetSetting("TestApp", "TestSection", "TestFalseKey")
    If bTest Then
        MsgBox "True"
    Else
        MsgBox "False"
    End If
End Sub