如何用vba获取系统或者用户的区域名称LocaleName?

如何用vba返回系统或者当前用户的LCID?一文中我们介绍了获取LCID的方法。

从Windows Vista系统开始,微软引入了用区域名称Locale Name代替LCID的趋势。

从Windows Vista系统开始,可以使用GetUserDefaultLocaleNameGetSystemDefaultLocaleName函数获取默认的区域名称Locale Name。

它们的语法如下:

int GetUserDefaultLocaleName(
  LPWSTR lpLocaleName,
  int    cchLocaleName
);

其中lpLocaleName参数是缓冲区,cchLocaleName参数是设置的最大字符数,返回值为实际的字符数(含结尾Null字符)

这里要特别注意的是GetUserDefaultLocaleName返回的Locale Name,1个字符占了4个字节,所以会有很多Null字符,在提取前,需要用Replace函数将Null字符替换。

以下是获取区域名称的代码:

Declare Function GetUserDefaultLocaleName Lib "kernel32" (ByVal lpLocaleName As String, ByVal cchLocaleName As Long) As Long
Declare Function GetSystemDefaultLocaleName Lib "kernel32" (ByVal lpLocaleName As String, ByVal cchLocaleName As Long) As Long
Const LOCALE_NAME_MAX_LENGTH = 85
Sub QQ1722187970()
   Dim sLocaleName As String
   sLocaleName = Space(LOCALE_NAME_MAX_LENGTH)
   Debug.Print StrPtr(sLocaleName), VBA.Hex(StrPtr(sLocaleName))
   '获取LocaleName的字符长度
   LenLocaleName = GetUserDefaultLocaleName(sLocaleName, LOCALE_NAME_MAX_LENGTH) - 1
   ' GetUserDefaultLocaleName函数会把存入sLocaleName变量的1个字符用4个字节存储,所以会带进很多Null字符,用Replace函数替换掉。
   sLocaleName = VBA.Replace(sLocaleName, Chr(0), "")
   sLocaleName = Left(sLocaleName, LenLocaleName)
   Debug.Print "当前用户的LocaleName:" & sLocaleName
End Sub
       

发表评论