Avatar billede per2edb Praktikant
06. juli 2013 - 21:55 Der er 8 kommentarer og
1 løsning

Fyld en kolonne med data fra database

Jeg skal have "Fyldt" kolonne D fra række 6 og nedad til EOF
Mine koder nedenfor virker men udfyldningen er enorm langsom.

Kan i hjælpe med koder der speeder denne proces op.

Dim strPath As String
strPath = Application.ThisWorkbook.Path

    Dim cnnProdukt As New ADODB.Connection
    Dim rstProdukt As New ADODB.Recordset
    cnnProdukt.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strPath & "\xxx.accdb"
   
    rstProdukt.Open "Select Customer from [Customer Forespørgsel]", cnnProdukt, adOpenKeyset, adLockOptimistic, adCmdText
   
    With Worksheets("Customer")
        i = 5
        Do
            i = i + 1
            .Range("D" & Right(i, 2)) = rstProdukt.Fields(0).Value
             
          rstProdukt.MoveNext
        Loop Until rstProdukt.EOF
       
  End With
Avatar billede supertekst Ekspert
06. juli 2013 - 23:44 #1
Hvor mange records er der tale om?
Avatar billede supertekst Ekspert
06. juli 2013 - 23:46 #2
Måske kunne det hjælpe hvis første linje blev tilføjet:

    Application.ScreenUpdating = False
   
    With Worksheets("Ark1")
..
..
Avatar billede per2edb Praktikant
07. juli 2013 - 14:29 #3
Tak for svaret
Application.ScreenUpdating = False hjalp kun ganske lidt
Der er kun ca 30 rækker men det tager 15 sek at lode ind.

Jeg bruger en anden ADO forbindelse til at fylde et helt Ark med 8 coloner og ligeledes ca 30 rækker.
Det tager kun 1 sek.
Kan denne forbindelse laves så den kun tager en colone fra start til EOF. Og vil den så være hurtigere.
Her er koderne:

Dim strPath As String
strPath = Application.ThisWorkbook.Path

    Dim rsProdukter As ADODB.Recordset
    Set rsProdukter = New ADODB.Recordset
    rsProdukter.Open Source:="[Customer Forespørgsel]", ActiveConnection:="Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & strPath & "\xxx.accdb", CursorType:=adOpenStatic, LockType:=adLockOptimistic, Options:=adCmdTable
        With Worksheets("Ark1")
            .Range("A1").CurrentRegion.Clear
            Application.Intersect(.Range(.Rows(1), .Rows(rsProdukter.RecordCount)), .Range(.Columns(1), .Columns(rsProdukter.Fields.Count))).Value = MinTransponer(rsProdukter.GetRows(rsProdukter.RecordCount))
        End With
   
        rsProdukter.Close
Avatar billede supertekst Ekspert
07. juli 2013 - 15:03 #4
Har anvendt din kode på en af mine databaser. En tabel med mere en 300 poster kan også indlæses på ca. 1.sek.

Prøv evt. at komprimer den pågældende database..
Avatar billede per2edb Praktikant
07. juli 2013 - 15:16 #5
Det har jeg prøvt. Det hjælper ikke

Er det :
cnnProdukt.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strPath & "\xxx.accdb"
   
    rstProdukt.Open "Select Customer from [Customer Forespørgsel]", cnnProdukt, adOpenKeyset, adLockOptimistic, adCmdText

Denne der kun tager 1 sek hos dig?

Har du en forbindelse til Access. Jeg har Customer Forespørgsel
med 5 Tabel. I Access tager det nul tid at vise.
Samme forespørgsel ca 1 sek på et helt Excel ark med nr 2 ADO forbindelse. Hvad er der galt med den 1. ADO forbindelse?
Avatar billede Unicco Nybegynder
07. juli 2013 - 15:16 #6
Sæt breakpoints for at lokalisere hvor tidsrøveren er. Umildbart har jeg selv haft problemer med ado forbindelser hvor .open property tog ca. tog 5 sek. Brug eventuelt debug.print now() til at få udlæsninger af programmets scantid
Avatar billede per2edb Praktikant
07. juli 2013 - 18:15 #7
Jeg kan ikke få det sat op i hastighed.
Jeg vil bede jer holde fast i mit første spørgsmål:

Kan denne forbindelse laves så den kun tager en colone fra start til EOF. Og vil den så være hurtigere.
Her er koderne:

Dim strPath As String
strPath = Application.ThisWorkbook.Path

    Dim rsProdukter As ADODB.Recordset
    Set rsProdukter = New ADODB.Recordset
    rsProdukter.Open Source:="[Customer Forespørgsel]", ActiveConnection:="Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & strPath & "\xxx.accdb", CursorType:=adOpenStatic, LockType:=adLockOptimistic, Options:=adCmdTable
        With Worksheets("Ark1")
            .Range("A1").CurrentRegion.Clear
            Application.Intersect(.Range(.Rows(1), .Rows(rsProdukter.RecordCount)), .Range(.Columns(1), .Columns(rsProdukter.Fields.Count))).Value = MinTransponer(rsProdukter.GetRows(rsProdukter.RecordCount))
        End With
Avatar billede per2edb Praktikant
08. juli 2013 - 17:45 #8
Jeg har fundet problemet:

Workbook1 kalder Workbook2
Workbooks.Open "Workbook2.xlsm", ReadOnly:=True

I Workbook2 åbnes en fil som anført ovenfor.

    Dim cnnProdukt As New ADODB.Connection
    Dim rstProdukt As New ADODB.Recordset
    cnnProdukt.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strPath & "\xxx.accdb"
   
    rstProdukt.Open "Select Customer from [Customer Forespørgsel]", cnnProdukt, adOpenKeyset, adLockOptimistic, adCmdText

Det tager ca 15 sek at åbne - MEN åbnes Workbook2 alene uden kald fra Workbook1 tager det 0-1 sek ???????

Altså Workbook1 SPÆRRER. Jeg tror det er noget med måden DB åbnes på.
Kan i hjælpe med en løsning.
Avatar billede per2edb Praktikant
09. juli 2013 - 09:09 #9
Spørgsmålet har ændret karakter så jeg lukker og opretter på ny
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