Land instellingen negeren voor 1 bepaalde Access database.

  • Onderwerp starter Onderwerp starter resi
  • Startdatum Startdatum
Status
Niet open voor verdere reacties.

resi

Gebruiker
Lid geworden
8 sep 2000
Berichten
81
Ik heb het forum en internet afgezocht maar ik krijg niet voor elkaar wat ik wil hebben.

Het gaat om het volgende:

Ik heb een Access 2007 database gemaakt waarin een een tabel koppel aan een CSV file. In dit CSV file staan allemaal amerikaanse notaties zowel voor currency, getallen en datums.

$30.00","$3.00","0","$6,551.00","0","$0.00","$33.00","$0.00","-$33.00","1,471","313","732","12.20","-100.00","2012/02/01 11:33

Ik wil de gegevens in de gekoppelde tabel niet wijzigen en net zo importen/koppelen met datum,currency en nummerieke velden in Access als in het CSV file staat. Door dat mijn land instellingen op Nederlands staan maakt hij van $0.00 €0,00 en getallen als $6,551.00 geeft Access weer als #Getal!. ook in het veld met deelnemers worden sommige rijen als #Getal! weergegeven om dat de waarde van dat veld er bijvoorbeeld in het CSV file uit ziet als 27,895

Ik weet dat ik mijn land instellingen kan wijzigen dan werkt de database niet op een engels talige pc's. Er zit namelijk een export functie via macro in welke een summary maakt. Deze heb ik op dit moment zo gemaakt dat hij via een toevoeg query de rijen naar een bepaald format omzet. Ik realiseerde me later dat dit niet gaat werken op een pc's met een US country settings.


Ik wil deze database namelijk delen met andere gebruikers uit andere landen die bv wel die weer andere land instellingen gebruiken. Nu schijnt dit mogelijk te zijn door middel van een VBA code deze specifieke database zo in te stellen dat je zonder aanpassingen het CSV file kunt koppelen en het er hetzelfde uit ziet als in het CSV file. Ik heb diverse county setting VBA codes geprobeerd maar niets werkt.

Moet er wel bij vermelden dat ik een VBA noop ben. Wie wil helpen met een VBA oplossing indien mogelijk?
 
Het is bijzonder ongelukkig om een Notatie als onderdeel van een veld mee te nemen, zowel bij import als bij export. Een valuta opmaak van een € teken of $ teken is namelijk niks meer dan het getal een ander jasje aantrekken; het onderliggende getal verandert niet. Als ik een veld opmaak als Euro of Dollar verandert het bedrag (helaas...) niet.
Hetzelfde geldt voor datums: dat Amerikanen de notatie yyyy/dd/mm gebruiken en wij dd-mm-yyyy boeit in beginsel niet: je praat over hetzelfde getal. Bij gegevensuitwisseling tussen verschillende landen zou je dus alleen de echte getallen moeten uitwisselen, en niet hoe het is opgemaakt.
Dan ben je gelijk van alle problemen af, en maakt het niet meer uit dat jij een getal ziet als 12,20 en een Amerikaan hetzelfde getal als 12.20. Maar goed, daar kies je dus niet voor. Je zegt dat je al van alles hebt geprobeerd; wat is dan zoal? Want het heeft weinig zin om die oplossingen nog een keer aan te dragen :)
 
Hoi Michel,
Ik snap wat jij bedoelt en in zeker zin heb je gelijk. Het probleem alleen is dat als ik een tabel importeer en mijn summarie maak dan worden de velden samen gevoegd en met harde enters geplaatst in een 1 veld van een tabel als memo veld. Ik heb een complete query gemaakt met replace functies bv Replace([inkoop];",";".") welke alles omzet naar het goede formaat en deze wordt via een query toegevoegd aan een nieuwe tabel. Ik kan hiermee de summarie op de juiste manier exporteren. Alleen deze query gaat dus werken op een computer die een Amerikaanse land instellingen heeft. Want als ik dan de Replace([inkoop];",";".") zou uitvoeren wordt niet het decimaal teken vervangen maar het teken voor het duizendtal.

De summarie die ik maak worden tekst velden. Het is namelijk een waarde uit de tabel met een tekst ervoor. De summarie die geëxporteerd moet worden wordt geimporteerd in een ander programma in het amerikaanse formaat. Ik vond gisteren deze link http://www.xtremevbtalk.com/archive/index.php/t-138511.html Wat ik er uit begrijp is het dus wel mogelijk.
 
Laatst bewerkt:
Ik had al iets vergelijkbaars gevonden. In essentie komt het hier op neer: je moet in configuratiescherm een aantal zaken aanpassen, en later weer terugzetten. Om te testen kun je deze code in een module zetten, die zou zonder meer moeten werken.

Code:
Option Compare Database
Option Explicit

Private Declare Function SetLocaleInfo Lib "kernel32" Alias "SetLocaleInfoA" _
    (ByVal Locale As Long, ByVal LCType As Long, ByVal lpLCData As String) As Boolean
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 GetUserDefaultLCID% Lib "kernel32" ()
Private Declare Function GetSystemDefaultLCID Lib "kernel32" () As Long

Private Const LOCALE_SCURRENCY = &H14
Private Const LOCALE_SDECIMAL = &HE
Private Const LOCALE_STHOUSAND = &HF
Private Const LOCALE_SSHORTDATE = &H1F
Private Const LOCALE_SDATE = &H1D
Private Const LOCALE_SMONTHOUSANDSEP = &H17
Private Const LOCALE_SMONDECIMALSEP = &H16

Om te testen:
Code:
Private Sub ChangeSettingExample()
    
    'SetLocaleInfo API values to new values
    Call SetLocalSetting(LOCALE_SDECIMAL, ".")
    Call SetLocalSetting(LOCALE_STHOUSAND, ",")
    Call SetLocalSetting(LOCALE_SSHORTDATE, "yy/MM/dd")
    Call SetLocalSetting(LOCALE_SCURRENCY, "$")
    'check your control panel to verify or use the GetLocaleInfo API function
    Stop
    
    'Restore SetLocaleInfo API values
    Call SetLocalSetting(LOCALE_SDECIMAL, ",")
    Call SetLocalSetting(LOCALE_STHOUSAND, ".")
    Call SetLocalSetting(LOCALE_SSHORTDATE, "dd-MM-yy")
    Call SetLocalSetting(LOCALE_SCURRENCY, "€")

End Sub

En de functie die het allemaal doet:
Code:
Private Function SetLocalSetting(LC_CONST As Long, Setting As String) ''As Boolean
    Call SetLocaleInfo(GetUserDefaultLCID(), LC_CONST, Setting)
End Function
 
Ik had al iets vergelijkbaars gevonden. In essentie komt het hier op neer: je moet in configuratiescherm een aantal zaken aanpassen, en later weer terugzetten. Om te testen kun je deze code in een module zetten, die zou zonder meer moeten werken.

En hier is dus het punt waarop ik vast loop. Wat moet ik wijzigen? En is dit wijzigen puur om te testen? Ik heb de complete code onder elkaar in een nieuwe module gezet maar ik zie geen veranderingen in de weergave van mijn database.

Rene
 
Je ziet ook in eerste instantie geen verschil in je database; waarom zou je? Met de code pas je de landinstellingen aan; datumnotatie, valutanotatie en kommanotatie. De sub verandert ze naar Amerikaans, stopt dan en zet alles vervolgens weer terug. Het nettoresultaat is dus nihil, maar daarom is het ook een test, zodat je kunt zien dat het werkt. Uiteindelijk moet je de code opsplitsen in twee procedures; de eerste zet alles bij openen om naar Amerikaans, en bij sluiten van de db zet je dan alles weer terug.
 
bedankt voor de uitleg.

Is het niet een risico om deze module te gebruiken? Indien een gebruiker zelf ooit iets heeft aangepast in zijn land instellingen wordt het dan niet met deze module weer terug gezet wordt naar de waardes van "Restore SetLocaleInfo API values"? De waardes die hier namelijk staan hoeven toch niet de waardes te zijn die een gebruiker van te voren ingesteld had staan?

Ik heb de code getest en gezien wat het doet. Op zich zou het kunnen werken maar met nog wat aanpassingen. De velden waar waardes waar een cijfergroepering getal in staat zoals bv $1,000.00 niet weergegeven. Ik krijg hier #getal! te zien. de weergave van de tijd is in 24h maar zonder voorloop 0. dus 3:54 in plaats van 03:54. Als ik deze instel door middel van
Code:
Call SetLocalSetting(LOCALE_STIMEFORMAT, "UU:mm:ss")
werkt dit niet. Doe ik dit handmatig in landinstellingen dan gaat het wel goed. Het lijkt er soms op dat niet elke keer de waardes in de module worden toegepast. Ik moet Access opnieuw openen om te zien of het gewijzigd is. Is dit te voorkomen?

Btw
Waar kan ik ergens vinden waar bv &H14,&HE.&H16 voor staan of zijn dit de velden in de land instellingen?
 
De STIMEFORMAT zal eerder "HH:mm:ss") zijn omdat je moet kijken naar Engelse begrippen. En Uur kennen ze daar niet, Hour daarentegen weer wel.
Het opnieuw instellen van de originele waarden zou je kunnen oplossen door die waarden op te slaan in Public variabelen.
Er zijn verschillende pagina's waar je overzichten van de juiste constanten kunt ophalen; zelf heb ik ze een keer opgeslagen in een aparte module die ik waar nodig dan weer importeer in mijn db's. Een voorbeeldje, met doorgaans genoeg codes en een functie om de variabelen uit te lezen vind je hier.

De functie is dus deze:

Code:
Function fLocaleInfo(lngLCType As Long) As String
Dim lngLocale As Long
Dim strLCData As String, lngData As Long
Dim lngX As Long

    strLCData = String$(cMAXLEN, 0)
    lngData = cMAXLEN - 1
    lngX = apiGetLocaleInfo(LOCALE_USER_DEFAULT, lngLCType, strLCData, lngData)
    If lngX <> 0 Then
        fLocaleInfo = Left$(strLCData, lngX - 1)
    End If
End Function

En je kunt hem zo testen:
Code:
Sub testje()
    MsgBox fLocaleInfo(LOCALE_STIMEFORMAT)
End Sub
 
Heb deze code getest maar er schijnt een fout in te zitten.

In de tussentijd wel het probleem met de velden met een cijfergroeperigs getal op gelost en met de LOCALE_STIMEFORMAT. Het cijfer groeperigsteken bij valuta is niet LOCALE_STHOUSAND maar LOCALE_SMONTHOUSANDSEP en voor de komma is het niet LOCALE_SDECIMAL maar LOCALE_SMONDECIMALSEP.

De velden die ik nodig heb zijn nu juiste gedefineerd in de test module. Nu dus nog de waarde van de user opslaan voor zodat ik later dezelfde waarde kan terugzetten.

De test module ziet er nu zo uit:


Code:
Option Compare Database
Option Explicit

Private Declare Function SetLocaleInfo Lib "kernel32" Alias "SetLocaleInfoA" _
    (ByVal Locale As Long, ByVal LCType As Long, ByVal lpLCData As String) As Boolean
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 GetUserDefaultLCID% Lib "kernel32" ()
Private Declare Function GetSystemDefaultLCID Lib "kernel32" () As Long

Private Const LOCALE_FONTSIGNATURE As Long = &H58
Private Const LOCALE_ICALENDARTYPE As Long = &H1009
Private Const LOCALE_ICENTURY As Long = &H24
Private Const LOCALE_ICOUNTRY As Long = &H5
Private Const LOCALE_ICURRDIGITS As Long = &H19
Private Const LOCALE_ICURRENCY As Long = &H1B
Private Const LOCALE_IDATE As Long = &H21
Private Const LOCALE_IDAYLZERO As Long = &H26
Private Const LOCALE_IDEFAULTANSICODEPAGE As Long = &H1004
Private Const LOCALE_IDEFAULTCODEPAGE As Long = &HB
Private Const LOCALE_IDEFAULTCOUNTRY As Long = &HA
Private Const LOCALE_IDEFAULTEBCDICCODEPAGE As Long = &H1012
Private Const LOCALE_IDEFAULTLANGUAGE As Long = &H9
Private Const LOCALE_IDEFAULTMACCODEPAGE As Long = &H1011
Private Const LOCALE_IDIGITS As Long = &H11
Private Const LOCALE_IDIGITSUBSTITUTION As Long = &H1014
Private Const LOCALE_IFIRSTDAYOFWEEK As Long = &H100C
Private Const LOCALE_IFIRSTWEEKOFYEAR As Long = &H100D
Private Const LOCALE_IINTLCURRDIGITS As Long = &H1A
Private Const LOCALE_ILANGUAGE As Long = &H1
Private Const LOCALE_ILDATE As Long = &H22
Private Const LOCALE_ILZERO As Long = &H12
Private Const LOCALE_IMEASURE As Long = &HD
Private Const LOCALE_IMONLZERO As Long = &H27
Private Const LOCALE_INEGCURR As Long = &H1C
Private Const LOCALE_INEGNUMBER As Long = &H1010
Private Const LOCALE_INEGSEPBYSPACE As Long = &H57
Private Const LOCALE_INEGSIGNPOSN As Long = &H53
Private Const LOCALE_INEGSYMPRECEDES As Long = &H56
Private Const LOCALE_IOPTIONALCALENDAR As Long = &H100B
Private Const LOCALE_IPAPERSIZE As Long = &H100A
Private Const LOCALE_IPOSSEPBYSPACE As Long = &H55
Private Const LOCALE_IPOSSIGNPOSN As Long = &H52
Private Const LOCALE_IPOSSYMPRECEDES As Long = &H54
Private Const LOCALE_ITIME As Long = &H23
Private Const LOCALE_ITIMEMARKPOSN As Long = &H1005
Private Const LOCALE_ITLZERO As Long = &H25
Private Const LOCALE_NOUSEROVERRIDE As Long = &H80000000
Private Const LOCALE_RETURN_NUMBER As Long = &H20000000
Private Const LOCALE_S1159 As Long = &H28
Private Const LOCALE_S2359 As Long = &H29
Private Const LOCALE_SABBREVCTRYNAME As Long = &H7
Private Const LOCALE_SABBREVDAYNAME1 As Long = &H31
Private Const LOCALE_SABBREVDAYNAME2 As Long = &H32
Private Const LOCALE_SABBREVDAYNAME3 As Long = &H33
Private Const LOCALE_SABBREVDAYNAME4 As Long = &H34
Private Const LOCALE_SABBREVDAYNAME5 As Long = &H35
Private Const LOCALE_SABBREVDAYNAME6 As Long = &H36
Private Const LOCALE_SABBREVDAYNAME7 As Long = &H37
Private Const LOCALE_SABBREVLANGNAME As Long = &H3
Private Const LOCALE_SABBREVMONTHNAME1 As Long = &H44
Private Const LOCALE_SABBREVMONTHNAME10 As Long = &H4D
Private Const LOCALE_SABBREVMONTHNAME11 As Long = &H4E
Private Const LOCALE_SABBREVMONTHNAME12 As Long = &H4F
Private Const LOCALE_SABBREVMONTHNAME13 As Long = &H100F
Private Const LOCALE_SABBREVMONTHNAME2 As Long = &H45
Private Const LOCALE_SABBREVMONTHNAME3 As Long = &H46
Private Const LOCALE_SABBREVMONTHNAME4 As Long = &H47
Private Const LOCALE_SABBREVMONTHNAME5 As Long = &H48
Private Const LOCALE_SABBREVMONTHNAME6 As Long = &H49
Private Const LOCALE_SABBREVMONTHNAME7 As Long = &H4A
Private Const LOCALE_SABBREVMONTHNAME8 As Long = &H4B
Private Const LOCALE_SABBREVMONTHNAME9 As Long = &H4C
Private Const LOCALE_SCOUNTRY As Long = &H6
Private Const LOCALE_SCURRENCY As Long = &H14
Private Const LOCALE_SDATE As Long = &H1D
Private Const LOCALE_SDAYNAME1 As Long = &H2A
Private Const LOCALE_SDAYNAME2 As Long = &H2B
Private Const LOCALE_SDAYNAME3 As Long = &H2C
Private Const LOCALE_SDAYNAME4 As Long = &H2D
Private Const LOCALE_SDAYNAME5 As Long = &H2E
Private Const LOCALE_SDAYNAME6 As Long = &H2F
Private Const LOCALE_SDAYNAME7 As Long = &H30
Private Const LOCALE_SDECIMAL As Long = &HE
Private Const LOCALE_SENGCOUNTRY As Long = &H1002
Private Const LOCALE_SENGCURRNAME As Long = &H1007
Private Const LOCALE_SENGLANGUAGE As Long = &H1001
Private Const LOCALE_SGROUPING As Long = &H10
Private Const LOCALE_SINTLSYMBOL As Long = &H15
Private Const LOCALE_SISO3166CTRYNAME As Long = &H5A
Private Const LOCALE_SISO639LANGNAME As Long = &H59
Private Const LOCALE_SLANGUAGE As Long = &H2
Private Const LOCALE_SLIST As Long = &HC
Private Const LOCALE_SLONGDATE As Long = &H20
Private Const LOCALE_SMONDECIMALSEP As Long = &H16
Private Const LOCALE_SMONGROUPING As Long = &H18
Private Const LOCALE_SMONTHNAME1 As Long = &H38
Private Const LOCALE_SMONTHNAME10 As Long = &H41
Private Const LOCALE_SMONTHNAME11 As Long = &H42
Private Const LOCALE_SMONTHNAME12 As Long = &H43
Private Const LOCALE_SMONTHNAME13 As Long = &H100E
Private Const LOCALE_SMONTHNAME2 As Long = &H39
Private Const LOCALE_SMONTHNAME3 As Long = &H3A
Private Const LOCALE_SMONTHNAME4 As Long = &H3B
Private Const LOCALE_SMONTHNAME5 As Long = &H3C
Private Const LOCALE_SMONTHNAME6 As Long = &H3D
Private Const LOCALE_SMONTHNAME7 As Long = &H3E
Private Const LOCALE_SMONTHNAME8 As Long = &H3F
Private Const LOCALE_SMONTHNAME9 As Long = &H40
Private Const LOCALE_SMONTHOUSANDSEP As Long = &H17
Private Const LOCALE_SNATIVECTRYNAME As Long = &H8
Private Const LOCALE_SNATIVECURRNAME As Long = &H1008
Private Const LOCALE_SNATIVEDIGITS As Long = &H13
Private Const LOCALE_SNATIVELANGNAME As Long = &H4
Private Const LOCALE_SNEGATIVESIGN As Long = &H51
Private Const LOCALE_SPOSITIVESIGN As Long = &H50
Private Const LOCALE_SSHORTDATE As Long = &H1F
Private Const LOCALE_SSORTNAME As Long = &H1013
Private Const LOCALE_STHOUSAND As Long = &HF
Private Const LOCALE_STIME As Long = &H1E
Private Const LOCALE_STIMEFORMAT As Long = &H1003
Private Const LOCALE_SYEARMONTH As Long = &H1006

Private Sub ChangeSettingExample()
    
    'SetLocaleInfo API values to new values
    Call SetLocalSetting(LOCALE_SDECIMAL, ".")
    Call SetLocalSetting(LOCALE_STHOUSAND, ",")
    Call SetLocalSetting(LOCALE_SMONDECIMALSEP, ".")
    Call SetLocalSetting(LOCALE_SMONTHOUSANDSEP, ",")
    Call SetLocalSetting(LOCALE_SSHORTDATE, "yyyy/MM/dd")
    Call SetLocalSetting(LOCALE_SCURRENCY, "$")
    Call SetLocalSetting(LOCALE_STIMEFORMAT, "HH:mm:ss")
    'check your control panel to verify or use the GetLocaleInfo API function
    Stop
    
    'Restore SetLocaleInfo API values
    Call SetLocalSetting(LOCALE_SDECIMAL, ",")
    Call SetLocalSetting(LOCALE_STHOUSAND, ".")
    Call SetLocalSetting(LOCALE_SMONDECIMALSEP, ",")
    Call SetLocalSetting(LOCALE_SMONTHOUSANDSEP, ".")
    Call SetLocalSetting(LOCALE_SSHORTDATE, "dd-MM-yy")
    Call SetLocalSetting(LOCALE_STIMEFORMAT, "H:mm:ss")
    Call SetLocalSetting(LOCALE_SCURRENCY, "€")

End Sub

Private Function SetLocalSetting(LC_CONST As Long, Setting As String) ''As Boolean
    Call SetLocaleInfo(GetUserDefaultLCID(), LC_CONST, Setting)
End Function

Daar kan ik nog wel wat hulp bij gebruiken. In ieder geval al bedankt voor je hulp zover.
 
Je kunt alle constanten die je niet nodig hebt er wel uitgooien; tenzij je denkt dat je ze ooit gaat gebruiken. Houdt je code een stuk overzichtelijker :) De functie die ik je gegeven heb, met de Msgbox, kun je gebruiken om variabelen te vullen. Gewoon Public variabelen declareren voor de gewenste instellingen, en Msgbox vervangen door de variabelenaam. Dus iets als:

Code:
Sub testje()
    pubDecimal = fLocaleInfo(LOCALE_SDECIMAL)
    pubTimeFormat = fLocaleInfo(LOCALE_STIMEFORMAT)
    pubShortDate = fLocaleInfo(LOCALE_SSHORTDATE)
    etc.
End Sub

Het terugzetten doe je dan als volgt:
Code:
    Call SetLocalSetting(LOCALE_SDECIMAL, pubDecimal)
    Call SetLocalSetting(LOCALE_STHOUSAND, pubThousand)
    Call SetLocalSetting(LOCALE_STIMEFORMAT, pubTimeFormat)
    Call SetLocalSetting(LOCALE_SSHORTDATE, pubShortDate)
    etc.
 
Ik denk dat ik snap wat we proberen te doen namelijk de Landinstellingen van de gebruiker op te slaan in een variable die bij het sluiten van de database weer aangeroepen word. Zodat zeker de originele instellingen worden terug gezet.

Maar het lukt mijn toch echt niet om dit voor elkaar te krijgen. Ik geloof dat ik al gezegd had ik ik een vba noob ben:rolleyes:

Ik ben al begonnen met de online cursus maar net als vroeger bij wiskunde zie ik het verband niet :confused:

Ik ben nu al een tijdje aan het rommelen en krijg alleen complileer fouten. Dit komt vast doordat ik niet weet wat in welke volgorde moet staan en wat ik uit de originele module nodig heb om dit voor elkaar te krijgen.
 
He wordt tijd voor een voorbeeldje; de code die ik je geeft werkt prima, dus daar zou je mee uit de voeten moeten kunnen. Als je het niet aan de praat krijgt, scheelt het een hoop tijd als we jouw db kunnen bekijken.
 
Ik geloof best dat jouw code prima werkt maar als een VBA dummy weet ik niet wat waar neer te zetten. Ik heb een module UScountrysettings. Als ik deze uitvoer via stap dan doet deze wat hij moet doen. Met de andere 3 te modules heb ik wat lopen rommelen en diegene die dit ziet zal zich vast rot lachen maar dat mag best;). Ik heb de foutmelding opgezocht en krijg dus een ByRef argument type Mismatch error.

Ik heb een test database bijgevoegd waarin 4 modules zitten.
 

Bijlagen

Door alle verschillende onderdelen in aparte modules te zetten, maakte je het jezelf bepaald niet makkelijk; een stevig aantal constanten en variabelen werkt namelijk lokaal, en die moet je dan wel in alle modules opnieuw declareren. Met als bijkomend nadeel, dat ze hun waarden verliezen. Dus dat schiet niet op. Bovendien heb je de door mij geadviseerde variabelen wel overgenomen, maar niet gedeclareerd. En dat maakt het probleem onoplosbaar. Oplossing is dus, om alles gewoon in één module te houden, en alles goed te declareren. En dan ziet zo'n pagina er zo uit:

Declareren van de variabelen en Functies
Code:
Option Compare Database
Option Explicit

Private Declare Function SetLocaleInfo Lib "kernel32" Alias "SetLocaleInfoA" _
    (ByVal Locale As Long, ByVal LCType As Long, ByVal lpLCData As String) As Boolean
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 apiGetLocaleInfo 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 GetUserDefaultLCID% Lib "kernel32" ()
Private Declare Function GetSystemDefaultLCID Lib "kernel32" () As Long

Public pubDecimal As String
Public pubThousand As String
Public pubMonDecimalSep As String
Public pubMonThousandSep As String
Public pubShortDate As String
Public pubTimeFormat As String
Public pubCurrency As String

Private Const LOCALE_SCOUNTRY As Long = &H6
Private Const LOCALE_SCURRENCY As Long = &H14
Private Const LOCALE_SDATE As Long = &H1D
Private Const LOCALE_SDECIMAL As Long = &HE
Private Const LOCALE_SLIST As Long = &HC
Private Const LOCALE_SLONGDATE As Long = &H20
Private Const LOCALE_SMONDECIMALSEP As Long = &H16
Private Const LOCALE_SMONGROUPING As Long = &H18
Private Const LOCALE_SMONTHOUSANDSEP As Long = &H17
Private Const LOCALE_SNATIVECURRNAME As Long = &H1008
Private Const LOCALE_SPOSITIVESIGN As Long = &H50
Private Const LOCALE_SSHORTDATE As Long = &H1F
Private Const LOCALE_SSORTNAME As Long = &H1013
Private Const LOCALE_STHOUSAND As Long = &HF
Private Const LOCALE_STIME As Long = &H1E
Private Const LOCALE_STIMEFORMAT As Long = &H1003
Private Const LOCALE_SYEARMONTH As Long = &H1006

Public Const LOCALE_SYSTEM_DEFAULT& = &H800
Public Const LOCALE_USER_DEFAULT& = &H400

Private Const cMAXLEN = 255

Opslaan van de originele waarden in Public variabelen (zie hierboven)
Code:
Sub StoreUserSettings()
'Store values into memory
    pubDecimal = flocaleinfo(LOCALE_SDECIMAL)
    pubThousand = flocaleinfo(LOCALE_STHOUSAND)
    pubMonDecimalSep = flocaleinfo(LOCALE_SMONDECIMALSEP)
    pubMonThousandSep = flocaleinfo(LOCALE_SMONTHOUSANDSEP)
    pubShortDate = flocaleinfo(LOCALE_SSHORTDATE)
    pubTimeFormat = flocaleinfo(LOCALE_STIMEFORMAT)
    pubCurrency = flocaleinfo(LOCALE_SCURRENCY)
End Sub

Instellen van de nieuwe land settings
Code:
Sub SetUsCountrySettings()
'SetLocaleInfo API values to new values
    Call SetLocalSetting(LOCALE_SDECIMAL, ".")
    Call SetLocalSetting(LOCALE_STHOUSAND, ",")
    Call SetLocalSetting(LOCALE_SMONDECIMALSEP, ".")
    Call SetLocalSetting(LOCALE_SMONTHOUSANDSEP, ",")
    Call SetLocalSetting(LOCALE_SSHORTDATE, "yyyy/MM/dd")
    Call SetLocalSetting(LOCALE_SCURRENCY, "$")
    Call SetLocalSetting(LOCALE_STIMEFORMAT, "HH:mm:ss")
End Sub

Herstellen van de originele waarden.
Code:
Sub RestoreUsersettings()
'Restore SetLocaleInfo API values to user settings
    Call SetLocalSetting(LOCALE_SDECIMAL, pubDecimal)
    Call SetLocalSetting(LOCALE_STHOUSAND, pubThousand)
    Call SetLocalSetting(LOCALE_SMONDECIMALSEP, pubMonDecimalSep)
    Call SetLocalSetting(LOCALE_SMONTHOUSANDSEP, pubMonThousandSep)
    Call SetLocalSetting(LOCALE_SSHORTDATE, pubShortDate)
    Call SetLocalSetting(LOCALE_STIMEFORMAT, pubTimeFormat)
    Call SetLocalSetting(LOCALE_SCURRENCY, pubCurrency)
End Sub

Functie die de originele waarden uitleest.
Code:
Function flocaleinfo(lngLCType As Long) As String
Dim lngLocale As Long
Dim strLCData As String, lngData As Long
Dim lngX As Long

    strLCData = String$(cMAXLEN, 0)
    lngData = cMAXLEN - 1
    lngX = apiGetLocaleInfo(LOCALE_USER_DEFAULT, lngLCType, strLCData, lngData)
    If lngX <> 0 Then
        flocaleinfo = Left$(strLCData, lngX - 1)
    End If
End Function

Functie die de nieuwe waarden instelt
Code:
Private Function SetLocalSetting(LC_CONST As Long, Setting As String) 
    Call SetLocaleInfo(GetUserDefaultLCID(), LC_CONST, Setting)
End Function
 
Door alle verschillende onderdelen in aparte modules te zetten, maakte je het jezelf bepaald niet makkelijk; een stevig aantal constanten en variabelen werkt namelijk lokaal, en die moet je dan wel in alle modules opnieuw declareren. Met als bijkomend nadeel, dat ze hun waarden verliezen. Dus dat schiet niet op. Bovendien heb je de door mij geadviseerde variabelen wel overgenomen, maar niet gedeclareerd. En dat maakt het probleem onoplosbaar. Oplossing is dus, om alles gewoon in één module te houden, en alles goed te declareren.

Heel erg bedankt voor je hulp:thumb: ik ga straks verder mee aan de slag eerst even Terra Nova terugkijken :D


Ik had wel geprobeerd de variabele te declareren maar als Dim in plaats van Private en niet als string maar as long en dat werkte dus niet dus had dat stukje code weer verwijderd. Voor mij is het allemaal Trail en error. Soms lukt er iets vaker niet in VBA:P

Als je alles in een module zet wordt deze dan niet achter elkaar uitgevoerd? Want dan zou er uiteindelijk nog niets gebeuren. Ik wou de module van storeUsersettings en SetUserlocale in 1 module bij het openen van de database in een macro zetten (autoexec) en bij het sluiten de RestoreUsersettings() via een macro aanroepen. Maar ik begrijp dat dit dus niet gaat werken. Hoe roep ik deze module nu dan aan want hij moet geactiveerd worden op het moment dat database geopend wordt.
 
De variabelen zijn String, niet Long. En ook niet Private, want ze moeten dus als Public gedeclareerd worden om door de hele database hun waarde te blijven behouden. Je kunt de aparte procedures prima aanroepen via een macro, mits ze als Public zijn gedefinieerd. Je moet dus van Sub SetUsCountrySettings() Public Function SetUsCountrySettings() maken, dan kun je ze in de macro terugvinden.
 
Nogmaals bedankt voor de uitleg.

Ik heb de modules nu werkend. Geen errors meer. De notaties in landinstellingen worden ook netjes aangepast en ook weer terug gezet bij het sluiten van de database. Alleen het probleem is dat als ik in de tabel kijk de gegevens nog niet goed weer gegeven worden. Tijdens het openen van de database open ik een autoexec macro. Deze doet 3 dingen.

1. Store usersettings
2. Set us countrysettings
3. Open een verborgen formulier.

Het verborgen formulier zorgt ervoor dat bij het sluiten van de database de orginele landinstellingen worden terug gezet. Als ik de functie RestoreUsersettings terugzetten uitschakel en ik start de database nogmaals opnieuw op dan staan er wel de juiste waarden in de tabel. Hieruit concludeer ik dat Ondanks de land instellingen bij de eerste keer opstart van de database goed staan en de modules goed werken Microsoft Acces hier niet goed mee omgaat. Waarschijnlijk leest Access dus als bij starten de waarde van de land instellingen uit in plaats bij het openen van een object.

Voorbeeld in bijlage.

Enig suggestie om dit op te lossen?
 

Bijlagen

Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan