Attribute VB_Name = "Mod_Region"
'Déclarations des API's
Private Declare Function GetLocaleInfo Lib "kernel32" _
    Alias "GetLocaleInfoA" _
    (ByVal Locale As Long, ByVal LCTYPE As Long, _
    ByVal lpLCData As String, ByVal cchData As Long) As Long
    
Private Declare Function SetLocaleInfo Lib "kernel32" _
    Alias "SetLocaleInfoA" _
    (ByVal Locale As Long, _
    ByVal LCTYPE As Long, _
    ByVal lpLCData As String) As Long

Private Declare Function GetSystemDefaultLCID Lib "kernel32" () As Long
Private Declare Function GetUserDefaultLCID Lib "kernel32" () As Long

'Constantes paramètres régionaux:
Public Const LOCALE_SCURRENCY = &H14       ' Symbole Monétaire Régional
Public Const LOCALE_SINTLSYMBOL = &H15     ' Symbole Monétaire Internationnal
Public Const LOCALE_SENGCURRNAME = &H1007  ' Nom Anglais de la Devise
Public Const LOCALE_SNATIVECURRNAME = &H1008 ' Nom natif de la Devise
Public Const LOCALE_ILANGUAGE = &H1        ' Identifiant de la langue
Public Const LOCALE_SLANGUAGE = &H2        ' Nom complet de la langue en cours
Public Const LOCALE_SENGLANGUAGE = &H1001  ' Nom Anglais de la langue en cours
Public Const LOCALE_SABBREVLANGNAME = &H3  ' Abbréviation de la langue en cours
Public Const LOCALE_SNATIVELANGNAME = &H4  ' Nom de la Langue native
Public Const LOCALE_ICOUNTRY = &H5         ' Code du Pays
Public Const LOCALE_SCOUNTRY = &H6         ' Nom du Pays
Public Const LOCALE_SENGCOUNTRY = &H1002   ' Nom du Pays en Anglais
Public Const LOCALE_SABBREVCTRYNAME = &H7  ' Nom du Pays abbrégé
Public Const LOCALE_SNATIVECTRYNAME = &H8  ' Nom du Pays d'origine
Public Const LOCALE_IDEFAULTLANGUAGE = &H9 ' Code Langue par défaut
Public Const LOCALE_IDEFAULTCOUNTRY = &HA  ' Code du Pays par défaut
Public Const LOCALE_IDEFAULTCODEPAGE = &HB ' Code Page
Public Const LOCALE_SMONDECIMALSEP = &H16  ' Séparateur décimal monétaire
Public Const LOCALE_SMONTHOUSANDSEP = &H17 ' Séparateur de millier monétaire
Public Const LOCALE_SMONGROUPING = &H18    ' Groupement monétaire
Public Const LOCALE_ICURRDIGITS = &H19     ' # local monetary digits
Public Const LOCALE_IINTLCURRDIGITS = &H1A ' # intl monetary digits
Public Const LOCALE_ICURRENCY = &H1B       ' positive currency mode
Public Const LOCALE_INEGCURR = &H1C        ' negative currency mode
Public Const LOCALE_SDECIMAL = &HE         ' Séparateur décimal numérique
Public Const LOCALE_STHOUSAND = &HF        ' Séparateur de millier numérique
Public Const LOCALE_SDATE = &H1D           ' Séparateur de date
Public Const LOCALE_STIME = &H1E           ' Séparateur de l'heure
Public Const LOCALE_SSHORTDATE = &H1F      ' Format Date Court (ex: dd/MM/yy)
Public Const LOCALE_SLONGDATE = &H20       ' Format Date Long (ex: dd/MM/yyyy)
Public Const LOCALE_STIMEFORMAT = &H1003   ' Format de l'heure
Public Const LOCALE_IDATE = &H21           ' Affichage Date Courte => 0: M-D-Y; 1: D-M-Y; 2: Y-M-D
Public Const LOCALE_ILDATE = &H22          ' Affichage Date Longue => 0: M-D-Y; 1: D-M-Y; 2: Y-M-D
Public Const LOCALE_ITIME = &H23           ' Format de l'heure spécifique => 0: AM/PM; 1: 24H
Public Const LOCALE_ICENTURY = &H24        ' Format du siècle spécifique => 0: 2 digits; 1: 4 digits
Public Const LOCALE_ITLZERO = &H25         ' Zéro spécifique pour l'heure => 0: Non; 1: Oui
Public Const LOCALE_IDAYLZERO = &H26       ' Zéro spécifique pour le jour => 0: Non; 1: Oui
Public Const LOCALE_IMONLZERO = &H27       ' Zéro spécifique pour le mois => 0: non; 1: Oui
Public Const LOCALE_S1159 = &H28           ' Chaîne remplaçant la chaîne AM
Public Const LOCALE_S2359 = &H29           ' Chaîne remplaçant la chaîne PM

'Cette fonction permet de déterminer si l'on travaille sur les valeurs
'du système ou sur celles de l'utilisateur local.
Private Function IniLocaleID(sType As String) As Long
    Dim lLocalDefault As Long
    Select Case UCase(sType)
        Case "SYSTEM"
            'Système local.
            lLocalDefault = GetSystemDefaultLCID()
        Case "USER"
            'Utilisateur local
            lLocalDefault = GetUserDefaultLCID()
    End Select
    IniLocaleID = lLocalDefault
End Function

'Cette fonction permet de renvoyer la valeur d'un des paramètres régionaux
'en passant en paramètre une des constantes citées ci-dessus.
Function GetUserLocaleInfo(LCTYPE As Long) As String
    Dim sReturn As String
    Dim lReturn, lLocaleID As Long
    
    lLocaleID = IniLocaleID("USER")
    
    'Appel de la fonction en passant la variable locale
    'pour récupérer la taille du buffer du string dont nous avons besoin
     lReturn = GetLocaleInfo(lLocaleID, LCTYPE, sReturn, Len(sReturn))
    
    'Si c'est OK..
    If lReturn Then
        'On complète le buffer avec des espaces
        sReturn = Space$(lReturn)
        'et nouvel appel en passant la mémoire tampon
        lReturn = GetLocaleInfo(lLocaleID, LCTYPE, sReturn, Len(sReturn))
        'Si Ok (lReturn > 0)
        If lReturn Then
            'lReturn contient la taille de la chaîne de caractères
            'comprenant la terminaison nulle
            'Debug.Print LCTYPE & " -> " & Left$(sReturn, lReturn - 1)
             GetUserLocaleInfo = Left$(sReturn, lReturn - 1)
        End If
    End If
End Function

'Cette fonction permet de modifier la valeur d'un des paramètres régionaux
'en passant en paramètres une des constantes citées ci-dessus
'ainsi que la nouvelle valeur.
Function SetUserLocaleInfo(LCTYPE As Long, vValue As Variant) As Boolean
    lLocaleID = IniLocaleID("USER")
    SetUserLocaleInfo = SetLocaleInfo(lLocaleID, LCTYPE, vValue)
End Function

