Avatar billede Voyager57 Nybegynder
22. marts 2011 - 15:19 Der er 28 kommentarer og
1 løsning

Hvordan henter jeg data fra Access database via en forespørgsel (i excel) over i Excel.

Har problemer med ovennævnte, er lidt af en newbie, men ikke 100%

Har på nettet fundet lidt kode, som jeg så udfra, har strikket denne kode sammen.:

Public Sub Hent_Kunde()

    ' Deklarerer variabler

    Dim vInput As Long
    Dim Sheetname As String
    Dim found As String
   
    ' Bruger det aktuelle Ark til dataene

    Sheetname = ActiveSheet.Name

    ' Åbner database

    Set cn = New ADODB.Connection
    cn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=C:\faktura\fakturaer.mdb;"
    Set rs = CreateObject("ADODB.Recordset")

    'Spørger om Kundenavn - Kunne være kundenummer eller andet

    found = InputBox("Indtast kunde", "Search")

    ' Søger i database, efter indtastede navn

    strsql = "SELECT eq(Kunder.Fakturaer) AS found FROM Kunder;" ' Ser det rigtigt ud ?

    If found = "" Then ' Her skal indsættes en fejlkode
    Exit Sub
    End If

    'Bruger records fra Fakturaer.mdb tabel "Kunder" til at indsætte på Excelark _
    'Her er mine problemer...

    With rs
        .Cell("B6") = .Fields("Firm1")            'Hvordan gøres dette ?
        '.Fields("Firm1") = Cells("B6").Update        'Hvordan gøres dette ?   
        '.Fields("Firm2") = Cells("B7").Insert        'Hvordan gøres dette ?
        '.Fields("Adr1") = Cells("B8").Insert        'Hvordan gøres dette ?
        '.Fields("Adr2") = Cells("B9").Insert        'Hvordan gøres dette ?
        '.Fields("PostNr") = Cells("B10").Insert    'Hvordan gøres dette ?
        '.Fields("By") = Cells("C10").Insert        'Hvordan gøres dette ?
        '.Fields("E-Mail") = Cells("B11").Insert    'Hvordan gøres dette ?

    End With

    ' Lukker databasen igen.

    Set rs = Nothing
    cn.Close
    Set cn = Nothing
    Set CurrentChart = Sheets(Sheetname)
    Sheets(Sheetname).Select

End Sub


Håber nogen har en ide til hvordan man gør, gerne med en form, der "lader en rulle igennem de kendte adresse/kunder.
Avatar billede sifuentes Nybegynder
22. marts 2011 - 22:23 #1
Har jeg ret i at du ønsker at Data fra et Excel ark skal kunne overføres og opdateres i en Access database?
Avatar billede Voyager57 Nybegynder
22. marts 2011 - 23:46 #2
Hej Sifuentes.
Nej ikke lige den vej, mere modsat, sådan at forstå, at hvis data er i access database, skal de overføres til bestemte celler i regnearket. Gerne med en slags "rullemenu". Har søgt som en gal på nettet og der er meget forskellige løsninger, men ingen passer rigtigt til min idé.
Voy
Avatar billede sifuentes Nybegynder
23. marts 2011 - 00:06 #3
Excel kan trække næsten hvad det skal være ud af en database, menuerne hedder: Importer Data, Webforespørgesel eller Dataforespørgsel. Men igen, er det virkelig det der er brug for? Er det ikke snarere en ren databaseløsning der er svaret? (det er en klassisk begynderfejl, tro mig)
Avatar billede Voyager57 Nybegynder
23. marts 2011 - 00:14 #4
Men har allerede en database, som jeg vil lave forespørgsler på.
Når brugeren opdaterer og afsender en faktura, så skrives der til databasen, med indholdet i bestemte celler i regnearket.
Altså data er tilstede, og skulle jo gerne kunne "genbruges" af Excel, når man skal køre en ny faktura. Har prøvet import af data, men det giver mig jo hele databasen og ikke en enkelt post.

Har ikke lige prøvet "databaseforespørgsel", vil kigge på den og evt. prøve at optage makroen... - Ellers gode idéer..
Avatar billede Voyager57 Nybegynder
23. marts 2011 - 00:24 #5
Nej kan kun importere hele databasen, og ikke specifikke records efter en forespørgsen. - Skal sige jeg kører office 2007. Kan det være årsagen?

Glad for hjælpen :-)
Avatar billede sifuentes Nybegynder
23. marts 2011 - 22:00 #6
Hvad skal udtrækket af data bruges til i regnearket, (hvad er formålet med at hive data ud i excel, i forhold til at videreforarbjde dataene i en database, og evt. samskrive/sammenflette/filtrere/sammenholde dataene i databasen)? Er du i det hele taget vidende om mulighederne for databehandling i en database? Det har du i hvertfald ikke overbevist mig om.
Avatar billede Voyager57 Nybegynder
23. marts 2011 - 22:11 #7
Hej Sifuentes.

Nej, database er heller ikke min stærke side, er newbie, men mente at jeg med fordel kunne, åbne en inputbox, og spørge brugeren om navnet, og hvis dette navn findes i databasen, så kopiere stamdata over i regnearket, hvis ikke, ville jeg lade brugeren indtaste nye stamdata, på den nye kunde, og Excel ville så lægge dette over i databasen, den del fungerer fint. Det er selve forespørgslen, og kopiering af aktuel record til Excel.

Håber du forstår hvad jeg ønsker at gøre. Om metoden er forkert eller ej, ved jeg ikke, det er jo blot en idé.
Avatar billede sifuentes Nybegynder
23. marts 2011 - 22:26 #8
Vi skal til Mallorca, og det skal være sådan at vi kan se ud af vinduet undervejs, og vi skal også kunne komme på toiletet når nøden er størst. Derfor kører vi i bil hele vejen og tager færgen fra Barcelona til Palma De Mallorca. Lyder det ikke som nogle gode argumenter for valg af transportmiddel?
Avatar billede Voyager57 Nybegynder
23. marts 2011 - 22:44 #9
Øh, jo, men forstår ikke valget af transportmiddel, jeg ville f.eks hellere flyve og se ned på bjergene ;-)

Forstår ikke helt din metafor :-)
Avatar billede sifuentes Nybegynder
23. marts 2011 - 22:51 #10
Du fortæller også at du har data liggende i hhv. Excel og Access, det skurrer med det samme i mine ører. Hvilke overvejelser ligger der bag disse valg.

Du fortæller ikke hvordan dine brugere (netværks)geografisk befinder sig når data indtastes.

Du fortæller helle ikke om det er et kritisk parameter at to brugere indtaster data på samme tid.

Der er i det hele taget en masse indforstået information tilstede her, men som er komplet uigennemskuelig for mig.
Avatar billede Voyager57 Nybegynder
23. marts 2011 - 23:05 #11
Hej Sifuentes
Jo, årsagen er under designet af et let fakturaprogram i Excel, ville jeg benytte nogle af de ting der kom som input i regnearket, såsom Fakturabeløb, fakturadato, sidste betalingsdato, kundenavne og adresser og putte dem i en database og nogle tabeller, alt det er lykkedes, senere fik jeg så den ide at det jo var tosset at taste kundenavnene ind i databasen igen, når de måske allerede var der, så kunne man "genbruge" dem i regnearket. - og det er jo egentligt det spørgsmålet går ud på, hvordan det gøres. :-)

Det er kun et mindre system som afvikles på een maskine, lokalt hos ham selv (lille håndværker). Altså ikke noget med samtidige brugere, og ikke noget med netværk i denne forbindelse.

Er kun en "øvelse" som umiddelbart fungerer, men kunne gøres smartere..

Kan sagtens være der er meget smartere måder at gøre det på, men learning by doing and testing, har virket indtil nu :-)
Avatar billede sifuentes Nybegynder
23. marts 2011 - 23:24 #12
Men hvis det har virket indtil nu så er der vel ikke nogen grund til at ændre ved det?
Avatar billede sifuentes Nybegynder
23. marts 2011 - 23:35 #13
Men du beskriver det selv skide godt, "nogle af de ting der kom som input i regnearket," og "jo var tosset at taste kundenavnene ind i databasen igen, når de måske allerede var der".

Regel nummer et når du arbejder med en datamat: "Er arbejdet gjort en gang skal samme arbejde aldrig udføres igen" (gør du det er du i gang med at lave noget lort), heraf afledes reglen om at data aldrig må forekomme redundant (ingen dubletter), altså enten findes data i databasen(hvorfra de udtrækkes) eller også findes de i Regnearket hvorfra de så kan udtrækes. De må aldrig forefindes begge steder.
Avatar billede sifuentes Nybegynder
23. marts 2011 - 23:40 #14
Og så kan du så sige: "Uha Uha, de regler er jeg vidst kommet til at overtræde mange gange". Ja, og det må aldrig ske igen, ikke før det er korrekset, kan du være forvisset om at dit system virker optimalt. Det ville svare til at grave telefonkablet op for at se om det var ok.
Avatar billede Voyager57 Nybegynder
23. marts 2011 - 23:58 #15
Hej igen

*G* Du har delvist ret, data er ikke tilstede begge steder, undtagent når man gemmer faktura, så er kunden "synlig" på fakturaen på skærmen, indtil den ryddes, i databasen er ingen dubletter tilladt, hvis jeg undgår med en:

.Update
On Error Resume Next

Men dette gælder kun for navnene og fakturanumre.

Kabbak (en ruger herinde), var sød at hjælpe mig der.

Håber du er med på problemet, og ved da godt at det er lidt "hjælpeløst" :-)
Avatar billede Voyager57 Nybegynder
23. marts 2011 - 23:59 #16
Hmm, "ruger" = bruger *G*
Avatar billede stefmeister Nybegynder
26. marts 2011 - 10:07 #17
Voyager57;

Har jeg forstået dit "problem" rigtigt? Du har et dataset i en access database med kundeoplysninger på diverse kunder, datoer osv. osv.; alle disse data ønsker du at kunne se i excel, enten til at bearbejde eller til at læse?
Derudover har du lavet et excel-ark, men mangler nu at få de rigtige data ind i de rigtige felter når man henter den givne kunde i en database?

Har du fundet ud af at hente dataerne ind i excel, eller hvor præcist rammer du muren?


Undskylder på forhånd, men det lyder ikke som om at Sifuentes kommer med noget brugbart, andet en at forklare hvorfor metoden skulle være dårlig; fremfor blot at hjælpe med det trådstarter i virkeligheden spørger om.
Avatar billede Voyager57 Nybegynder
26. marts 2011 - 10:22 #18
Hej Stefmeister.

Ja, du har forstået mig rigtigt :-)

Har endnu ikke en brugbar løsning.

Støder ind i muren, der hvor data skal sammenlignes med brugerinput, kunne være et firmanavn, hvis data er i databasen, skal data med firmaoplysningerne Adresser, navne o.s.v. læses over i Excel på de rigtige felter.

Har prøvet forskellige tillempede løsninger, men har endnu ikke en fungerende løsning.
Avatar billede stefmeister Nybegynder
26. marts 2011 - 11:58 #19
Okay, men du kan godt finde ud af at få data fra access og ind i excel; problemet er der hvor du skal sammenligne existerende data med brugerinput?

En simpel løsning vil være at lave et ark hvori du henter alle kundenavne ind; derefter kan du på dit brugerark (eller hvad du kalder det), lave en dropdown hvorfra brugeren kan vælge kunden; og hvis den ikke eksisterer, så indtaste en ny i stedet (og gemme i access-databasen også).

Så istedet for at lave en søgefunktion, så kan brugeren vælge på en dropdown (hvor den laver auto-udfyld, så kundenavnet kommer frem når man begynder at taste (givet den findes)).
Avatar billede Voyager57 Nybegynder
26. marts 2011 - 12:06 #20
Hej igen Stefmeister.

Ja kan godt læse indholdet indi Excel, og skrive data fra Excel til Database.
Så den løsning havde jeg nu også leget lidt med, men syntes dog den var lidt "lappet" ;-) selvfølgelig er det en funktionel løsning, så tror jeg vil bakse lidt videre med den idé :-)

Takker foreløbigt for hjælpen.

Men kan du så evt. sige mig hvordan jeg læser data ind i excel fra databasen og ind i et regneark, på forskellige celler, i stedet for at læse dem ind i samme række ? Altså at opdele data fra databasen....

God weekend !
Avatar billede sifuentes Nybegynder
26. marts 2011 - 15:39 #21
Hvis vi nu forudsætter at du har et regneark for sig, hvori befinder sig samtlige kundedata fra databasen(dette kan nemt gøres ved hjælp af en Databaseforespørgsel, der ligger hjælp at hente om dette emne i Excel Hjælpen), dataforespørgslen skal selvfølgelig udføres før opslag laves, ellers er data ikke friske.

Det vil så ved hjælp af funktionen Lopslag være muligt at lave et opslag i dette ark, funktionens virkemåde er også beskrevet i Hjælp. Udfra Lopslags returnerede værdi kan postens absolutte placering i arket udledes og på den baggrund kan relevante data uddrages. Evt. skal først testes om den overhovedet har fundet noget, for har den ikke det eksistere kunden ikke, eller brugeren har lavet en tastefejl.
Avatar billede Voyager57 Nybegynder
26. marts 2011 - 15:58 #22
Hej igen Sifuentes.

Takker for informationen, knokler stadig, og er ved at kigge på Stefmeisters forslag også.

Prøver lidt forskellige løsninger. - God weekend til dig også
Avatar billede stefmeister Nybegynder
27. marts 2011 - 13:32 #23
Voyager57

Hvis du skal have dataerne ind i forskellige celler, altså en række for hver række du søger du fra databasen må du lave en løkke.
Først ville jeg definere en startplacering, f.eks.

Dim Location as Range
Dim coln, rown as Long

Set Location = Range("A1")
coln = Location.Column
rown = Location.Row

Derefter ville jeg så lave en løkke hvori du placerer dataerne i cellen (coln, rown).

Du kan lave en løkke der hedder noget lign.:

Do until rs.EOF

Cells(coln, rown).value = rs.Fields("navn på felt 1")
Cells(coln + 1, rown).value = rs.Fields("navn på felt 2")

rown = rown + 1
Loop


Eller sådan noget lign., så får du alle dine data ud på et seperat art startende i celle A1.
Du kan på google finde en mere detaljeret beskrivelse af ovenstående; men du skal have fat i en løkke der kører fra første rs til den sidste rs (rs.EOF).


Mht. Lopslag så forudsætter det at du har unikke værdier; hvis der er flere kunder der f.eks. hedder "Nielsen" eller hvad de nu er kategoriseret som, så vil du skulle udvide din søgning, da Lopslag altid returnerer den først fundne værdi.
Avatar billede Voyager57 Nybegynder
27. marts 2011 - 13:53 #24
Hej Stefmeister.

Takker for input. Jam skal have data ind i forskellige celler i et forud fremstillet ark, hvor detaljerne skal bruges til at lave et adressehovede til fakturaer.

Derfor er det lidt tricky, da jeg ved at bruge Excel´s funktion til at hente data fra Access, database, ligger de enkelte firmaoplysninger i samme række.

Altså er outputtet:

Firm1, Firm2, Addr1, Addr2, PostNr, By, E-Mail

og ikke:

Firm1
Firm2
Addr1
Addr2
PostNr, By
E-Mail

Derfor havde jeg brug for at splitte det lidt op, men den er jeg sikker på du har fattet ;-)

Vil dog lege med de forslag der kommer op, der er mange gode ideer.
Avatar billede stefmeister Nybegynder
27. marts 2011 - 14:23 #25
Ah okay, men det er bestemt heller ikke noget problem.

Skal du have alle dine rækker ud ved siden af hinanden så, så der står:

Firm1              Firm1
Firm2              Firm2
Addr1              Addr1
Addr2              Addr2
PostNr, By      PostNr, By
Email                Email

Hvis ja, så er det bare i løkken at rælle en række ned hver gang man har sat et felt ind, så det bliver modsat før, og så til sidst lægger en til kolonnen.

Do until rs.EOF

Cells(coln, rown).value = rs.Fields("navn på felt 1")
Cells(coln, rown + 1).value = rs.Fields("navn på felt 2")
osv. osv.

coln = coln +1

Loop
Avatar billede Voyager57 Nybegynder
27. marts 2011 - 15:56 #26
Ahhh, takker for ideen.

Nu begynder jeg at fatte ideen.

Hvis du skriver et svar, tildeler jeg dig point.

Takker for hjælpen.
Voy
Avatar billede stefmeister Nybegynder
27. marts 2011 - 17:21 #27
Det lyder super. Håber du får det til at virke :-)
Avatar billede sifuentes Nybegynder
27. marts 2011 - 18:41 #28
Forhåbentlig ligger bynavnet i en separat tabel med postnummer som primærnøgle?
Avatar billede Voyager57 Nybegynder
27. marts 2011 - 20:02 #29
Hej Sifuentes.

Ja, postnumre og bynavne ligger i egen tabel.

Voy
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
Kurser inden for grundlæggende programmering

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