04. august 2003 - 14:14Der er
8 kommentarer og 1 løsning
Langsomt Excel-objekt i Word
Jeg har kastet mig ud i at bruge et Excel-objekt til at holde styr på data til et lille Adresselabel-udskrivningsprogram i Word. Jeg henter data fra en kommasepareret fil og smider det ind i objektet celle for celle sammen med en række kodegenererede formler. Derefter hiver jeg data ud af objektet igen for at fylde en træ-kontrol i en Userform. Denne proces tager sammenlagt over et minut og jeg er overbevidst om at det er Excelobjektet der er langsomt. Er det noget jeg kan afhjælpe (både Word og Excel er '97)?
Jeg opretter objektet således:
Dim regneark As Excel.Workbook Set regneark = CreateObject("Excel.sheet")
Det er en del kode i forskellige objekter med tilhørende filer, så jeg vil nødigt paste det ind her.
Mit spørgsmål går mest på om jeg opetter objektet på den bedste måde, hvad er f.eks. forskellen hvis jeg f.eks. bruger Excel.application og kan jeg bruge noget andet end Excel.Sheet. Jeg synes det er svært at finde noget på nettet om det.
Mit spørgsmål gik egentligt også på om jeg kunne slå calculation fra, men det løste jeg mens jeg skrev (jeg havde prøvet at sætte caculation til False, hvilket selvfølgelig ikke virkede, så jeg fik halveret ventetiden).
Det bliver lidt hurtigere med application da du her sætter referencen inden koden compileres, hvorimod createobject først sker mens koden kører. Det burde dog være marginalt, så hvis du skal have mere hastighed tror jeg at vi er nødt til at se selve koden for indlæsning af tekstfilen og dannelsen af formlerne
Jeg har samlet koden lidt. Hvis jeg fjerner de dele af koden der berører objektet kan koden køre på et splitsekund, så det er ikke csv-filloadet den er gal med. Formlerne er lidt langhårede, de bruges til at identificere gengangere og sammentælle antal eksemplarer til interne og eksterne modtagere, de kan ikke pilles ved, og uden dem ville jeg have brugt et array i stedet for et Excelobjekt. Koden der laver træet i min form læser på samme måde som jeg skriver i objektet, så hvis der kan findes noget i nedenstående, kan jeg sikkert direkte overføre det.
Sub LoadData()
Dim strSvar, querynavn, dato, fyld, company, delivtype, navn, modtagercompany, adr1, adr2, adr3, postnr, by, land, frekvens, cm, cmadm, internantal, internnavn, deadline As String Dim filnum, x, antal, tælle As Integer Dim regneark As Excel.Workbook Set regneark = CreateObject("Excel.sheet") tælle = 1 'regneark.Application.Visible = True 'regneark.Application.ScreenUpdating = False regneark.Application.Calculation = xlCalculationManual
strSvar = MsgBox("Ready to load C:\Labels.csv ?", vbYesNo, "Load") If strSvar = vbNo Then Exit Sub End If
filnum = FreeFile Open "C:\Labels.csv" For Input As #filnum
While Not EOF(filnum) Input #filnum, fyld, dato For x = 1 To 25 Input #filnum, fyld Next x Input #filnum, company modtagercompany = company Input #filnum, adr1, adr2, adr3, postnr, by, land Input #filnum, navn
If navn = "" Then For x = 1 To 7 Input #filnum, fyld Next x Input #filnum, antal, delivtype, frekvens, deadline, cmadm, cm, internantal, internnavn Else Input #filnum, modtagercompany, adr1, adr2, adr3, postnr, by, land, antal, delivtype, frekvens, deadline, cmadm, cm, internantal, internnavn End If
Jeg kan godt se at der ikke er meget at hente i csvloadet. Det jeg gør her, er at nøjes med at sætte formelerne ind een gang og så AutoFill dem nedad tilsidst. Prøv om ikke det forøger hastigheden lidt. Husk forøvrigt, når du dimmer dine variable, at i VBA skal hver variabel dimmes for sig, ellers bliver de af typen Variant. (se dim af dine tællere) Ps. jeg har ikke testet da jeg mangler csvfilen.
Sub LoadData()
Dim strSvar, querynavn, dato, fyld, company, delivtype, navn, modtagercompany, adr1, adr2, adr3, postnr, by, land, frekvens, cm, cmadm, internantal, internnavn, deadline As String Dim filnum As Long, x As Long, antal As Long, tælle As Long, tælle2 As Long Dim regneark As Excel.Workbook Set regneark = CreateObject("Excel.sheet") tælle = 1 'regneark.Application.Visible = True 'regneark.Application.ScreenUpdating = False regneark.Application.Calculation = xlCalculationManual
strSvar = MsgBox("Ready to load C:\Labels.csv ?", vbYesNo, "Load") If strSvar = vbNo Then Exit Sub End If
With regneark.activesheet
filnum = FreeFile Open "C:\Labels.csv" For Input As #filnum
While Not EOF(filnum) Input #filnum, fyld, dato For x = 1 To 25 Input #filnum, fyld Next x Input #filnum, company modtagercompany = company Input #filnum, adr1, adr2, adr3, postnr, by, land Input #filnum, navn
If navn = "" Then For x = 1 To 7 Input #filnum, fyld Next x Input #filnum, antal, delivtype, frekvens, deadline, cmadm, cm, internantal, internnavn Else Input #filnum, modtagercompany, adr1, adr2, adr3, postnr, by, land, antal, delivtype, frekvens, deadline, cmadm, cm, internantal, internnavn End If
For x = 1 To 3 Input #filnum, fyld Next x If antal > 0 Then tælle = tælle + 1 .Cells(tælle, 1) = company .Cells(tælle, 2) = navn .Cells(tælle, 3) = modtagercompany .Cells(tælle, 4) = adr1 .Cells(tælle, 5) = adr2 .Cells(tælle, 6) = postnr .Cells(tælle, 7) = by .Cells(tælle, 8) = land .Cells(tælle, 9) = antal .Cells(tælle, 10) = frekvens .Cells(tælle, 11) = deadline .Cells(tælle, 12) = cmadm .Cells(tælle, 13) = cm .Cells(tælle, 14) = internantal .Cells(tælle, 15) = internnavn End If Wend Close #filnum
With regneark .Application.Calculation = xlCalculationAutomatic .Application.ScreenUpdating = True .SaveAs FileName:="C:\regneark.xls" End With 'Call Fyld_Form(regneark, tælle) Set regneark = Nothing End Sub
Tak for svaret, jeg når ikke at se på det idag, men det lyder som om der ikke er meget mere at presse ud af koden, så send mig et svar så du kan få dine vefortjente points. Jeg kan ikke sende dig csv-filen, da det er hemmelige oplysninger men jeg skal nok melde tilbage med tidsbesparelsen.
Ok, jeg retter lige et punktum :-) .Range(Cells(tælle2, 16), Cells(tælle2, 26)).AutoFill Destination:=.Range(Cells(tælle2, 16), Cells(tælle, 26))
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.