Avatar billede hnteknik Novice
10. november 2011 - 10:39 Der er 1 løsning

Effektivisering af multiparameter opslag i Access fra Excel

Jeg har lavet en funktion, som fra Excel laver en 4 parameter opslag i en + 500.000 record tabel i Access. Funktionen returnerer resultatet af queryen. Det virker, men tager vel det bedste af 1-2 minutter at lave +1.400 opslag fra regnearket, hvis tabellen er indekseret. Det vil jeg gerne have at den kunne gøre hurtigere.

Nedenstående er den tungeste af alle, da den åbner og lukker databasen hver gang. Det kan gøres bedre, men er der en smart måde, så man kan få lavet det hele i et hug, f.eks. ved hjælp af en array ? (Excel folk ville nok forneden have brugt Array og .value i stedet for string, men det virker og kan testes i VBA miljøet direkte)

Public Function GNSResLkUp(A As String, B As String, C As String, D As String)
    ' This function requires a reference to Microsoft ActiveX Data Object 2.x
    Dim cn As New ADODB.Connection
    Dim rs As New ADODB.Recordset
    Dim SQLStr As String
    Dim DbPath As String
    If IsNull(A) Or IsNull(B) Or IsNull(C) Or IsNull(D) Then
        GNSResLkUp = 0
        Exit Function
    End If
    If D > 21 Then
        D = 21
    End If
   
    DbPath = "C:\ opslag.mdb"
       
    cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & DbPath
    SQLStr = "SELECT gns FROM Data WHERE " & _
    "A = '" & A & "' AND " & _
    "B= '" & B & "' AND " & _
    "C = '" & C & "' AND " & _
    "D = " & D & " "
    rs.Open SQLStr, cn
    If rs.EOF Or rs.BOF Then
        GNSResLkUp = 0
    ElseIf IsNull(rs(0)) Then
        GNSResLkUp = 0
    Else
        GNSResLkUp = Int(rs(0))
    End If
   
    rs.Close
    Set rs = Nothing
    cn.Close
    Set cn = Nothing
   
    ' USE =GNSResLkUp(E16; H16; K16; U16)
End Function
Avatar billede hnteknik Novice
11. november 2011 - 11:04 #1
Fandt selv en brugbar løsning FOR Loop

    For I = iRowStart To dRowEnd
   
        Range("M" & I).Select
        A= ActiveCell.Offset(0, -8).Value
        B= ActiveCell.Offset(0, -5).Value
        C= ActiveCell.Offset(0, -2).Value
        D= ActiveCell.Offset(0, 8).Value

....

Hvilket fik tiden ned omkring de 5 sek.
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
Excel kurser for alle niveauer og behov – find det kursus, der passer til dig

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