27. august 2004 - 10:35Der er
26 kommentarer og 1 løsning
Excel med Lopslag - kan man hente data fra en tabel i Access?
Hej,
Jeg har efterhånden med stor success lavet flere rapporter i excel, der benytter Lopslag som hoved formel.
Jeg er dog stødt på et problem, nemlig datamængden.
1 ting er at jeg har mangle sheets med mange Lopslag felter, noget andet et så når dataen skal hentes fra et andet ark.
Pt. bruger jeg VBA til at importere nogle data til et excel ark der agere som data kilde. (jeg tilpasser dataen så Lopslag funktionen kan bruges via VBA)
Her er excelfilen nu på ca. 60mb, hvilket må siges at være en pæn størrelse. Dette betyder at det tager utrolig lang tid at arbejde med filerne. Jeg spekulere derfor på om der var en mulighed for i Lopslag funktionen at hente data fra en MS Access database?
Alternativt om der er nogen som har haft et lign. problem men fået det løst via noget formel optimering af en slags.
Jeg skulle måske lige tilføje at jeg ikke er den helt store VBA haj, jeg forstår at læse koden, men bruger ofte makro indspilning og tilretter så bagefter koden til mine behov... Blot så i kender til mit VBA niveau.
Du kan ikke benytte LOPSLAG til at hente data fra Access.
Du kna i menuen Data > Hent eksterne data hente data fra Access. Din datakilde kan så begrænse importerede data ved hjælp af en forespørgsel i Access eller i selve MSquery.
Yupper, den metode benytter jeg i andre sammenhæng. Men den betyder så igen stadig at jeg har en stor datamængde i excel, som jeg mistænker for ikke at være speciel god til sådanne datatabeller.
hvordan bruger du opslagsfunktionen i vba.. s'føli er det muligt at slå op i access også fra vba. det vil nok være langsommere, men du vil kunne undså datamængden. 60 MB er en meget stor fil og min erfaring er at jo større fil jo større risico for at den går ned. Prøv at vise hvad du gør idag.. (kode)
Ah ja det kan misforstås, jeg bruger Lopslag i excel, men via VBA får jeg tilpasset dataen således at jeg i excel kan benytte Lopslag.
Idag benytter jeg VBA til at manipulere rundt med mine kilde data, således at jeg får et key id jeg kan slå op. Tillige benytter jeg VBA til at danne tabellerne således jeg altid har det nøjagtige data område at slå op i.
Noget som måske også er lidt killer for excel er at jeg benytter en Lopslag formel til at addere med en anden Lopslag formel, altså jeg finder et opslag, som så skal plusses med et andet.
Det er sådan lidt kringlet, og der findes nok ikke et 100% svar på det jeg leder efter, men jeg søger en effektiv og gerne acceptabel hurtig måde at hive data ud på.
Jeg har spekuleret lidt på om det måske var bedre at lave rapporten helt i Access, og så lave en "print" version også som kunne exporteres til excel for videre bearbejdning i såtilfælde at det ønskes.
Der må jo unægteligt komme et punkt hvor det bliver helt umuligt for Excel at behandle de data.
Jeg er enig i at så mange data bedst hånteres i access, og ville helt klart også smide mine rådata der og lave mine queries der. Alt rapport og præsentation ville jeg overlade til excel :-)
Jeg ved ikke om jeg er tosset, men når jeg har en Access database åben, med tabellen i, samtidig med Excel, så fungerer denne lille kode i excel.
Jeg har en tabel 'tb1' med felterne [Medlemsnr] [Adresse] [Postnr]
I excel har jeg reference til Microsoft Access 9,0 object library
Private Sub Worksheet_Change(ByVal Target As Range) If Not Intersect(Target, Range("A:A")) Is Nothing Then ' Medlemsnummer i kolonne A
'tbl1 ' Medlemsnr Adresse Postnr Dim varX As Variant varX = DLookup("[Adresse]", "tbl1", "[Medlemsnr] =" & Target.Value) Cells(Target.Row, 5) = varX End If End Sub
Du skal ind i VBA-editoren > Tools > References. Her browser du ned igennem dine biblioteker finder Access og sætter et checkmærke i boksen i venstre side.
Det som jeg gør er at sætte en pæn layout op i excel. Dette layout er så også bestemmende for hvilke data som hentes fra min data excel fil. F.eks. hvis jeg har en virksomhed A B C på række, og hver virksomhed har produkt 1 2 3 4 ned af, så vil Lopslag finde pris på produkt 1 for virksomhed A osv. Det er sådan basalt set hvad jeg forsøger og gør. Problemet opstår så når jeg har 10 virksomheder og 200 produkter, på 12 sheets. Og så yderligere når nogle produkter kræver to opslag for at finde prisen. Det gør to ting: 1. kilde filen skal være åben ellers dør excel når man opdatere 2. datafilen er forbandet stor pga. data kommer fra en anden rapport som jeg ikke umiddelbart kan beskære til kun at indeholde de datalinier jeg har behov for.
Sidste gang jeg skulle rette stien til datafilen erstattede jeg 25800 felter ca. så der er en del at opdatere hver gang man åbner filen.
Datafilen er jeg så begyndt at have problemer med, jeg skal åbne og lukke filerne i en bestemt rækkefølge, ellers dør excel. Går ud fra at det er noget med at den opdatere data inden filen gemmes og lukkes.
Hvis det hele er noget ævl, skal jeg forsøge at forklare det igen imorgen hvor jeg måske er lidt mere frisk.
"2. hvordan får man den vba kode til at virke? den danner jo ikke nogen makro?"
Jeg har ikke meget forstand på Excel, men vil dog gerne klomme med flg.:
Når du indspiller en makro, foretager du en række handlinger med musen. Disse handlinger "oversættes" til VBA. Og det er denne VBA-kode der afspilles når du kører en makro.
Er lavet ved blot at flytte markøren til celle F7, skrive hej og gå til celle F8. Når du vælger at redigere makroen, kommer du ind i VBA-editoren og kan omskrive din makro.
Den stump kode jeg skrev skal ligge i arkets modul.
Det finder du ved at højreklikke på arkfanen og vælg vis programkode
Det er selfølgelig det ark hvor du taster i og vil have resultatet.
Koden udføres hver gang der sker ændringer i en celle i kolonne A
DLookup("[Feltet der skal retuneres]", "Tabellens navn", "[Feltets navn som skal passe med kriterie] =" & Target.Value)
Target.Value er værdien eller teksten i cellen som skrives i.
Private Sub Worksheet_Change(ByVal Target As Range) If Not Intersect(Target, Range("A:A")) Is Nothing Then' Medlemsnummer i kolonne A
'tbl1 ' Medlemsnr Adresse Postnr Dim varX As Variant varX = DLookup("[Adresse]", "tbl1", "[Medlemsnr] =" & Target.Value) Cells(Target.Row, 5) = varX ' skriver resultatet i samme række i kolonne 5 End If End Sub
Private Sub Worksheet_Change(ByVal Target As Range) Dim varX As Variant If Not Intersect(Target, Range("A:A")) Is Nothing Then varX = DLookup("[Adresse]", "tbl1", "[Medlemsnr] =" & Target.Value) Cells(Target.Row, 5) = varX ' skriver resultatet i samme række i kolonne 5 varX = DLookup("[Postnr]", "tbl1", "[Medlemsnr] =" & Target.Value) Cells(Target.Row, 6) = varX ' skriver resultatet i samme række i kolonne 6 End If
If Not Intersect(Target, Range("B:B")) Is Nothing Then' varenummer i Kolonne B varX = DLookup("[Varetekst]", "tbl2", "[Varenr] =" & Target.Value) Cells(Target.Row, 3) = varX ' skriver resultatet i samme række i kolonne 3 End If End Sub
Her er den som Function Den skal ligge i et modul og ikke i et arkmodul
Public Function HentFraDatabase(SøgeFeltNavn As String, Kriterie As Range, TabelNavn As String, ReturFeltNavn As String) As Variant Dim varX As Variant varX = DLookup(ReturFeltNavn, TabelNavn, SøgeFeltNavn & " =" & Kriterie.Value) HentFraDatabase = varX End Function
Kaldes med
=HentFraDatabase("Medlemsnr";A1;"tbl1";"adresse")
=HentFraDatabase("Feltet der søges i";Hvad skal findes;"Tabellens navn"; "feltet som skal retuneres")
Jeg kan desværre først rigtigt teste det på mandag, når jeg kommer på arbejde igen. Men jeg skal nok sige om det er noget der kan bruges på en 25000+ felter :o)
hvorfor ikke lægge dine 25000+ records over i access også, køre en query der på begge tabeller og trække resultat over i excel ? Det må absolut være det hurtigste
Jeg tror at Kabbak's link er det rigtige for mig også.
Det må jo så også være det samme som du foreslår Bak?
Mit problem hidtil var at den eneste måde jeg kunne finde ud af at få data over fra Access til Excel var via en query der dannede en tabel i excel. Det kunne måske minimere mine data lidt, men det ville så kræve 1 opdatering mere og ca. ende med samme opdateringstid som før.
Men derimod at kunne køre en query fra Excel som henter kun de felters data over som behøves, tja forhåbentlig giver det hurtigere opslag da tabellen nu er i en "rigtig" database, og der skal stadig kun opdateres en gang.
Jeg vil forsøge at teste det mandag, og give et feedback på om det var det for mig.
Men i hvert fald er det et svar på det jeg spurgte efter, nemlig et alternativ til Lopslag! Så hvis i vil have nogle points så smid et svar :o)
Nu har jeg ikke fulgt med i den seneste forslag, men er du interesseret kan jeg sende dig en testdb i Access der viser, hvordan du kan eksportere data fra Access til Excel. Blot læg din e-mail.
Jeg tror du fokuserer for meget på at have excel åbent og foretage dine "operationer" her. Tænk lidt anderledes og prøv at lav en db i Access og eksporter til Excel.
Jeg ved godt hvordan jeg eksportere data fra access til excel, enten via en query i excel eller en linket tabel f.eks.
Jeg har tidligere programmeret i Access og lavet diverse rapporter mv. der, og tror til syvende to sidst også at det bliver der jeg ender ud på et tidspunkt, og så simpelt hen blot laver en eksport makro til excel hvis folk ønsker at videre behandle de data rapporten giver. Det er sidst nævnte som er grund til at jeg har layout i Excel idag, nå ja og så måske lidt fordi min access viden er lidt rusten efter hånden ;o)
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.