在 vba 程序中,如何判断当前用户的语言?
我需要这个来展示适合语言的表单。
我的初始代码(利用这个 vbforum code)假设Windows和Excel共享一种通用语言-很可能但不是绝对可靠。
更新:
修改后的代码:
我的计算机上的示例输出如下所示:
如果访问LCID网站或解析国家名称时出现任何错误,代码将告知用户。
Sub GetXlLang()
Dim lngCode As Long
lngCode = Application.LanguageSettings.LanguageID(msoLanguageIDUI)
MsgBox "Code is: " & lngCode & vbNewLine & GetTxt(lngCode)
End Sub
Function GetTxt(ByVal lngCode) As String
Dim objXmlHTTP As Object
Dim objRegex As Object
Dim objRegMC As Object
Dim strResponse As String
Dim strSite As String
Set objXmlHTTP = CreateObject("MSXML2.XMLHTTP")
strSite = "http://msdn.microsoft.com/en-us/goglobal/bb964664"
On Error GoTo ErrHandler
With objXmlHTTP
.Open "GET", strSite, False
.Send
If .Status = 200 Then strResponse = .ResponseText
End With
On Error GoTo 0
strResponse = Replace(strResponse, "</td><td>", vbNullString)
Set objRegex = CreateObject("vbscript.regexp")
With objRegex
.Pattern = "><td>([a-zA-Z- ]+)[A-Fa-f0-9]{4}" & lngCode
If .Test(strResponse) Then
Set objRegMC = .Execute(strResponse)
GetTxt = objRegMC(0).submatches(0)
Else
GetTxt = "Value not found from " & strSite
End If
End With
Set objRegex = Nothing
Set objXmlHTTP = Nothing
Exit Function
ErrHandler:
If Not objXmlHTTP Is Nothing Then Set objXmlHTTP = Nothing
GetTxt = strSite & " unable to be accessed"
End Function
dim lang_code as long
lang_code = Application.LanguageSettings.LanguageID(msoLanguageIDUI)
Sub Test_GetLocale_UDF()
Dim lngCode As Long
lngCode = Application.LanguageSettings.LanguageID(msoLanguageIDUI)
MsgBox "Code Is: " & lngCode & vbNewLine & GetLocale(lngCode)
End Sub
Function GetLocale(ByVal lngCode) As String
Dim html As Object
Dim http As Object
Dim htmlTable As Object
Dim htmlRow As Object
Dim htmlCell As Object
Dim url As String
Set html = CreateObject("htmlfile")
Set http = CreateObject("MSXML2.XMLHTTP")
url = "https://www.science.co.il/language/Locale-codes.php"
On Error GoTo ErrHandler
With http
.Open "GET", url, False
.send
If .Status = 200 Then html.body.innerHTML = .responseText
End With
On Error GoTo 0
Set htmlTable = html.getElementsByTagName("table")(0)
For Each htmlRow In htmlTable.getElementsByTagName("tr")
For Each htmlCell In htmlRow.Children
If htmlCell.innerText = CStr(lngCode) Then
GetLocale = htmlRow.getElementsByTagName("td")(0).innerText
Exit For
End If
Next htmlCell
Next htmlRow
If GetLocale = "" Then GetLocale = "Value Not Found From " & url
Exit Function
ErrHandler:
If Not http Is Nothing Then Set http = Nothing
GetLocale = url & " Unable To Be Accessed"
End Function
Select Case Application.International(xlApplicationInternational.xlCountryCode)
Case 1: Call MsgBox("English")
Case 33: Call MsgBox("French")
Case 49: Call MsgBox("German")
Case 81: Call MsgBox("Japanese")
End Select
直接从这里进入:https://bettersolutions.com/vba/macros/region-language.htm
相关文档:https://learn.microsoft.com/en-us/office/vba/api/excel.xlapplicationinternational
VBA Application.LanguageSettings.LanguageID(msoLanguageIDUI)
只能获取 Microsoft Office Access 或者 Microsoft Excel 用户界面语言,但不能反映用于 Windows 显示的 Windows 系统显示语言,如 MsgBox()
按钮等。
如果用户通过 Windows 控制面板更改了他的 Windows 显示语言,则这个应用程序级别的设置将不会改变。在这种情况下,我们可以使用该 Kernel dll 函数来获取新的 LCID (Microsoft 语言代码标识符,1036=法语,1033=英语,...), 在一个 VBA 模块中使用以下代码:
Private Declare Function GetUserDefaultUILanguage Lib "kernel32.dll" () As Long
Public Function winGetUserDefaultUILanguage()
winGetUserDefaultUILanguage = GetUserDefaultUILanguage()
End Function
然后您可以在 VBA 代码的任何位置调用公共函数 winGetUserDefaultUILanguage()
来获取 Windows LCID。
内核 DLL 函数 GetUserDefaultUILanguage()
将通过 Windows 显示语言 ID 反映更改。
VBA 调试器控制台:
现在我们通过控制面板将显示语言切换为英语Windows(LCID=1033),但我的Office语言ID保持不变(LCID=1036):
VBA调试器控制台:
通过 LCID,您可以从Microsoft API documents here或here进一步获取语言标签和语言名称。
excel
标签始终是有用的,因为它使未来的搜索更容易。 - Fionnuala