Avatar billede golfier Nybegynder
27. marts 2004 - 06:02 Der er 10 kommentarer og
1 løsning

LOpslag i Access

Hejsa..

Jeg har over 100.000 varenumre som jeg har brug for at lave opslag i. Excel kan ikke håndtere så mange, uden at jeg skal lave en masse krumspring. Kan man ikke have selve varekartoteket i access og så lave en form for LOpslag fra Excel? - Jeg har prøvet at lave en databaseforespørgelse, men den returnere alt i databasen, og ikke kun det enkelte varenummer..

Er der nogen med en løsning derude, ville det være skønt...

mvh. Golfier
Avatar billede mugs Novice
27. marts 2004 - 08:02 #1
Mig bekendt er det muligt at importere med kriterier fra Access, men jeg ved ikke hvordan. Men grundlæggende må man spørge sig selv, om det er det rigtige program du bruger.

Vi ved jo, at Excel kan håndtere ca 65000 rækker, og du har 100000 (og kommer der flere til?). Så alene her knækker filmen, som du jo også selv skriver "uden at jeg skal lave en masse krumspring".

Jeg er ikke nogen "Excel-guru", så du tage mit manglende kendskab til programmet med i dine overvejelser. Men jeg ved, at antal poster (rækker) i Access ikke er en begrænsende faktor for en veldefineret database, men alene databasens størrelse. En Access db kan fylde 2 Gb, og det giver en hel..... masse poster.

Hvilke beregninger skal du foretage af dine poster, som ikke kan udføres i Access? Husk på, at selvom Access er et databaseprogram, kan det også regne, på samme måde som regnearket Excel også kan anvendes som database.

Så mit umiddelbare forslag vil være, at skifte til Access som hovedprogram. Hvis du så skal foretage nogle beregninger som Access ikke kan, så kan du eksportere udvalgte data til Excel og beregne der, for derefter at vende tilbage til Access..
Avatar billede golfier Nybegynder
27. marts 2004 - 16:37 #2
Hej...  Jeg overvejede at skrive at det skal laves i excel, og det skal det, da det er nogle simuleringer jeg laver, som access ikke kan sættes op til på en nem måde. Vi har haft nogen til at kikke på det, og de har opgivet det, eller rettere der skal rigtig mange penge på bordet for at få lavet det i access, og jeg har det kørende i excel, men da der kun var 15.000 varenumre til at starte med, så var det ikke et problem, men det er det så blevet nu....

Og ja.. det kan nemt ende op med 200.000 varenumre, det var derfor jeg gerne ville have datatrækket fra access, da det nemt kan indeholde dette antal...

-Golfier
Avatar billede jkrons Professor
27. marts 2004 - 18:19 #3
Nemt og nemt :-)  200.000 varenumre må højst fylde 100 bytes hver i snit - så rammer du Access' grænse på 2GB.

Men så længe det holder pladsmæssigt, kan du så ikke have dine data i Access, lave udtræk på dem, du skal bruge og ekspterere resulatet til Excel, hvor du så kan lave dien simuleringer.
Avatar billede kabbak Professor
27. marts 2004 - 20:00 #4
Et eksempel på at slå op i en database fra Excel

Private Sub Worksheet_Change(ByVal Target As Range)
Dim DB As String
If Not Intersect(Target, Range("A2:A25")) Is Nothing Then
' i ovenstående Range udfører den opslaget, når der ændres eller skrives i en af cellerne

DB = "C:\db7" ' Sti og navn på database uden .mdb

' I dette eksempel slår den op I Tabellen Medlemmer, hvor kriterie er på medlemsnummer, _
  som tastes ind i rangen, det fundne skrives i cellerne til højre for den aktive celle i _
  kolonne A
 
  With ActiveSheet.QueryTables.Add(Connection:= _
        "ODBC;DSN=MS Access-database;DBQ=" & DB & ".mdb;DefaultDir=C:;DriverId=25;FIL=MS Access;MaxBufferSize=2048;PageTimeout=5;" _
        , Destination:=Range(Target.Offset(0, 1).Address))
        .CommandText = Array( _
        "SELECT Medlemmer.Navn, Medlemmer.Adresse, Medlemmer.Postnr, Medlemmer.`By`, Medlemmer.Telefon, Medlemmer.Medlemsnummer" & Chr(13) & "" & Chr(10) & "FROM `C:\db7`.Medlemmer Medlemmer" & Chr(13) & "" & Chr(10) & "WHERE (Medlemmer.Medlemsnummer=" & Target & ")" _
        )
      ' .Name = "Forespørgsel fra MS Access-database"
        .FieldNames = False
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = False
        .RefreshOnFileOpen = False
        .BackgroundQuery = True
        .RefreshStyle = xlDeleteCells
        .SavePassword = True
        .SaveData = True
        .AdjustColumnWidth = False
        .RefreshPeriod = 0
        .PreserveColumnInfo = True
        .Refresh BackgroundQuery:=True
    End With
    End If
End Sub
Avatar billede kabbak Professor
27. marts 2004 - 20:03 #5
lige en rettelse i denne linie

        "SELECT Medlemmer.Navn, Medlemmer.Adresse, Medlemmer.Postnr, Medlemmer.`By`, Medlemmer.Telefon, Medlemmer.Medlemsnummer" & Chr(13) & "" & Chr(10) & "FROM `" & DB & "`.Medlemmer Medlemmer" & Chr(13) & "" & Chr(10) & "WHERE (Medlemmer.Medlemsnummer=" & Target & ")" _
Avatar billede kabbak Professor
27. marts 2004 - 22:37 #6
En ændring mere, tilføjet en sub mere.

Private Sub Worksheet_Change(ByVal Target As Range)
Dim DB As String
If Not Intersect(Target, Range("A2:A25")) Is Nothing Then
' i ovenstående Range udfører den opslaget, når der ændres eller skrives i en af cellerne

DB = "C:\db7" ' Sti og navn på database uden .mdb

' I dette eksempel slår den op I Tabellen Medlemmer, hvor kriterie er på medlemsnummer, _
  som tastes ind i rangen, det fundne skrives i cellerne til højre for den aktive celle i _
  kolonne A
 
  With ActiveSheet.QueryTables.Add(Connection:= _
        "ODBC;DSN=MS Access-database;DBQ=" & DB & ".mdb;;DriverId=25;FIL=MS Access;MaxBufferSize=2048;PageTimeout=5;" _
        , Destination:=Range(Target.Offset(0, 1).Address))
        .CommandText = Array( _
        "SELECT Medlemmer.Navn, Medlemmer.Adresse, Medlemmer.Postnr, Medlemmer.`By`, Medlemmer.Telefon, Medlemmer.Medlemsnummer" & Chr(13) & "" & Chr(10) & "FROM `" & DB & "`.Medlemmer Medlemmer" & Chr(13) & "" & Chr(10) & "WHERE (Medlemmer.Medlemsnummer=" & Target & ")" _
        )
        .FieldNames = False
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = False
        .RefreshOnFileOpen = False
        .BackgroundQuery = False 'True
        .RefreshStyle = xlDeleteCells
        .SavePassword = False 'True
        .SaveData = False ' true
        .AdjustColumnWidth = False
        .RefreshPeriod = 0
        .PreserveColumnInfo = False 'True
        .Refresh BackgroundQuery:=False 'True
    End With
    End If
  ' Call SletNavne
End Sub


Public Sub SletNavne()
' Da den ved hver opslag i databesen , navngiver området daterne skrives i _
  eks. "EksterneData_6", vil de hobe sig op hvis de ikke slettes, det gøres så her.

For Each n In ActiveSheet.Names
      If IsNumeric(Right(n.Name, 1)) Then
        ActiveSheet.Names(n.Name).Delete
      End If
    Next
End Sub
Avatar billede satanic_raven Nybegynder
27. marts 2004 - 22:47 #7
Hvorfor ikke bare inddele varenumrene på flere ark i excel???

Ark 1: Navn = 00001-50000 || Indhold = De første 50000 varenumre
Ark 2: Navn = 50001-100000 || Indhold = De næste 50000 varenumre
Ark 3: Navn = 100001-150000 || Indhold = De næste 50000 varenumre
Ark 4: Navn = 150001-200000 || Indhold = De sidste 50000 varenumre

På den måde overskrider du ikke grænsen på 65000 rækker pr. ark... Og da du alligevel vil lave opslag i dem, kan du jo blot lave en formel der henviser til de andre ark, afhængigt af hvilke(t) varenummer du vil slå op...

S.R.
Avatar billede Slettet bruger
29. marts 2004 - 20:41 #8
jkrons >> 2 GigaByte (GB) er 2,147,483,648 byte (2 * 2^30 byte)
Dvs. 200,000 varenumre kan hver fylde ca. 10 KB.

Eller hvis de fylder 100 Byte i snit:
er der plads til 21,474,836 af dem

...bare for en god ordens skyld  :-)
Avatar billede jkrons Professor
29. marts 2004 - 21:29 #9
blackadder-> Ak ja - regne kan man heller ikke mere :-(
Avatar billede golfier Nybegynder
30. marts 2004 - 22:08 #10
Hejsa... Og undskyld mit sene svar her, men jeg har været væk i nogle dage, og har ikke haft tid til at kikke på det før nu. Men tak for hjælpen fra jer alle.

Svaret som satanic_raven gav, kan jeg ikke bruge, da det er sådan jeg bruger det idag, og det er alt for langsomt. Og spørgsmålet gik egentlig på at lave en form for Lopslag i en access database.  :-)

Kabbaks kommentar kan jeg skal bruge, og jeg får det lige tilpasset helt her i den kommende weekend, så hvis du afgiver et svar skal du få dine point.

Hilsen Golfier
Avatar billede kabbak Professor
31. marts 2004 - 00:05 #11
Så får du et svar. ;-))
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
Vi har et stort udvalg af Excel kurser. Find lige det kursus der passer dig lige her.

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