Vba 布尔控件';是否跨系统区域设置处理s值?
我有一个简单的VBA代码,它将复选框控件的当前布尔状态保存到Windows注册表的VBA区域: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”之前,这是正常工作的 在检查荷兰用户的注册表后,
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