Avatar billede uniholck Nybegynder
04. august 2003 - 14:14 Der 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")

jeg har også sat calculation til manual.
Avatar billede somaliomar Praktikant
04. august 2003 - 14:29 #1
Forstår ikke helt din problemstilling. Kan du paste hele din kode herinde?
Avatar billede uniholck Nybegynder
04. august 2003 - 14:46 #2
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).
Avatar billede bak Forsker
04. august 2003 - 15:13 #3
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
Avatar billede uniholck Nybegynder
04. august 2003 - 15:37 #4
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
   
    For x = 1 To 3
        Input #filnum, fyld
    Next x
    If antal > 0 Then
        tælle = tælle + 1
        regneark.activesheet.Cells(tælle, 1) = company
        regneark.activesheet.Cells(tælle, 2) = navn
        regneark.activesheet.Cells(tælle, 3) = modtagercompany
        regneark.activesheet.Cells(tælle, 4) = adr1
        regneark.activesheet.Cells(tælle, 5) = adr2
        regneark.activesheet.Cells(tælle, 6) = postnr
        regneark.activesheet.Cells(tælle, 7) = by
        regneark.activesheet.Cells(tælle, 8) = land
        regneark.activesheet.Cells(tælle, 9) = antal
        regneark.activesheet.Cells(tælle, 10) = frekvens
        regneark.activesheet.Cells(tælle, 11) = deadline
        regneark.activesheet.Cells(tælle, 12) = cmadm
        regneark.activesheet.Cells(tælle, 13) = cm
        regneark.activesheet.Cells(tælle, 14) = internantal
        regneark.activesheet.Cells(tælle, 15) = internnavn
    End If
Wend
regneark.activesheet.Range("A1:X" & tælle).Sort Key1:=regneark.activesheet.Range("A2"), Order1:=xlAscending, Key2:=regneark.activesheet.Range("B2") _
        , Order2:=xlAscending, Key3:=regneark.activesheet.Range("J2"), Order3:=xlAscending, Header:= _
        xlYes, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
For tælle = 2 To tælle
        regneark.activesheet.Cells(tælle, 16).Formula = "=A" & tælle & "&B" & tælle
        regneark.activesheet.Cells(tælle, 17).Formula = "=IF(P" & tælle - 1 & "<>P" & tælle & ",1,0)"
        regneark.activesheet.Cells(tælle, 18).Formula = "=IF($Q" & tælle + 1 & "=0,IF($T" & tælle & "=$T" & tælle + 1 & ",R" & tælle + 1 & ",IF($J" & tælle & "=" & Chr(34) & "Monthly" & Chr(34) & ",$I" & tælle & ",R" & tælle + 1 & ")),IF($J" & tælle & "=" & Chr(34) & "Monthly" & Chr(34) & ",$I" & tælle & ",0))"
        regneark.activesheet.Cells(tælle, 19).Formula = "=IF($Q" & tælle + 1 & "=0,IF($T" & tælle & "=$T" & tælle + 1 & ",S" & tælle + 1 & ",IF($J" & tælle & "=" & Chr(34) & "Quarterly" & Chr(34) & ",$I" & tælle & ",S" & tælle + 1 & ")),IF($J" & tælle & "=" & Chr(34) & "Quarterly" & Chr(34) & ",$I" & tælle & ",0))"
        regneark.activesheet.Cells(tælle, 20).Formula = "=A" & tælle & "&B" & tælle & "&J" & tælle
        regneark.activesheet.Cells(tælle, 21).Formula = "=IF(AND($T" & tælle & "<>$T" & tælle + 1 & ",$J" & tælle & "=" & Chr(34) & "Monthly" & Chr(34) & "),$N" & tælle & ",IF($J" & tælle & "=" & Chr(34) & "Monthly" & Chr(34) & ",U" & tælle + 1 & "+$N" & tælle & ",U" & tælle + 1 & "))"
        regneark.activesheet.Cells(tælle, 22).Formula = "=IF(AND($T" & tælle & "<>$T" & tælle + 1 & ",$J" & tælle & "=" & Chr(34) & "Monthly" & Chr(34) & "),$O" & tælle & ",IF($J" & tælle & "=" & Chr(34) & "Monthly" & Chr(34) & ",V" & tælle + 1 & "&" & Chr(34) & ", " & Chr(34) & "&$O" & tælle & ",V" & tælle + 1 & "))"
        regneark.activesheet.Cells(tælle, 23).Formula = "=IF(AND($T" & tælle & "<>$T" & tælle + 1 & ",$J" & tælle & "=" & Chr(34) & "Quarterly" & Chr(34) & "),$N" & tælle & ",IF($J" & tælle & "=" & Chr(34) & "Quarterly" & Chr(34) & ",W" & tælle + 1 & "+$N" & tælle & ",W" & tælle + 1 & "))"
        regneark.activesheet.Cells(tælle, 24).Formula = "=IF(AND($T" & tælle & "<>$T" & tælle + 1 & ",$J" & tælle & "=" & Chr(34) & "Quarterly" & Chr(34) & "),$O" & tælle & ",IF($J" & tælle & "=" & Chr(34) & "Quarterly" & Chr(34) & ",X" & tælle + 1 & "&" & Chr(34) & ", " & Chr(34) & "&$O" & tælle & ",X" & tælle + 1 & "))"
        regneark.activesheet.Cells(tælle, 25).Formula = tælle
        regneark.activesheet.Cells(tælle, 26).Formula = "=upper(Left(A" & tælle & ",1))"
Next tælle

regneark.activesheet.Range("A1:Z" & tælle).Copy
regneark.activesheet.Range("A1:Z" & tælle).PasteSpecial (xlPasteValues)
Close #filnum
regneark.Application.Calculation = xlCalculationAutomatic
regneark.Application.ScreenUpdating = True
regneark.SaveAs FileName:="C:\regneark.xls"

'Call Fyld_Form(regneark, tælle)
Set regneark = Nothing
End Sub
Avatar billede bak Forsker
04. august 2003 - 16:24 #5
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
   
    .Range("A1:X" & tælle).Sort Key1:=.Range("A2"), Order1:=xlAscending, Key2:=.Range("B2") _
            , Order2:=xlAscending, Key3:=.Range("J2"), Order3:=xlAscending, Header:= _
            xlYes, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
   
   
    tælle2 = 2
   
    .Cells(tælle2, 16).Formula = "=A" & tælle2 & "&B" & tælle2
    .Cells(tælle2, 17).Formula = "=IF(P" & tælle2 - 1 & "<>P" & tælle2 & ",1,0)"
    .Cells(tælle2, 18).Formula = "=IF($Q" & tælle2 + 1 & "=0,IF($T" & tælle2 & "=$T" & tælle2 + 1 & ",R" & tælle2 + 1 & ",IF($J" & tælle2 & "=" & Chr(34) & "Monthly" & Chr(34) & ",$I" & tælle2 & ",R" & tælle2 + 1 & ")),IF($J" & tælle2 & "=" & Chr(34) & "Monthly" & Chr(34) & ",$I" & tælle2 & ",0))"
    .Cells(tælle2, 19).Formula = "=IF($Q" & tælle2 + 1 & "=0,IF($T" & tælle2 & "=$T" & tælle2 + 1 & ",S" & tælle2 + 1 & ",IF($J" & tælle2 & "=" & Chr(34) & "Quarterly" & Chr(34) & ",$I" & tælle2 & ",S" & tælle2 + 1 & ")),IF($J" & tælle2 & "=" & Chr(34) & "Quarterly" & Chr(34) & ",$I" & tælle2 & ",0))"
    .Cells(tælle2, 20).Formula = "=A" & tælle2 & "&B" & tælle2 & "&J" & tælle2
    .Cells(tælle2, 21).Formula = "=IF(AND($T" & tælle2 & "<>$T" & tælle2 + 1 & ",$J" & tælle2 & "=" & Chr(34) & "Monthly" & Chr(34) & "),$N" & tælle2 & ",IF($J" & tælle2 & "=" & Chr(34) & "Monthly" & Chr(34) & ",U" & tælle2 + 1 & "+$N" & tælle2 & ",U" & tælle2 + 1 & "))"
    .Cells(tælle2, 22).Formula = "=IF(AND($T" & tælle2 & "<>$T" & tælle2 + 1 & ",$J" & tælle2 & "=" & Chr(34) & "Monthly" & Chr(34) & "),$O" & tælle2 & ",IF($J" & tælle2 & "=" & Chr(34) & "Monthly" & Chr(34) & ",V" & tælle2 + 1 & "&" & Chr(34) & ", " & Chr(34) & "&$O" & tælle2 & ",V" & tælle2 + 1 & "))"
    .Cells(tælle2, 23).Formula = "=IF(AND($T" & tælle2 & "<>$T" & tælle2 + 1 & ",$J" & tælle2 & "=" & Chr(34) & "Quarterly" & Chr(34) & "),$N" & tælle2 & ",IF($J" & tælle2 & "=" & Chr(34) & "Quarterly" & Chr(34) & ",W" & tælle2 + 1 & "+$N" & tælle2 & ",W" & tælle2 + 1 & "))"
    .Cells(tælle2, 24).Formula = "=IF(AND($T" & tælle2 & "<>$T" & tælle2 + 1 & ",$J" & tælle2 & "=" & Chr(34) & "Quarterly" & Chr(34) & "),$O" & tælle2 & ",IF($J" & tælle2 & "=" & Chr(34) & "Quarterly" & Chr(34) & ",X" & tælle2 + 1 & "&" & Chr(34) & ", " & Chr(34) & "&$O" & tælle2 & ",X" & tælle2 + 1 & "))"
    .Cells(tælle2, 25).Formula = tælle2
    .Cells(tælle2, 26).Formula = "=upper(Left(A" & tælle2 & ",1))"
    .Range(Cells(tælle2, 16), Cells(tælle2, 26)).AutoFill Destination:=Range(Cells(tælle2, 16), Cells(tælle22, 26))
    .Range("A1:c11").Value = .Range("A1:c11").Value

End With

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
Avatar billede bak Forsker
04. august 2003 - 16:35 #6
I en af de sidste linier er jeg kommet til at skrive tælle22 istedet for tælle2
Avatar billede bak Forsker
04. august 2003 - 16:37 #7
rettelse:
linien rettes til
.Range(Cells(tælle2, 16), Cells(tælle2, 26)).AutoFill Destination:=Range(Cells(tælle2, 16), Cells(tælle, 26))
Avatar billede uniholck Nybegynder
04. august 2003 - 16:50 #8
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.
Avatar billede bak Forsker
04. august 2003 - 16:54 #9
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))
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