05. april 2009 - 22:14Der er
8 kommentarer og 1 løsning
Excel access integration macro
Hej allesamen, Jeg har nu prøvet at løse et problem i lang tid, men ikke fundet den rette løsning.
Jeg vil meget gerne have 2 makroer som kan administrere integrationen imellem excel og access. Problemerne er følgende:
Der er i begge tilfælde tale om 1 unik nøgle: Her CPR. Efter CPR ("A1") kommer der 3 mulige input ("B1", "C1", "D1"), dette er det samme i access databasen.
1: Hvis man skriver et CPR-nummer i eks. "A2" skal makroen gå ind i access-databasen og se om der er data på dette CPR-nummer, og indsætte data i A1:D1. Hvis ikke en slags fejlmeling (som jeg nok skal finde ud af).
2: Når man så har udfyldt (nye) data i A1:D1 skal man kunne sætte dette ind i databasen igen. I stedet for placere den nye dataserie nederst i databasen, skal makroen overskrive den linie med samme CPR, hvis en sådan findes. Hvis CPR ikke findes skal data placeres nederst som en ny dataserie.
Jeg håber at mit problem giver mening, ellers uddyber jeg meget gerne.
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
Jeg tror heller ikke det er helt så svært, men det er alligevel ikke lykkedes mig at finde en løsning.
-
Der vil kun kunne indtastes data i A1 - D1 (A1 hvis CPR ikke findes i DB i forvejen, ellers kun i B1 - D1, A1 behøver ikke være låst). Dvs. at der ikke er brug for meget fleksibilitet, men udelukkende referencer til felterne A1-D1 og A2.
Koden i Ark1: ============= Rem Database-def. Public db As database, tbl_stamdata Dim flag As Boolean
Dim xSti Public Sub findSti() xSti = ActiveWorkbook.Path If Right(xSti, 1) <> "\" Then xSti = xSti + "\" End If End Sub Rem Database - rutiner Rem ================== Public Sub åbnDatabase() findSti Set db = OpenDatabase(xSti + "database.mdb") End Sub Public Sub åbnStamdataTabel() åbnDatabase Set tbl_stamdata = db.OpenRecordset("Stamdata") End Sub Public Sub LukDb() On Error Resume Next
tbl_stamdata.Close db.Close End Sub Public Function findCprNr(cprNr) On Error GoTo fejl
åbnStamdataTabel
With tbl_stamdata .Index = "primarykey" .Seek "=", cprNr
If Not .NoMatch Then findCprNr = True Else findCprNr = False End If End With Exit Function
fejl: findCprNr = False End Function Rem ================ Rem Excel-funktioner Rem ================ Private Sub worksheet_Change(ByVal Target As Excel.Range) Dim aktuelleRække, aktuelleKolonne, aktuelleCprNr, aktuelleVærdi, feltnr
On Error Resume Next
Rem Kolonne A2 - CprNr som søgekriterie If Not Intersect(Target, Range("A2")) Is Nothing Then flag = True aktuelleCprNr = CStr(Target.Value)
If findCprNr(aktuelleCprNr) = True Then indsætDataFraDB Target.Row Else If Target.Value <> "" Then sv = MsgBox("CprNr.: " & CStr(Target.Value) & " kan ikke findes - oprettes?", vbYesNo) If sv = 6 Then opretCprNr (aktuelleCprNr) End If End If End If Else Rem Kolonne B - C - D If Not Intersect(Target, Range("B1:D1")) Is Nothing Then If flag = False Then aktuelleCprNr = CStr(Range("A2"))
opdaterStamdata feltnr, aktuelleVærdi End If End If End If
End Sub Private Sub opretCprNr(cprNr) With tbl_stamdata .AddNew .Fields(0) = cprNr .Update End With End Sub Private Sub opdaterStamdata(feltnr, værdi) With tbl_stamdata .Edit .Fields(feltnr) = værdi .Update End With End Sub Private Sub indsætDataFraDB(rækkeNr) With ActiveSheet For x = 1 To 3 .Cells(1, x + 1) = tbl_stamdata.Fields(x) Next x End With
flag = False End Sub Private Sub Worksheet_Deactivate() LukDb End Sub
Tusind tak for dit enorme arbejde. Jeg har ikke helt kunne få den til at virke, så jeg har lige et par yderligere spørgsmål.
- "DB-felter: felt 0: Cprnr / 1: Navn / 2: Adresse / 3: Postnr" Er det navnene på kolonnerne i DB du nævner? Hvis ja, er navnet "0: cprNr/..." eller "0/1/2..."?
- ".Index = "primarykey" " skal der sættes noget ind i stedet for "primarykey"?
- "Public Sub åbnStamdataTabel() åbnDatabase Set tbl_stamdata = db.OpenRecordset("Stamdata") End Sub" Skal der ændres noget i denne Sub? Den ser nemlig ikke ud til at virke.
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.