如何用vba实现区域名称(LocaleName)和区域ID(LCID)的相互转换?

LocaleNameToLCID 函数可以实现将区域名称(LocaleName)转换为区域ID。

它的函数语法如下:

LCID LocaleNameToLCID(
  LPCWSTR lpName,
  DWORD   dwFlags
);

其中参数lpName是指向表示区域名称(LocaleName)的Null结尾字符串的指针。

LCIDToLocaleName函数可以实现将区域ID转换为区域名称(LocaleName)。

它的函数语法如下:

int LCIDToLocaleName(
  LCID   Locale,
  LPWSTR lpName,
  int    cchName,
  DWORD  dwFlags
);

Locale参数为要转换的LCID,lpName为要存储区域名称的缓存区,cchName为缓冲区的大小。

根据以上的知识,可以使用如下的代码实现区域名称(LocaleName)和区域ID(LCID)的相互转换:

Declare Function LCIDToLocaleName Lib "kernel32" (ByVal Locale As Long, ByVal lpName As String, ByVal cchName As Long, ByVal dwFlags As Long) As Long
Declare Function LocaleNameToLCID Lib "kernel32" (ByVal lpName As Long, ByVal dwFlags As Long) As Long
Declare Function GetUserDefaultLCID Lib "kernel32" () As Long
Declare Function GetSystemDefaultLCID Lib "kernel32" () As Long
Const LOCALE_NAME_MAX_LENGTH = 85
Sub QQ1722187970()
    iLCID = GetUserDefaultLCID
    Dim sLocaleName As String
    'LCID2LocaleName
    sLocaleName = Space(LOCALE_NAME_MAX_LENGTH)
    iLen = LCIDToLocaleName(iLCID, sLocaleName, LOCALE_NAME_MAX_LENGTH, 0) - 1
    sLocaleName = VBA.Replace(sLocaleName, Chr(0), "")
    sLocaleName = Left(sLocaleName, iLen)
    iLCID = 0
    'LocaleName2LCID
    '注意LocaleNameToLCID的第一个参数类型,一定要设置为long型,然后传递字符串变量的指向地址
    iLCID = LocaleNameToLCID(StrPtr(sLocaleName), 0)
End Sub

这里特别要注意的是,在VBA中,需要将LocaleNameToLCID函数声明成如下的形式:

Declare Function LocaleNameToLCID Lib "kernel32" (ByVal lpName As Long, ByVal dwFlags As Long) As Long

lpName参数设置为Long类型,然后传递字符串变量的指向地址。

 

       

发表评论