Avatar billede perholm Nybegynder
05. juni 2002 - 06:38 Der er 5 kommentarer og
1 løsning

Excel VBA, ADO og Pivottabeller med mere end 65536 rækker

Jeg har brug for at generere en pivottabel ud fra en csv-fil med måske 200.000 rækker. Det SKAL foregå i Excel 2000 (ikke Access eller lignende). Dataene må ikke først skulle indlæses til regneark.

Det er lykkedes mig at gøre det manuelt, dvs. uden brug af VBA, men jeg får en fejl, hvis jeg bruger makrooptageren.

Jeg har fundet frem til følgende kode, som jeg ikke ved præcist hvorfor giver en fejl:

Fejlen er:

Run-time error '1004'
Problemer under indlæsningen af data.

Og den opstår i linjen Set PT = ActiveSheet.PivotTables.Add(PivotCache:=PC, _
            TableDestination:=Range("A1"))

Formateringen er desværre røget sig en tur her, men jeg har delt linjerne rigtigt i koden.

Jeg har prøvet med bare 6 linjers data, og dataene bliver skrevet rigtignok i ark1.

Er der én, der kan rette koden og forklare, hvorfor det går galt ?

Sub StatistikInd()

Dim rsData As ADODB.Recordset
Dim szConnect As String
Dim szSQL As String
Dim PC As PivotCache
Dim PT As PivotTable
 
'Create the connection string
szConnect = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
            "Data Source=C:\Test\;" & _
            "Extended Properties=Text;"

'Create the SQL statement
szSQL = "SELECT * FROM Test2.csv WHERE Type='Vare';"

Set rsData = New ADODB.Recordset
rsData.Open szSQL, szConnect, adOpenForwardOnly, adLockReadOnly
           
'Check to make sure we received data.
If Not rsData.EOF Then
    'Dump the returned data onto Sheet1
    'Create the PivotTable cache....
    Set PC = ActiveWorkbook.PivotCaches.Add(SourceType:=xlExternal)
    Set PC.Recordset = rsData

   
  Worksheets("Ark1").Range("A1").CopyFromRecordset rsData
   
   
Else
    MsgBox "No records returned.", vbCritical
End If

'Clean up our Recordset object.
rsData.Close
Set rsData = Nothing
'Create the PivotTable ....
    Worksheets.Add Before:=Sheets(1)
    Set PT = ActiveSheet.PivotTables.Add(PivotCache:=PC, _
            TableDestination:=Range("A1"))

    With PT
        .NullString = "0"
        .SmallGrid = False
        .AddFields RowFields:="Bonnr", ColumnFields:="Date"
        .PivotFields("lbnr").Orientation = xlDataField
    End With
End Sub
Avatar billede bak Forsker
05. juni 2002 - 10:47 #1
Hvorfor har du brug for at have en makro til til det??
Skal du gentage det på andre regneark ?

Ellers er det nemmeste at jo bare at lave den manuelt een gang og derefter højreklikke på pivottabellen og klikke Opdater Pivottabel. Så hiver den selv dataene ind igen.
Avatar billede perholm Nybegynder
06. juni 2002 - 06:19 #2
For det første vil jeg gerne vide, hvad der går galt. For det andet er det en del af et langt større projekt, som skal køre på en 486 med 8 mb RAM, og der skal være et hav af forskellige pivottabeller, så jeg frygter, at jeg hurtigt får hukommelsesproblemer, hvis pivottabellen konstant er i filen. Endelig er computeren uden mus, idet begge COM-porte er optaget.
Avatar billede bak Forsker
07. juni 2002 - 09:43 #3
Jeg kan også komme frem til fejlen, og heller ikke komme videre derfra. Går dog ud fra at det har noget at gøre med overskrifterne.

En anden ting er, at selvom du hiver filen ind på denne måde og lukker den pænt igen, vil alle data blive liggende i pivotcache'en og pivotcache'ens hukommelse blivet kun frigivet hvis du sletter pivottabellen.
Dvs. at du ikke slipper for at have alle data i hukommelsen.
Du kan dog vælge at gemme uden underliggende data (dvs. cache'en tømmes), men for at bruge pivottabellen til andet end at se på, kræver den en genopfriskning af data, altså indlæsning til cache'en igen.
Avatar billede nih Novice
12. juni 2002 - 00:45 #4
hvad med at løbe recordsettet igennem 'manuelt' (while not rsdata.EOF.........) og plotte værdierne ind i de rigtige celler.
Lidt ligesom i en ASP database
Det er nok ikke så resourcekrævende som en pivottabel

Niels
Avatar billede perholm Nybegynder
12. juni 2002 - 06:48 #5
Jeg kan godt løbe det hele igennem manuelt, men så skal jeg selv lave hele brugerfladen, hvor jeg tager hensyn til alle mulige forskellige opstillinger. Det virker som en mere besværlig opgave, når man nu kan få pivottabellen forærende.
Avatar billede perholm Nybegynder
12. juni 2002 - 23:03 #6
Så har jeg fået løst problemet andetsteds. rsData.Open szSQL, szConnect, adOpenForwardOnly, adLockReadOnly skulle ændres til rsData.Open szSQL, szConnect, adOpenStatic, adLockBatchOptimistic, og rsData.Close skulle fjernes. Desuden skal Worksheets("Ark1").Range("A1").CopyFromRecordset rsData fjernes, hvis der er mere end 65536 rækker, men det var jeg godt klar over.

Tak til bak for kommentarerne ovenfor. Jeg er spændt på at teste løsningen på omtalte computer, men som du indirekte skriver, kan det godt være, at det er en umulig opgave at køre det med kun 8 mb RAM. Og det er vel at mærke uanset løsningsmodellen.

Per
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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