VBA-konsult

Jag utvecklar även program i Microsoft Excel med VBA. Excel kan automatiseras med hjälp av samma programmeringsspråk (VBA) som används i Access.

Access och Excel kan programmeras så att dom kan styra varandra och utbyta information. Med MS Access kan även exceldokument skapas och t.ex skickas iväg som epost automatiskt eller med några få klick.

Vill du effektivisera hanteringen av Excel, Word, Outlook så kan jag utveckla program för detta i VBA (Visual Basic for Application) i Excel och Access. Då kan programmen göra så att manuell hantering av data automatiseras och på så vis bespara er en massa tid.

Samarbete med Excelkonsult

Jag har även inlett samarbete med erfarna Excelkonsulter. Så behöver ni hjälp med att göra era Exceldokument smartare och mer automatiserade så hör av dig.

Konvertera till Access 2016

Konvertera program till Access 2016

Att uppgradera till Access 2016 från Access 2003, 2007, 2010 och 2013 går relativt snabbt, det tar normal bara någon timme då det bara är några mindre justeringar som behöver göras samt lite vba-kod som behöver ändras. Vid riktigt enkla fall tar det bara 30 minuter.

Access 2010 eller Access 2007

Eftersom Access 2007, Access 2010 och Access 2013 använder samma filformat så kan programmen användas fritt mellan versionerna så när du uppgraderar till en av versionerna så görs det samtidigt till dom andra accessversionerna. Körbara accde-filer som är gjord i 2013 kan dock inte köras i Access 2007 och 2010.

Uppgradera från Access 2000, Access 97, Access 95 och Access 2.0

Om ni har gamla program utvecklade i Access 2.0, Access 95, Access 97 behövs en mer omfattande konvertering av programkoden. Det tar därför lite längre tid att konvertera från dessa. Så några timmar extra behövs vanligtvis.

Vi hjälper er

Kontakta oss så hjälper vi till. Det tar normalt max en timme att uppgradera från Access 2003 till 2016 om programmet är utvecklat enbart med Access standardkomponenter. Vid ev kopplingar till andra program kan det behövas mer tid.

Länka tabeller i Access

När man utvecklar ett dataprogram i Access så är det bra att dela på själva programfilen (frontend) och databasen där data lagras (backend). Då kan man skicka ut nya versioner av programmet utan att data försvinner.

Problemet

Problemet som uppstår när man delar med sig av programmet till andra är att sökvägen till datafilen oftast inte är densamma på andras datorer. Om man till exempel utvecklat programmet på sin dator kan mappen där programmet och databas lagras ha namnet C:\Users\Micke\Documents\Kundregister\

När man sedan skickar program och datafil till någon annan så är sökvägen inte densamma. Tabellerna pekar då till en mapp som inte finns på deras dator och programmet kan inte köras.

Lösningen

Lösningen på detta är att programmet vid start länkar om alla tabeller till den mapp och databas som ska användas. Detta är oftast samma mapp som:
*  programmet ligger i
*  mappen ”Mina dokument”
*  eller en fast sökväg till en server

Exempel på dessa mappar kan vara:
*  C:\Program Files\Kundregister\
*  C:\Users\Per Nilsson\Documents\Kundregister\
*  Z:\Gemensam\datafiler\Kundregister\

För att länka om tabellerna behöver man i Access ta reda på vad t.ex. sökvägen till programmappen eller mappen ’Mina Dokument’ är. Hur man får tag i sökvägarna till programmappen och Mina Dokument har jag beskrivit i inlägget VBA-kod för olika sökvägar.

Därefter länkar man om tabellerna genom att uppdatera egenskapen Connect för tabeller som som finns i datafilen/databasen/backend. Ett funktion för detta i VBA kan se ut så här:

Function kopplaTabell(dbas$, tbl$)
    Dim db As Database, td As TableDef
    On Error Resume Next
    Set db = CurrentDb
    Set td = db.TableDefs(tbl)
    ' Om tabell redan finns tar vi först bort den
    If Err = 0 Then db.TableDefs.Delete (tbl)
    Set td = db.CreateTableDef(tbl)
    td.SourceTableName = tbl
    td.Connect = ";DATABASE=" & dbas
    db.TableDefs.Append td
    RefreshDatabaseWindow
End Function

Sedan gör vi en funktion som tar fram sökväg med filnamn till databasen och anropar den tidigare funktionen en gång för varje tabell som ska kopplas:

Function kopplaDB()
    ' Hitta sökvägen till programmapp och databas
    dbas = sProgramPath()
    dbas = dbas & "\Kundregister\datafilen.mdb"
    ' Koppla tabeller
    kopplaTabell dbas, "Kunder"
    kopplaTabell dbas, "Faktura"
    kopplaTabell dbas, "Fakturarader"
End Function

Kontrollera inmatat pris

Typ: Exempelprogram
Version: Microsoft Access 2003 (kan köras i Access 2007 och 2010)
Filnamn: AccessExempelPris.mdb
Ladda ner: AccessExempelPris.zip

 

Demoprogram som kontrollerar om ett inmatat pris är mindre än 10 eller större än 10000. Om det är det får man ett kontrollfråga där man kan välj att acceptera priset ändå.

Programkoden ser ut så här:

Option Compare Database
Option Explicit

Function mOk(fraga$) As Boolean
    mOk = MsgBox(fraga, vbOKCancel + vbDefaultButton2, "Ok/Cancel i Access") = vbOK
End Function

Function mYes(fraga$) As Boolean
    mYes = MsgBox(fraga, vbYesNo + vbDefaultButton2, "Ok/Cancel i Access") = vbYes
End Function

Private Sub Pris_BeforeUpdate(Cancel As Integer)
    If Pris < 10 Then
        Cancel = Not mYes("Priset är mindre än 10, Spara ändå?")
    ElseIf Pris > 10000 Then
        Cancel = Not mYes("Priset är större än 10000, Spara ändå?")
    End If
End Sub


 

AccessExempelPris.zip

Läs mer om Accessprogram

Formatera datum med ’rätt’ formatsträng

När datumsträngar ska användas i accessprogram är det många gånger viktigt att rätt formatsträng användas. Speciellt om programmet ska användas i olika länder. Då kan man inte använda ”svenska” formatering: Format(dat, "yyyy-mm-dd")
Istället kan man använda nedanstående funktion för att ta reda på vilken formatsträng som ska användas, anropet ser då ut så här: Format(dat, datumFmt())

OBS! Med hjälp av denna funktion kommer datum automatiskt få samma datumformat som datorn använder för datum. Om programmet används på en dator med finska inställningar kommer datumen visas med finska formatet 31.11.2019 istället för 2019-11-31

' Ruturnerar en formatsträng
' som tex kan användas till funktionen Format()
' Exempel på svar:
' 1) "yyyy-mm-dd" om svenskt  datumformat används
' 2) "d.m.yyyy"   om finskt   datumformat används
' 3) "dd-mm-yyyy" om spanskt  datumformat används
' 4) "m/d/yyyy"   om USAs     datumformat används
' 5) "dd/mm/yyyy" om Engelskt datumformat används

Function datumFmt()
    Dim Dat$, ch$, fmt$
    Dat = CStr(DateSerial(2012, 1, 9))
    If InStr(Dat, "-") Then ch = "-": Dat = Replace(Dat, "-", "-")
    If InStr(Dat, ".") Then ch = ".": Dat = Replace(Dat, ".", "-")
    If InStr(Dat, "/") Then ch = "/": Dat = Replace(Dat, "/", "-")
    Select Case Dat
        Case "2012-01-09": fmt = "yyyy-mm-dd"   ' Sverige,Polen
        Case "2012-09-01": fmt = "yyyy-dd-mm"   '
        Case "2012-1-9":   fmt = "yyyy-m-d"   '
        Case "2012-9-1":   fmt = "yyyy-d-m"   '
        Case "09-01-2012": fmt = "dd-mm-yyyy"   ' Spanien
        Case "01-09-2012": fmt = "mm-dd-yyyy"   ' Österrike
        Case "9-1-2012":   fmt = "d-m-yyyy"      ' Finland
        Case "1-9-2012":   fmt = "m-d-yyyy"      ' Usa
        Case Else: MsgBox "Okänt datumformat.": Stop
    End Select
    datumFmt = Replace(fmt, "-", ch)
End Function

Skapa stigande numrering med ny numrering för varje grupp

Hej !

Söker med ljus och lykta efter en lösning på mitt bekymmer men inte hittat något.

Jag behöver skapa en numrering av posterna i en fråga (skulle även kunna vara en tabell). Det vore inga problem om det bara skulle vara en enkel stigande numrering, det löses med en räknare.

Mitt önskemål är att numreringen ska börja om för varje nytt värde i ett av fälten.

T ex:
Kundgrupp – KundNum:
X — A — 1
X — B — 2
X — C — 3
Y — D1
Y — E2
ZF1
ZG2
ZH3

Så i fältet ”Num” vill jag få in en funktion som skapar en ny numrering för varje förändring i ”Kundgrupp”

Finns det någon SQL kod som kan skapa en sådan alternativt någon annan funktion?

Mvh // Håkan

VBA-kod för olika sökvägar

Ibland vill man ha veta sökvägarna till bl.a Mina dokumnet (My Documents) och till programmappen. Sökvägarna skiljer sig ju mellan olika användare och olika operativsystem. Här är lite kod för det.

Accesskod till Mina dokument:

Function sMyDocumentsPath()
    Const MY_DOCUMENTS = &H5&
    Dim objShell
    Dim objFolder
    Dim objFolderItem
    Set objShell = CreateObject(”Shell.Application”)
    Set objFolder = objShell.Namespace(MY_DOCUMENTS)
    Set objFolderItem = objFolder.Self
    'My Documents path
    sMyDocumentsPath = objFolderItem.path
End Function

Accesskod till programmappen:

Function sProgramPath()
    Const PROGRAM_FILES = &H26&
    Dim objShell
    Dim objFolder
    Dim objFolderItem
    Set objShell = CreateObject("Shell.Application")
    Set objFolder = objShell.Namespace(PROGRAM_FILES)
    Set objFolderItem = objFolder.Self
    sProgramPath = objFolderItem.path
End Function