Ländereinstellungen
yosherl
ich bräuchte mal eure Hilfe!
Wir haben hier folgendes Problem:
Unsere VBA Makros werden Weltweit verwendet. Jeder arbeitet allerdings mit seinen eigenen Einstellungen, sprich Dezimalseperator, Listentrennzeichen usw..
In der Vergangenheit wurden wohl schon tests gemacht um diese Settings zu ändern, da sie anscheinend nicht richtig funktioniert haben.
Problem war wohl dass Excel das Ändern der Ländereinstellung nur bei einem Neustart von Excel übernimmt. Beispiel:
Jemand hat 3 Exceldateien offen. Und möchte aus dem 3. das VBA Makro starten. Dieses erkennt dass die Settings falsch sind, und ändert diese. Nun müssten allerdings alle 3 Dateien geschlossen werden, damit Excel die Einstellungen übernimmt?! Dies wäre nicht wirklich Anwenderfreundlich.
Hier mal ein Code den ich gefunden habe, um die Einstellungen zu ändern:
' benötigte API-Deklarationen
Private Declare Function GetSystemDefaultLCID Lib "kernel32" () As Long
Private Declare Function GetUserDefaultLCID Lib "kernel32" () 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 PostMessage Lib "user32" _
Alias "PostMessageA" ( _
ByVal hWnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long
Private Const LOCALE_SMONDECIMALSEP = &H16
Private Const LOCALE_SDECIMAL = &HE
Private Const LOCALE_SMONTHOUSANDSEP = &H17
Private Const LOCALE_STHOUSAND = &HF
Private Const WM_SETTINGCHANGE = &H1A
Private Const HWND_BROADCAST = &HFFFF&
Sub test()
'erg = Shell("Control.exe intl.cpl")
' Punkt als Tausenderzeichen, und Komma als Dezimalzeichen
' für den aktuellen Benutzer festlegen
If SetNewNumberFormat(".", ",", False) Then
MsgBox "Zahlen- und Währungsformat wurden korrekt umgestellt"
Else
MsgBox "Systemeinstellungen konnten nicht geändert werden." & vbCrLf & _
"Ggf. hat der angemeldete Benutzer nicht genügend Rechte!"
End If
End Sub
Public Function SetNewNumberFormat(ByVal sDecChar As String, _
Optional ByVal sGroupChar As String = "", _
Optional ByVal bAllUser As Boolean = True) As Boolean
Dim nLCID As Long
Dim bResult As Boolean
If bAllUser Then
' systemweite Änderung für alle Benutzer
nLCID = GetSystemDefaultLCID()
Else
' Änderung nur für den aktuell angemeldeten Benutzer
nLCID = GetUserDefaultLCID()
End If
' Neues Währungsformat setzen
bResult = (SetLocaleInfo(nLCID, LOCALE_SMONDECIMALSEP, sDecChar) 0)
bResult = (SetLocaleInfo(nLCID, LOCALE_SMONTHOUSANDSEP, sGroupChar) 0)
' Neues Zahlenformat setzen
bResult = (SetLocaleInfo(nLCID, LOCALE_SDECIMAL, sDecChar) 0)
bResult = (SetLocaleInfo(nLCID, LOCALE_STHOUSAND, sGroupChar) 0)
If bResult Then
' System über die Änderung benachrichtigen
PostMessage HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0
End If
SetNewNumberFormat = bResult
End Function
Hat vielleicht jemand damit schon Erfahrung gemacht? Kann mir jemand sagen ob ich hier eine "Wasserdichte" Lösung finden kann, denn die Auswirkungen wären relativ hoch, da ich hier ca. 1000 Programme anpassen würde. Gegen ende des Jahres verwenden wir Excel 2007.
Vielen Dank schonmal für eure Hilfe!
yosh