Avatar billede kewc Nybegynder
05. april 2009 - 22:14 Der 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.

God påske til alle når man begynder at få det.
Avatar billede supertekst Ekspert
05. april 2009 - 23:14 #1
Skulle ikke være et problem via VBA.

Arbejder med Office 2003.

-

Er der flydende indtastning - d.v.s at der kan indtastes cprnr i kolonne A og data vedr. dette placeres i B - D i samme række - eller?
Avatar billede kewc Nybegynder
06. april 2009 - 15:11 #2
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.
Avatar billede supertekst Ekspert
06. april 2009 - 15:20 #3
Har skrevet det meste af kode - får den færdig snarest...
Avatar billede supertekst Ekspert
06. april 2009 - 16:51 #4
Et spørgsmål

Er formålet ajf. af poster i databasen, hvor Excel så "kun" anvendes som pladsholder?

Hvis det er tilfældet - så kunne en Userform måske være lidt mere hensigtsmæssig.
Avatar billede supertekst Ekspert
06. april 2009 - 18:24 #5
Indtast cprnr i A2 - data vises i B1 - D1

DB-felter: felt 0: Cprnr / 1: Navn / 2: Adresse / 3: Postnr

Reference indsættes i VBA/Excel Microsoft DAO 3.6

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"))
           
                aktuelleKolonne = Target.Column
                aktuelleRække = Target.Row
                aktuelleVærdi = Cells(aktuelleRække, aktuelleKolonne)
                feltnr = aktuelleKolonne - 1
             
                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
Avatar billede kewc Nybegynder
07. april 2009 - 22:48 #6
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.
Avatar billede supertekst Ekspert
07. april 2009 - 22:59 #7
Felter i databasen kan enten tilgås ved deres feltnavn eller løbenrnummer (fra felt 0 - 240).

I min kode er CprNr=primaryKey

Stamdata er tabellens navn

----
ellers..
Send en mail (min adr. under profil) så sender jeg såvel DB som regneark.
Avatar billede supertekst Ekspert
08. april 2009 - 09:25 #8
Afslutning af denne runde?
Avatar billede kewc Nybegynder
08. april 2009 - 09:40 #9
Tak til supertekst fin hjælpen
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
Excel kurser for alle niveauer og behov – find det kursus, der passer til dig

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