[ BiloKoje @ 25.12.2017. 11:47 ] @
Acces baza je napravljena u .mdb formatu, zatim je updateovana u .accdb, radila je u Accessu 2010 na 32bitnom sistemu.
Na 64bitnom sistemu odmah prijavljuje grešku i pokazuje na modul u kojem se nalazi sledeći kod:

Code:

Option Compare Database

Option Explicit

Declare Function LoadKeyboardLayout Lib "user32" Alias "LoadKeyboardLayoutA" (ByVal pwszKLID As String, ByVal flags As Long) As Long
Declare Function ActivateKeyboardLayout Lib "user32" (ByVal hkl As Long, ByVal flags As Long) As Long
Declare Function UnloadKeyboardLayout Lib "user32" (ByVal hkl As Long) As Long
Declare Function GetKeyboardLayoutName Lib "user32" Alias "GetKeyboardLayoutNameA" (ByVal pwszKLID As String) As Long

Const HKL_ENGLISH_US = "00000409"
Const HKL_ENGLISH_UK = "00000809"
Const HKL_CROATIAN = "0000041A"
Const HKL_SERBIAN_CYRILIC = "00000C1A"
Const HKL_SERBIAN_LATIN = "0000081A"

Public Enum acKeyboardLanguage
    hklEnglishUS
    hklEnhlishUK
    hklCroatian
    hklSerbianCyrilic
    hklSerbianlatin
End Enum

Function SetKeyboardLanguage(KeyboardLanguage As acKeyboardLanguage) As Boolean
    Dim hkl As Long
    SetKeyboardLanguage = False
    Select Case KeyboardLanguage
        Case hklEnglishUS:
            hkl = LoadKeyboardLayout(HKL_ENGLISH_US, 0)
        Case hklEnhlishUK
            hkl = LoadKeyboardLayout(HKL_ENGLISH_UK, 0)
        Case hklCroatian
            hkl = LoadKeyboardLayout(HKL_CROATIAN, 0)
        Case hklSerbianCyrilic
            hkl = LoadKeyboardLayout(HKL_SERBIAN_CYRILIC, 0)
        Case hklSerbianlatin
            hkl = LoadKeyboardLayout(HKL_SERBIAN_LATIN, 0)
    End Select
    If hkl <> 0 Then SetKeyboardLanguage = (ActivateKeyboardLayout(hkl, 0) <> 0)
End Function


Molim za pomoć, kako da menjam postavke jezika iz VBA koda u 64bitnom Accesu 2010.
Verovatno će biti i drugih problema sa starim funkcijama?
[ SLOJ.1973 @ 26.12.2017. 19:12 ] @
Nadjoh nesto ovde.Pozdrav.
[ BiloKoje @ 27.12.2017. 10:27 ] @
Hvala, ipak sam morao da vratim 32 bitni Office, ostao je W7 64bitni, tako da mi rade sva stara rešenja.
Možda u nekom momentu isprobam funkcije iz primera na drugom računaru.
[ djoka_l @ 27.12.2017. 11:16 ] @
Pa, bilo bi svima lakše da si napisao i koju si grešku dobio.
Koliko vidim iz dokumentacije, funkcije ActivateKeyboardLayout, UnloadKeyboardLayout očekuju, na mestu gde si stavio long (hkl), 32-bitni integer podatak. Naravno da na 64-bitnom sistemu neće proći pozivanje funkcija iz user32.dll sa 64-bitnim podacima tamo gde se očekuju 32-bitni podaci.
[ Dzaja @ 28.12.2017. 08:35 ] @
Imao sam slične/iste probleme pa sam nakon malo guglanja našao rješenje. Zbog ovog članka, gdje MS sam preporučuje instalacije 32bitnog Offica na 64bitne sisteme - link za Office 2013, instaliram samo 32bitne verzije, ALI neki korisnici moraju silom prilika instalirati 64 (zahtjevi na poslu). U tom članku MS je tu negdje napisao da:
„VBA code that uses Declare statements must be updated“

Long tip podataka je isključivo 32bitni, trebalo bi ga promjeniti na LongLong (samo za 64) ili LongPtr (32/64) uključujući PtrSafe opis u svim deklaracijama.
- tada bi umjesto:
Citat:
Declare Function UnloadKeyboardLayout Lib "user32" (ByVal hkl As Long) As Long

- trebalo pisati:
Citat:
Declare PtrSafe Function UnloadKeyboardLayout Lib "user32" (ByVal hkl As LongPtr) As LongPtr

Pored ovoga, da bi kod radio i u VBA7 i VBA6, morao bi deklaracije ubaciti u IF petlju
Code:

#If Vba7 Then 
Declare PtrSafe Sub... 
#Else 
Declare Sub... 
#EndIf 


Evo na ovim linkovima je detaljnije objašnjeno 64bit VBA overview i deklaracije.