Avatar billede thomashansen Nybegynder
17. februar 2007 - 08:24 Der er 27 kommentarer og
1 løsning

Databasesøgning via regneark

Fra regneark ønskes det, at søge i database ved hjælp af SQL-udtryk.

Er det muligt, f.eks i regnearkets celle A1 at angive, at jeg vil søge på navnet "George" og så få returneret forekomster fra databasen (via SQL-udtrykket) i f.eks i kolonne B ?

Jeg har oprettet forbindelse mellem database og MS Query og SQL-udtrykket fungerer også.
Avatar billede thomashansen Nybegynder
17. februar 2007 - 08:42 #1
Mit meget simple SQL-udtryk:

SELECT `00Apparat`.ApparatBetegnelse
FROM `C:\Temp\TempSpecialeLogbog`.`00Apparat` `00Apparat`
WHERE (`00Apparat`.ApparatBetegnelse='George')
Avatar billede thomashansen Nybegynder
18. februar 2007 - 15:05 #2
Er der slet ingen, der vil "byde" på den ?
Avatar billede kedde65 Praktikant
19. februar 2007 - 15:53 #3
Ja det kan sagtens lade sig gøre, hvis du optager selve din datahentning som en makro. Herefter kan du gå ind og editere din SQL så din WHERE betingelse bliver opdateret med værdien fra A1.

Du er velkommen til at sende arket på ck@officekonsulenterne.dk så skal jeg hjælpe dig med det!

/Christian
Avatar billede thomashansen Nybegynder
19. februar 2007 - 21:08 #4
Hej

Her mit lille eksempel:

Sub George()
'
' George Makro
' Makro indspillet 17-02-2007
'

'
    With ActiveSheet.QueryTables.Add(Connection:=Array(Array( _
        "ODBC;DBQ=C:\Temp\TempSpecialeLogbog.mdb;DefaultDir=C:\Temp;Driver={Driver do Microsoft Access (*.mdb)};DriverId=25;FIL=MS Access;Max" _
        ), Array( _
        "BufferSize=2048;MaxScanRows=8;PageTimeout=5;SafeTransactions=0;Threads=3;UserCommitSync=Yes;" _
        )), Destination:=Range("B1"))
        .CommandText = Array( _
        "SELECT `00Apparat`.ApparatBetegnelse" & Chr(13) & "" & Chr(10) & "FROM `C:\Temp\TempSpecialeLogbog`.`00Apparat` `00Apparat`" & Chr(13) & "" & Chr(10) & "WHERE (`00Apparat`.ApparatBetegnelse='George')" _
        )
        .Name = "Forespørgsel fra TempSpecialeLogbog"
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .BackgroundQuery = True
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .PreserveColumnInfo = True
        .Refresh BackgroundQuery:=False
    End With

Tak for venligheden


Thomas
Avatar billede kabbak Professor
19. februar 2007 - 22:38 #5
"SELECT `00Apparat`.ApparatBetegnelse" & Chr(13) & "" & Chr(10) & "FROM `C:\Temp\TempSpecialeLogbog`.`00Apparat` `00Apparat`" & Chr(13) & "" & Chr(10) & "WHERE (`00Apparat`.ApparatBetegnelse='" & [A1] & "')" _
Avatar billede thomashansen Nybegynder
20. februar 2007 - 08:56 #6
Når jeg afvikler scriptet som kabbak har været venlig at skrive får jeg en "Debug Error" ?
Avatar billede kabbak Professor
20. februar 2007 - 14:16 #7
Her er et eksempel fr hjælpen, prøv at se om du kan bruge det, jeg har sat Celle A1 ind som en tekstkriterie, se om du kan rette den til.

This example runs a query on the Northwind database. The result of the query, displayed on Sheet1, is a list of all products that are currently on order.


databaseName = "NorthWind"
queryString = _
    "SELECT * FROM product.dbf WHERE (product.ON_ORDER<>'" & [A1] & "')"
chan = SQLOpen("DSN=" & databaseName)
SQLExecQuery chan, queryString
Set output = Worksheets("Sheet1").Range("A1")
SQLRetrieve chan, output, , , True
SQLClose chan
Avatar billede thomashansen Nybegynder
20. februar 2007 - 15:49 #8
Vi er enige om, at jeg indtaster mit søgekriterie (input) i celle A1, at SQL-udtrykket afvikles under hensyntagen til mit søgekriterie og så returnerer "svar" i samme regneark f.eks i kolonne B ?

Det er bare ikke det jeg får, så jeg gør nok noget forkert
Avatar billede thomashansen Nybegynder
20. februar 2007 - 17:36 #9
OK

Jeg har tilrettet mit oprindelige script med "WHERE (`00Apparat`.ApparatBetegnelse='" & [A1] & "')" som det foreslås og det fungerer:

    With ActiveSheet.QueryTables.Add(Connection:=Array(Array( _
        "ODBC;DBQ=C:\Temp\TempSpecialeLogbog.mdb;DefaultDir=C:\Temp;Driver={Driver do Microsoft Access (*.mdb)};DriverId=25;FIL=MS Access;Max" _
        ), Array( _
        "BufferSize=2048;MaxScanRows=8;PageTimeout=5;SafeTransactions=0;Threads=3;UserCommitSync=Yes;" _
        )), Destination:=Range("B1"))
        .CommandText = Array( _
        "SELECT `00Apparat`.ApparatBetegnelse" & Chr(13) & "" & Chr(10) & "FROM `C:\Temp\TempSpecialeLogbog`.`00Apparat` `00Apparat`" & Chr(13) & "" & Chr(10) & "WHERE (`00Apparat`.ApparatBetegnelse='" & [A1] & "')" _
        )
        .Name = "Forespørgsel fra TempSpecialeLogbog"
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .BackgroundQuery = True
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .PreserveColumnInfo = True
        .Refresh BackgroundQuery:=False
    End With
End Sub

Nu vil jeg så bare gerne tvinge scriptet til, altid at sende output til kolonne B
Avatar billede kabbak Professor
20. februar 2007 - 17:51 #10
Hvor kommer det nu ??

"ActiveSheet.QueryTables.Add" betyder at du tilføjer en ny forespørgsel, den har det med at skuppe kolonner, så vidt jeg husker.

Du kan opdatere eksisterende ved at bruge denne, men om det er det du skal bruge, ved jeg ikke og om den genlæser A1, ved opdateringen.


Public Sub opdater()
For Each qt In ActiveSheet.QueryTables
    qt.Refresh
Next

End Sub
Avatar billede thomashansen Nybegynder
20. februar 2007 - 17:58 #11
Den udskriver i kolonne B, men når jeg ændrer søgekriterie resultat af den gamle søgning mod højre
Avatar billede thomashansen Nybegynder
20. februar 2007 - 18:21 #12
Altså det kommer i kolonne B men de gamle resultater flyttes mod højre og det ønsker jeg ikke.

Jeg ønsker kolonne B opdateret og de gamle resultater skal så blot overskrevet.
Avatar billede kabbak Professor
20. februar 2007 - 19:37 #13
Ok, det var også det jeg skrev, hvis du brugte din makro hvergang.
Hvad sker der hvis du bruger makroen opdater i stedet, læser den den nye kriterier i A1 ind ??
Avatar billede thomashansen Nybegynder
20. februar 2007 - 20:20 #14
Mit script ser sådan ud nu:

Sub Valg1()
'
' George Makro
' Makro indspillet 17-02-2007 af Kristina og Thomas Hansen
'

'
  With ActiveSheet.QueryTables.Add(Connection:=Array(Array( _
        "ODBC;DBQ=C:\Temp\TempSpecialeLogbog.mdb;DefaultDir=C:\Temp;Driver={Driver do Microsoft Access (*.mdb)};DriverId=25;FIL=MS Access;Max" _
        ), Array( _
        "BufferSize=2048;MaxScanRows=8;PageTimeout=5;SafeTransactions=0;Threads=3;UserCommitSync=Yes;" _
        )), Destination:=Range("A3"))
        .CommandText = Array( _
        "SELECT `00Apparat`.ApparatBetegnelse" & Chr(13) & "" & Chr(10) & "FROM `C:\Temp\TempSpecialeLogbog`.`00Apparat` `00Apparat`" & Chr(13) & "" & Chr(10) & "WHERE (`00Apparat`.ApparatBetegnelse='" & [A1] & "')" _
        )
        .Name = "Forespørgsel fra TempSpecialeLogbog"
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .BackgroundQuery = True
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .PreserveColumnInfo = True
        .Refresh BackgroundQuery:=False

      'M End With
     
      For Each qt In ActiveSheet.QueryTables
      qt.Refresh
      Next
      End With
  End Sub

Jeg er ikke helt sikker på, at jeg har indsat opdateringsscriptet korrekt, men den flytter stadig blot kolonnerne til højre.
Avatar billede kabbak Professor
20. februar 2007 - 20:55 #15
det er fordi du Adder en ny query, hvergang du kører makroe.:
kør denne 1 gang

Sub Valg1()
'
' George Makro
' Makro indspillet 17-02-2007 af Kristina og Thomas Hansen
'

'
  With ActiveSheet.QueryTables.Add(Connection:=Array(Array( _
        "ODBC;DBQ=C:\Temp\TempSpecialeLogbog.mdb;DefaultDir=C:\Temp;Driver={Driver do Microsoft Access (*.mdb)};DriverId=25;FIL=MS Access;Max" _
        ), Array( _
        "BufferSize=2048;MaxScanRows=8;PageTimeout=5;SafeTransactions=0;Threads=3;UserCommitSync=Yes;" _
        )), Destination:=Range("A3"))
        .CommandText = Array( _
        "SELECT `00Apparat`.ApparatBetegnelse" & Chr(13) & "" & Chr(10) & "FROM `C:\Temp\TempSpecialeLogbog`.`00Apparat` `00Apparat`" & Chr(13) & "" & Chr(10) & "WHERE (`00Apparat`.ApparatBetegnelse='" & [A1] & "')" _
        )
        .Name = "Forespørgsel fra TempSpecialeLogbog"
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .BackgroundQuery = True
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .PreserveColumnInfo = True
        .Refresh BackgroundQuery:=False

      'M End With
   
      For Each qt In ActiveSheet.QueryTables
      qt.Refresh
      Next
      End With
  End Sub


Prøv så at køre denne ved opdatering,resten af tiden:

Sub Valg2()
'
' George Makro
' Makro indspillet 17-02-2007 af Kristina og Thomas Hansen
'

'
  With ActiveSheet.QueryTables("Forespørgsel fra TempSpecialeLogbog")
        .CommandText = Array( _
        "SELECT `00Apparat`.ApparatBetegnelse" & Chr(13) & "" & Chr(10) & "FROM `C:\Temp\TempSpecialeLogbog`.`00Apparat` `00Apparat`" & Chr(13) & "" & Chr(10) & "WHERE (`00Apparat`.ApparatBetegnelse='" & [A1] & "')" _
        )
        .Name = "Forespørgsel fra TempSpecialeLogbog"
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .BackgroundQuery = True
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .PreserveColumnInfo = True
        .Refresh BackgroundQuery:=False

      End With
  End Sub
Avatar billede thomashansen Nybegynder
20. februar 2007 - 22:37 #16
Når jeg kører Sub Valg2() får jeg Run-time error '9' i 1. linie
Avatar billede kabbak Professor
20. februar 2007 - 22:47 #17
har du kørt valg1 først ?
Avatar billede thomashansen Nybegynder
20. februar 2007 - 22:57 #18
Ja jeg kalder valg1 (der virker og dernæst kalder jeg valg2, men i 1. ste linie går det galt
Avatar billede kabbak Professor
20. februar 2007 - 23:10 #19
prøv at ændre
With ActiveSheet.QueryTables("Forespørgsel fra TempSpecialeLogbog")
til

With ActiveSheet.QueryTables
Avatar billede thomashansen Nybegynder
20. februar 2007 - 23:16 #20
Så får jeg Run-time error '438' i 1. linie
Avatar billede kabbak Professor
20. februar 2007 - 23:17 #21
Jeg vil ikke garentere om det virker, da jeg kun en enkelt gang, har arbejdet med at hente data fra access via kode.
Avatar billede kabbak Professor
20. februar 2007 - 23:18 #22
hvad sker der, hvis du kører denne kode alene.

Public Sub opdater()
For Each qt In ActiveSheet.QueryTables
    qt.Refresh
Next
Avatar billede thomashansen Nybegynder
20. februar 2007 - 23:28 #23
Jeg kan godt afvikle scriptet, men der er jo ikke noget output
Avatar billede kabbak Professor
21. februar 2007 - 00:01 #24
Mit sidste bud, nu kun 1 makro, i starten sletter den den gamle queryTable.
Sub Valg1()
'
' George Makro
' Makro indspillet 17-02-2007 af Kristina og Thomas Hansen
'
For Each qt In ActiveSheet.QueryTables
      qt.Delete
    Next
   
     
  With ActiveSheet.QueryTables.Add(Connection:=Array(Array( _
        "ODBC;DBQ=C:\Temp\TempSpecialeLogbog.mdb;DefaultDir=C:\Temp;Driver={Driver do Microsoft Access (*.mdb)};DriverId=25;FIL=MS Access;Max" _
        ), Array( _
        "BufferSize=2048;MaxScanRows=8;PageTimeout=5;SafeTransactions=0;Threads=3;UserCommitSync=Yes;" _
        )), Destination:=Range("A3"))
        .CommandText = Array( _
        "SELECT `00Apparat`.ApparatBetegnelse" & Chr(13) & "" & Chr(10) & "FROM `C:\Temp\TempSpecialeLogbog`.`00Apparat` `00Apparat`" & Chr(13) & "" & Chr(10) & "WHERE (`00Apparat`.ApparatBetegnelse='" & [A1] & "')" _
        )
        .Name = "Forespørgsel fra TempSpecialeLogbog"
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .BackgroundQuery = True
        .RefreshStyle = xlInsertDeleteCell
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .PreserveColumnInfo = True
        .Refresh BackgroundQuery:=False

      'M End With
    End With
   
  End Sub
Avatar billede thomashansen Nybegynder
21. februar 2007 - 00:22 #25
Ja så kommer der kun output i kolonne A.

Jeg kan dog se, at output ikke opdateres selvom jeg fjerner mit søgekriterie.
F.eks hvis jeg fjerner søgekriteriet "George" og  lader celle A1 være tom, så returneres stadig "George" som output.

OK jeg stopper for i aften foreløbigt tak for hjælpen.

Jeg synes du skal lægge et svar - så kan jeg evt. oprette et nyt spørgsmål hvis det bliver nødvendigt. Tak for hjælpen.
Avatar billede kabbak Professor
21. februar 2007 - 00:24 #26
Hvis det ikke virker, skal jeg heller ikke have point, svar selv og tag point tilbage.

du kan jo bruge dem i et nyt spørgsmål.
;-))
Avatar billede thomashansen Nybegynder
24. februar 2007 - 18:46 #27
Er du stadig frisk kabbak ?

Jeg synes jo stadig du skal have de point´s for jeg er kommet noget videre ved din hjælp.

Hvis du kan hjælpe med det her vil jeg selvfølgelig også være glad: http://www.eksperten.dk/spm/764441
Avatar billede kabbak Professor
24. februar 2007 - 23:05 #28
Jeg skal kun have point, hvis det hjalp dig.
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