Avatar billede janriis Nybegynder
28. januar 2004 - 08:36 Der er 22 kommentarer og
4 løsninger

Opdatering af Access DB fra Excel

Hej

Jeg har et Excel regneark med følgende data:

Dato
Medarbejdernr
Navn
opgaveart1 (antal færdige)
opgaveart2 (do)
opgaveart3 (do)
opgaveart4 (do)

Jeg har oprettet en tilsvarende Access DB som ligger på et fællesdrev og denne ønsker jeg opdateret. Opdatering skal kunne gøres fra Excel-arket, ved at brugeren trykker på knappen "opdater database"

Hvordan gør jeg det med VBA?
Avatar billede terry Ekspert
28. januar 2004 - 09:43 #1
Avatar billede overchord Nybegynder
28. januar 2004 - 13:20 #2
fremfor at importere Excel arket kunne du linke til det fra din DB. Paa den maade vil opdatering blive hentet ind i databasen
Avatar billede janriis Nybegynder
28. januar 2004 - 13:31 #3
Hej Terry
Jeg kopieret koden i første eksempel og rettet den til efter min egen database. Jeg får fejlen "compile error: user type not defined" her er min kode:

* * * start kode * * *

Private Sub CommandButton4_Click()

On Error GoTo Err_commandbutton4_Click

Dim stAppName As String
Dim db As Database
Dim rs As Recordset
Dim rs1 As Recordset
mydate = Date
'Åbn et link til accessdatabasen
Set db = OpenDatabase("c:\temp\statistik.mdb")
'åbn kanal til tabellen tabelstatistik
Set rs = db.OpenRecordset(Name:="tabelstatistik", Type:=dbOpenDynaset)
'indsæt
With rs
If Range("e3").Value = "x" Then
.AddNew
.Fields![dato] = Range("b4").Value
.Fields![ugenr] = Range("a7").Value
.Fields![medarbejderNavn] = Range("b7").Value
.Update

End If
End With

End Sub

* * * Slut kode * * *

Hvad er der galt ?
Avatar billede terry Ekspert
28. januar 2004 - 13:46 #4
what line of code is giving the problem? You may need a reference to DAO (Microsoft DAO 3.X) ro something like that. Not sure how you do that in Excel!
Avatar billede janriis Nybegynder
28. januar 2004 - 14:50 #5
Hej terry

Denne kode : "Dim db As Database" er markeret når jeg får fejlen
Avatar billede terry Ekspert
28. januar 2004 - 15:06 #6
do you have a reference to DAO?
Avatar billede janriis Nybegynder
28. januar 2004 - 15:41 #7
Hej terry

Det havde jeg ikke, men har tilføjet det nu (Microsoft 2.5/3.5 Compatability Lib.)
Nu får jeg en anden fejl (det bliver sjovere og sjovere) :
Run-time error '3343':
Databaseformatet "c:\temp\statistik.mdb" kan ikke genkendes
Avatar billede hnteknik Novice
28. januar 2004 - 16:02 #8
Jeg samler en række data op fra regneark og smider dem i en fælles databasse.

Du skal lave en reference til ADO 2.5 i dit regneark.

Uanset om du har installeret Access eller ej, skal du have opdateret dine
ADO (ActiveX Data Object) drivere til version 2.5 SP3.

Hent filen hos M$ - den hedder mdac_typ.exe

Når den er installeret behøves man ikke at have Access for at overføre data til EN ACCESS.MDB
HENRIK
Avatar billede terry Ekspert
28. januar 2004 - 16:03 #9
I dont know much about Excel but if you have an access 2000 dB then I think you will need DAO 3.6! So you may need to update! You will need to download a newer version of MDAC from Microsoft.
Avatar billede hnteknik Novice
28. januar 2004 - 16:05 #10
HOV - DENNE SKULLE GERNE MED

Sub HENFraExcelTilAccess()
' eksporter data fra det aktive worksheet til en tabel i en Access database

Dim cn As ADODB.Connection, rs As ADODB.Recordset, r As Long
'Husk at sætte en referece til ADO objectet under funktioner:
'Microsoft ActiveX Data Objects 2.5 Object Library.

    ' Lav en forbindelse til Access databasen
    Set cn = New ADODB.Connection
    cn.Open "Provider=Microsoft.Jet.OLEDB.4.0; " & _
        "Data Source=G:\INGRISKM\5-Egne-udviklede-Programmer\tarifdata\tarif_data.mdb;"
    ' Åben et recordset
    Set rs = New ADODB.Recordset
    rs.Open "tbltest", cn, adOpenKeyset, adLockOptimistic, adCmdTable
    ' alle records i en tabel
   
    'eksempel på brug
    r = 3 ' start række i et worksheet
    Do While Len(Range("A" & r).Formula) > 0
    ' Fosæt indtil første tomme celle i kolonne A
        With rs
            .AddNew ' tilføj ny record
            ' tilføj værdier til hvert felt i recorden
            .Fields("felt1") = Range("A" & r).Value
            .Fields("felt2") = Range("B" & r).Value
            .Fields("felt3") = Range("C" & r).Value
            ' tilpas til aktuel tabel
            .Update ' gen den nye record
        End With
        r = r + 1 ' næste række
    Loop
    rs.Close ' luk skidtet
    Set rs = Nothing
    cn.Close ' også her
    Set cn = Nothing
    ' slut prut finale
End Sub
Avatar billede hnteknik Novice
28. januar 2004 - 16:12 #11
Jeg skal måske lige nævnte, at det snurrer alt sammen i office97
Avatar billede hnteknik Novice
28. januar 2004 - 16:16 #12
Jeg har også noget kørende, som først tester om recorden eksisterer, hvis ikke oprettes en ny ellers opdateres data.
Avatar billede terry Ekspert
28. januar 2004 - 16:17 #13
Then you should keep to DAO and 3.5 should be enough!
Can you not find a reference to Microsoft DAO 3.5? (not the Compatability Lib)
Avatar billede hnteknik Novice
28. januar 2004 - 16:20 #14
Sorry Terry
Its I who runs it all in 97 ready for 2000/XP
He's probably running 2000/XP and needs reference to ADO
Henrik
Avatar billede terry Ekspert
28. januar 2004 - 16:29 #15
I need to pay cloder attention :o)
Yes your probablyright there Henrik!
Avatar billede janriis Nybegynder
29. januar 2004 - 09:02 #16
hnteknik> Hvordan skal koden se ud hvis det er faste celler i arket som jeg ønsker at få opdateret i tabellen? Jeg har følgende data :

Dato : celle b4
ugenr: celle a7
medarbejdernavn : celle b7
osv.
Avatar billede hnteknik Novice
29. januar 2004 - 10:48 #17
jamen det er nemt nok

with rs
.open "tbl where ID = xxx" ......
if .eof
.addnew
.fields("ID") = range("B7").value
end if
.fields("Dato") = range("b4").value
.fields("ugenr") = range("a7").value
....
.update
.close
end with
....
Avatar billede janriis Nybegynder
29. januar 2004 - 11:18 #18
Undskyld hnteknik, men jeg er altså en newbie hvad VBA angår, nedenfor ser du min kode som du,terry mfl. har hjulpet mig frem til. Som den er nu, får jeg lagt værdien af celle B7 over i tabellen som den skal. Hvordan får jeg rettet til med dit sidste indlæg? jeg forstår ikke helt ".open "tbl where ID =xxx"

* * * Code start * * *

Private Sub CommandButton4_Click()
' exports data from the active worksheet to a table in an Access database
' this procedure must be edited before use
Dim cn As ADODB.Connection, rs As ADODB.Recordset, r As Long
' connect to the Access database
Set cn = New ADODB.Connection
cn.Open "Provider=Microsoft.Jet.OLEDB.4.0; " & _
"Data Source=C:\temp\kvaks_statistik.mdb;"
' open a recordset
Set rs = New ADODB.Recordset
rs.Open "tabelstatistik", cn, adOpenKeyset, adLockOptimistic, adCmdTable

' Denne henter medarbejdernavn
r = 7 ' the start row in the worksheet
Do While Len(Range("B" & r).Formula) > 0
' repeat until first empty cell in column B
With rs
.AddNew ' create a new record
' add values to each field in the record
.Fields("medarbejdernavn") = Range("B" & r).Value
' add more fields if necessary...
.Update ' stores the new record
End With
r = r + 1 ' next row
Loop



rs.Close
Set rs = Nothing
cn.Close
Set cn = Nothing
End Sub
Avatar billede hnteknik Novice
29. januar 2004 - 11:41 #19
Glem det for .... r next
er kun et eksempel
Jeg går ud fra at din tabel har en nøgleID som enten skal rettes eller oprettes.
Hvis du søger på nøglen og intet finder noget .eof, så må du oprette en ny .add new

  ' Lav en forbindelse til Access databasen
    Set cn = New ADODB.Connection
    cn.Open "Provider=Microsoft.Jet.OLEDB.4.0; " & _
        "Data Source=" & DataSti & ";"
    ' Åben et recordset
    Set rs = New ADODB.Recordset
    rs.Open "tblxxx where RSnr = '" & RSnr & "'", cn, adOpenKeyset, adLockOptimistic, adCmdTable
    ' alle records i en tabel
   
        With rs
            If .EOF Then
                .AddNew ' tilføj ny record
                .Fields("RSnr") = RSnr ' dette er typisk nøglefeltet
            End If
           
            ' tilføj værdier til hvert felt i recorden
            .Fields("RISKnavn") = RISKnavn
            .Fields("RISKAdr") = RISKAdr
            .Fields("Tarifdato") = Tarifdato
            .Fields("BASISKODE") = BASISKODE
            .Fields("C1") = C1
            .Fields("C2") = C2
            .Fields("C3") = C3
            .Fields("C4") = C4
            .Fields("C5") = C5
            .Fields("C6") = C6
            .Fields("Totalpoints") = Totalpoints
            .Fields("basis") = basis
            .Fields("basisR") = basisR
            .Fields("Ratel") = Ratel
            .Fields("Rated") = Rated
            .Fields("Rateb") = Rateb
            .Fields("Ratea") = Ratea
            .Fields("tarifVersion") = tarifVersion
            ' tilpas til aktuel tabel
            .Update ' gem den nye record
           
        End With
    rs.Close ' luk skidtet
    Set rs = Nothing
    cn.Close ' også her
    Set cn = Nothing
    ' slut prut finale

de forskellige variable er bare nogle range values:
        Range("L44").Value, _
        Range("L56").Value, _
        Range("L70").Value, _
        Range("L76").Value, _
        Range("L105").Value, _
Avatar billede janriis Nybegynder
29. januar 2004 - 12:01 #20
takker begge 2, håber det er ok at i deler point
Avatar billede hnteknik Novice
29. januar 2004 - 14:25 #21
OK with me. Terry´s me pal within access
Avatar billede terry Ekspert
29. januar 2004 - 19:29 #22
I can only say thanks to you both :o)
Avatar billede janriis Nybegynder
02. februar 2004 - 10:43 #23
Hej
Jeg var for hurtig ude, det virker ikke alligevel, jeg forsøger at opdatere min database med medarbejdernavn fra celle B7 og dato fra celle b4, men får en run-time error om at der ikke er angivet nogen værdi for en eller flere krævede parametre, se min kode, hvad har jeg gjort forkert :-(


Private Sub knapTestOpdater_Click()
' Lav en forbindelse til Access databasen
    Set cn = New ADODB.Connection
    cn.Open "Provider=Microsoft.Jet.OLEDB.4.0; " & _
        "Data Source=C:\temp\kvaks_statistik.mdb;"
    ' Åben et recordset
    Set rs = New ADODB.Recordset
    rs.Open "tabelstatistik where RSnr = '" & RSnr & "'", cn, adOpenKeyset, adLockOptimistic, adCmdTable
    ' alle records i en tabel
   
        With rs
            If .EOF Then
                .AddNew ' tilføj ny record
                .Fields("ID") = ID ' dette er typisk nøglefeltet
            End If
           
            ' tilføj værdier til hvert felt i recorden
            .Fields("medarbejdernavn") = Range("B7").Value
            .Fields("dato") = Range("b4").Value
                       
            ' tilpas til aktuel tabel
            .Update ' gem den nye record
           
        End With
    rs.Close ' luk skidtet
    Set rs = Nothing
    cn.Close ' også her
    Set cn = Nothing
    ' slut prut finale
Avatar billede hnteknik Novice
02. februar 2004 - 16:07 #24
Du skal tilrette din funktion, så alle poster i databasen får en værdi. Mit gæt er, at du ikke har tilrettet den kode, jeg har lagt ind efter din tabel:

Fejlkilder her:

.Fields("ID") = ID  --> ID er ikke defineret hos dig
tabelstatistik where RSnr = '" & RSnr --> RSnr er ikke defineret hos dig. hvis du skal have en ny værdi hver gang så er følgende nok:

rs.Open "tabelstatistik", cn, adOpenKeyset, adLockOptimistic, adCmdTable
....
    .AddNew ' tilføj ny record
....
    .Fields("medarbejdernavn") = Range("B7").Value
    .Fields("dato") = Range("b4").Value
    .Fields("ugenr") = range("a7").value
.....
Henrik
Avatar billede hnteknik Novice
02. februar 2004 - 16:23 #25
Jeg fornemmer, at du ikke er helt stiv i vb programmering, så her er et testeks.:
Sub test()

Datasti = "C:\temp\test.mdb"
  ' Lav en forbindelse til Access databasen
    Set cn = New ADODB.Connection
    cn.Open "Provider=Microsoft.Jet.OLEDB.4.0; " & _
        "Data Source=" & Datasti & ";"
    ' Åben et recordset
    Set rs = New ADODB.Recordset
    rs.Open "tblstat", cn, adOpenKeyset, adLockOptimistic, adCmdTable
    ' alle records i en tabel
   
        With rs
           
            .AddNew ' tilføj ny record

           
            ' tilføj værdier til hvert felt i recorden
            .Fields("medarbejdernavn") = Range("B7").Value
            .Fields("dato") = Range("b4").Value
            .Fields("ugenr") = Range("a7").Value
           
            ' tilpas til aktuel tabel
            .Update ' gem den nye record
           
        End With
    rs.Close ' luk skidtet
    Set rs = Nothing
    cn.Close ' også her
    Set cn = Nothing
    ' slut prut finale

End Sub

data overført er :

medarbejdernavn    dato    ugenr
henrik nielsen    01-01-2004    47
Søren spætte    09-01-2004    34
Avatar billede janriis Nybegynder
03. februar 2004 - 09:50 #26
Hej hnteknik
Du har ret jeg er total newbie hvad angår VB, men jeg har masser af visioner og en chef der belønner gode ideer :-) Så jeg er glad for at der er et forum som dette.
Endnu en gang tak. Mit næste projekt er at få tilføjet et "er du sikker?" til min "opdater database" knap
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester