Avatar billede len Nybegynder
06. oktober 2003 - 13:09 Der er 22 kommentarer og
1 løsning

Opdatere ACSESS tabel fra EXCEL

Hej igen,

Jeg stillede spørgsmålet tidligere..prøvede nogle af de løsningsforslag der kom, men jeg kan ikke få det rigtigt til at virke.

Mit probelem !

Jeg har et excel regneark som bruger skal udfylde, dataerne skal så automatisk overføres til access via et script. Når det er en kursist som oprettes er der ingen problemer. MEN hvis jeg vil opdatere kursistdata fra excel, så siger den, at den ikke kan opdatere, pga. dubletter.

Min nøgle i access tabellen er "fdato", den er sat til at være indexseret og tillade dubletter. scriptet som jeg bruge i excel ser sådan ud:

Hvordan kan jeg programmere det, således at tabellen i access bliver opdateret med de rigtige data fra excel??

Private Sub CommandButton1_Click()
On Error GoTo Err_commandbutton1_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:\kursistadm\data.mdb")
'åbn kanal til tabellen testtabellen
Set rs = db.OpenRecordset(Name:="bruger", Type:=dbOpenDynaset)
'indsæt
With rs
If Range("C4").Value = "x" Then
.AddNew
.Fields![Fornavn] = Range("H10").Value
.Fields![efternavn] = Range("Z10").Value
.Fields![brugerident] = Range("AW19").Value
.Fields![arbssted] = Range("J16").Value
.Fields![Fdato] = Range("J8").Value
.Update

End If

If Range("C5").Value = "x" Then
.Edit
.Fields![Fornavn] = Range("H10").Value
.Fields![efternavn] = Range("Z10").Value
.Fields![brugerident] = Range("AW19").Value
.Fields![Fdato] = Range("J8").Value
.Update

End If
End With
Avatar billede jkrons Professor
06. oktober 2003 - 13:13 #1
Din nøgle i Access må vel ikke tillade dubletter. Hvis der er to eller flere med samme fødslesdato i Access tabellen, ved den ikke hvilken af dem det er, der skal opdateres.
Avatar billede len Nybegynder
06. oktober 2003 - 13:20 #2
Det er rigtigt, men det er problemet.. hvordan kan jeg opdatere en kursist som findes i forvejen via excel.

Hvordan kan jeg få access til at finde den rigtigt post og få lov til at ændre i oplysningerne ?? det er mit problem
Avatar billede jkrons Professor
06. oktober 2003 - 13:22 #3
Så vidt jeg kan se, må det kræve at du har en entydig nøgle i Access, som du kan "søge på".
Avatar billede len Nybegynder
06. oktober 2003 - 13:24 #4
Hvis jeg laver fdato om til en entydig nøgle ?, har du en ide hvordan jeg så får access til at finde den bestemte post, og give mig lov til at rette i oplysningerne?
Avatar billede terry Ekspert
06. oktober 2003 - 13:33 #5
Looking at the fields I would guess that "brugerident" is the primary key in the table "bruger". If that is correct then you first need to check IF that user alreday exists. You could maybe do this something like this.

SET rs1 = db.OpenRecordset "SELECT Count(*) as cnt from bruger where brugerident = " & Range("AW19").Value


If rs!cnt = 0 Then

'ADD record

Else
'Update record
Endif


NOTE>This is only to give you an idea, I have NOT checked a thing!
Avatar billede len Nybegynder
06. oktober 2003 - 13:37 #6
Hej Terry,

nu er det fdato som er primærnøglen i tabellen, men proceduren er vel den samme .. jeg vil godt det..
Avatar billede jkrons Professor
06. oktober 2003 - 13:39 #7
Du behøver ikke at ændre noget i din kode.

Hvis FDATO er entydig kan den direkte opdatere som den er.
Hvis du har/laver et andet entydigt felt, skal det selvfølgelig tilføjses til opdateringskoden.
Avatar billede jkrons Professor
06. oktober 2003 - 13:40 #8
len-> FDATO kan pr. definition ikke være primærnøgle, hvis den ikke er entydig. Det er nemlig et krav til en primærnøgle. Derimod kan den godt være indekseret.
Avatar billede jkrons Professor
06. oktober 2003 - 13:43 #9
Det med at koden virker direkte holder nok ikke alligevel - efter at jeg faktisk har testet det med data i en tabel :-(
Avatar billede terry Ekspert
06. oktober 2003 - 14:30 #10
.AddNew will give an error if the primary key already exists! You MUST test to see if this exists and then either .Addnew or update!

and I would NOt use a date as th eprimary key, CPR number is unique!
Avatar billede len Nybegynder
06. oktober 2003 - 14:56 #11
terry->det vil jeg prøve. har du en programkode der checker om nøglem findes i forvejen og hvis den gør det - updatere data. Det vil være en megahjælp.

Men jeg vil lige prøve det andet.
Avatar billede jkrons Professor
06. oktober 2003 - 14:59 #12
Der findes et eksempel i hjælpen til VBA under FindNext. Det må du kunne tilpasse til din egen database.
Avatar billede terry Ekspert
06. oktober 2003 - 15:05 #13
a quick and dirty way is to assume that the record does NOT exist and when you get an error update!
Avatar billede terry Ekspert
06. oktober 2003 - 18:09 #14
The code example I gave should work, but you need to alter the field names
Avatar billede terry Ekspert
07. oktober 2003 - 12:02 #15
len>hows it going here?
Avatar billede len Nybegynder
09. oktober 2003 - 08:53 #16
-> terry, jeg er lige kommet tilbage på min pind. Regner med at prøve det i løbet af idag.
Avatar billede len Nybegynder
11. oktober 2003 - 22:53 #17
Hmm kunne ikke rigtigt få det til at virke, fik en mærkelig fejl "Databasen er skrivebeskyttet og kan ikke opdaters. du kan se hvordan jeg har prøvet.

Set rs3 = db.OpenRecordset("SELECT Count(*) as cnt from arbssted where fdato = " & Range("J8").Value)

'indsæt

If rs3!cnt = 0 Then
rs3.AddNew
rs3.Fields("Fornavn").Value = Range("H10").Value
rs3.Fields("Stilling").Value = Range("H12").Value
rs3.Fields("arbssted").Value = Range("T12").Value
rs3.Fields("Fdato").Value = Range("J8").Value
rs3.Fields("Efternavn").Value = Range("Z10").Value
Else
rs3.Update

End If
Avatar billede terry Ekspert
12. oktober 2003 - 09:58 #18
Your problem here is that although you are selecting from a table (arbssted) which contains the fields fornav, stilling, arbssted, fdato and efternavn. Then uou are only getting ONE field in the recordset (rs3)! This is because you are selcting count(*) (cnt). If you selected only some of the fields from the table then it is only these fields you can update/add.

So you need to use two recordsets, one for count and then another for the actual update/add.
Avatar billede terry Ekspert
12. oktober 2003 - 09:59 #19
Then uou = Then you
Avatar billede len Nybegynder
12. oktober 2003 - 11:55 #20
Hej Terry

Jeg tro jeg har løst det. Fandt noget herinde som jeg byggede videre på.

If Range("Q5").Value = "x" Then
    rs.MoveFirst
    Max = rs.RecordCount
    For i = 1 To Max
    If rs("fdato") = Range("J8").Value Then
    MsgBox "Vil du opdatere oplysningerne i databasen!", vbOKOnly
    rs.Edit
    rs("Fornavn") = Range("H10").Value
    rs("Efternavn") = Range("Z10").Value
    rs.Update
    End If
    rs.MoveNext
    Next i
End If
Avatar billede terry Ekspert
12. oktober 2003 - 14:30 #21
Looks OK, but I dont understand why this is Q5 (If Range("Q5").Value = "x") but then if it sworking then great :o)
Avatar billede terry Ekspert
13. oktober 2003 - 18:47 #22
are we finished with this question now?
Avatar billede terry Ekspert
14. oktober 2003 - 19:04 #23
tak :o)
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