05. juni 2002 - 06:38Der 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 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
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
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
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.
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.
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.
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
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.
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
Synes godt om
Ny brugerNybegynder
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.