Jeg har lavet en funtion i excel, som vha. 3 parametre henter en værdi i en database.
Her er det vigtigste fra koden:
xSti = "c:\\Database\" Set db = OpenDatabase(xSti + "Database.mdb") Set datatabel1 = db.openrecordset("Data_Yearly1") With datatabel1
.MoveLast
For i = 1 To .RecordCount If .Fields(2) = firma Then Hent = .Fields(tablelocation1(Number) + tid)
Exit For End If
.MovePrevious Next i
Databasen er en access database og tablelocation1(number)+ tid returnerer kolonnenummeret i databasen. Den består af ca. 180 kolonner.
Mit problem er, at jeg ville at ovenstående kode starter forneden i tabellen og arbejder sig opad, da den så støder på den nyest gemte, hvor firma = firma. Men det gør den ikke. Jeg kunne selvfølgelig prøve med een eller anden sorteringsfunktion, men jeg skal alligevel snart have konverteret basen fra ACCESS til SQL..
Er der nogen der har en ide, hvordan jeg kan gøre ovenstående med sql queries istedet? Dvs. sortere tabellen efter dato eller højeste ID og så starte fra nyeste observation og bevæge sig opad indtil man støder på det firmanavn man søger. Derefter skal hent funtion være lige med kolonnen, hvor det data er, man har brug for..
SELECT top 1 Kørsel.Bil, Last(Kørsel.Dato) AS SidsteOfDato, Kørsel.Påfyldt_liter FROM Kørsel GROUP BY Kørsel.Bil, Kørsel.Påfyldt_liter HAVING (((Kørsel.Bil)="Toyota")) ORDER BY Last(Kørsel.Dato) DESC;
Hej.. Sql koderne er ikke problemet.. Der er mere hvordan det bliver implementeret i vba, når man vil bruge sql kommandoer til at tilgå en access database..
Et eksempel, du skal have reference til Microsoft DAO Object libaray
Public Sub HentData() Dim rec As Recordset, Bil As String Dim DB As Database Bil = InputBox("Tast bilmærke") Set DB = Workspaces(0).OpenDatabase("C:\data\db13.mdb") Set rec = DB.OpenRecordset _ ("SELECT TOP 1 Kørsel.Bil, Kørsel.Dato, Kørsel.Påfyldt_liter " & _ "FROM Kørsel " & _ "WHERE (((Kørsel.Bil) = '" & Bil & "')) " & _ "ORDER BY Kørsel.Dato DESC;" _ , dbOpenSnapshot)
'Række1, Række2,... og Tabel er navne angivet i din database
Dim i As Integer 'i indeholder rækkenummeret på den celle der skrives til Do While Not rec.EOF i = i + 1 ActiveSheet.Cells(i, 1) = rec!Bil ActiveSheet.Cells(i, 2) = rec!Dato ActiveSheet.Cells(i, 3) = rec!Påfyldt_liter rec.MoveNext Loop
Som sagt har jeg været på ferie og har lige haft nogle andre projekter kørende, som jeg var nødt til at skulle have færdigt.. Men nu er jeg tilbage på sporet.. :)
Jeg har ændret min kode til følgende:
Set DB = OpenDatabase(xSti + "DataCORE.mdb") Set datatabel1 = DB.OpenRecordset _ ("SELECT * FROM Data_Yearly1" & _ "ORDER BY Data_Yearly1.Tidspunkt DESC;" _ , dbOpenSnapshot)
With datatabel1
.MoveLast
For i = 1 To .RecordCount If .Fields(2) = firma Then Hent = .Fields(tablelocation1(Number) + tid)
Dette er den gamle kode:
Set DB = OpenDatabase(xSti + "DataCORE.mdb") Set datatabel1 = DB.OpenRecordset("Data_Yearly1")
With datatabel1 .MoveLast
For i = 1 To .RecordCount If .Fields(2) = firma Then Hent = .Fields(tablelocation1(Number) + tid)
Den øverste kode virker desværre ikke og den nederste gør.. Kan ikke helt se, hvad jeg gør forkert. Den er også lidt svær at trevle op, da det jo er en worksheet function.
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.