Avatar billede tida Juniormester
16. marts 2005 - 11:13 Der er 32 kommentarer og
1 løsning

Langsom makro !

Jeg har et problem med en meget ofte benyttet makro som opfører sig underligt. Ideen med makroen er at fjerne rækker fra en rapport hvor saldi giver nul og derefter udskrive udskriften. Makroen fungere f.s.v. udmærket første gang den bliver aktiveret, men anden gang "hænger" den og er ualmindelig lang tid om udførelsen. Lukker man derimod filen og åbner den igen er makroen igen kvik, men det virker utroligt irriterende.

Har nogen evt. et bud på hvad der kan være galt...jeg vedlægger koden :

Sub udskrivresultatudennul()

Sheets("RESULTATOPGØRELSE").Select
application.ScreenUpdating = False
application.Calculation = xlCalculationManual
ActiveSheet.Outline.ShowLevels RowLevels:=2
For i = 3 To 1000
If Range("a" & i & ":a" & i + 3).Text = "" Then Exit For
If application.WorksheetFunction.Sum(Range("b" & i & ":ao" & i)) = "0" Then
Range(i & ":" & i).EntireRow.Hidden = True
End If
Next
ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True
    Range("3:1000").EntireRow.Hidden = False
application.ScreenUpdating = True
ActiveSheet.Outline.ShowLevels RowLevels:=1
Range("A1").Select
application.Calculation = xlCalculationAutomatic
Sheets("Valg").Select
Range("A1").Select
End Sub
Avatar billede kabbak Professor
16. marts 2005 - 11:46 #1
Husker du at vise rækkerne igen, inden du kører den næste gang

Sub udskrivresultatudennul()

Sheets("RESULTATOPGØRELSE").Select
application.ScreenUpdating = False

Cells.EntireRow.Hidden = False ' viser rækkerne igen, hvis de var skjulte

application.Calculation = xlCalculationManual
ActiveSheet.Outline.ShowLevels RowLevels:=2
For i = 3 To 1000
If Range("a" & i & ":a" & i + 3).Text = "" Then Exit For
If application.WorksheetFunction.Sum(Range("b" & i & ":ao" & i)) = "0" Then
Range(i & ":" & i).EntireRow.Hidden = True
End If
Next
ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True
    Range("3:1000").EntireRow.Hidden = False
application.ScreenUpdating = True
ActiveSheet.Outline.ShowLevels RowLevels:=1
Range("A1").Select
application.Calculation = xlCalculationAutomatic
Sheets("Valg").Select
Range("A1").Select
End Sub
Avatar billede tida Juniormester
16. marts 2005 - 12:01 #2
Ja...der sker ca. i linie 13 :

Range("3:1000").EntireRow.Hidden = False
Avatar billede tida Juniormester
16. marts 2005 - 12:04 #3
...hvis man udelader print kommandoen....så virker det som det skal....så der er en eller anden sammenhæng her, som jeg ikke forstår.
Avatar billede sjap Praktikant
16. marts 2005 - 12:57 #4
tida > Jeg ved ikke om det giver nogen forskel, men nu du nævner printningen, kunne du jo prøve at ændre det sætningen:

ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True

til

ActiveSheet.PrintOut
Avatar billede tida Juniormester
16. marts 2005 - 13:06 #5
Øv....heller ikke, desværre
Avatar billede sjap Praktikant
16. marts 2005 - 13:18 #6
Har moslet lidt rundt på koden og bl.a. erstattet Range med Rows, men ved ikke om det giver nogen forskel.

Application.ScreenUpdating = False
Application.EnableEvents = False
Application.Calculation = xlCalculationManual
Sheets("RESULTATOPGØRELSE").Select
ActiveSheet.Outline.ShowLevels RowLevels:=2
For i = 3 To 1000
    If Range("a" & i & ":a" & i + 3).Text = "" Then Exit For
    If Application.WorksheetFunction.Sum(Range("b" & i & ":ao" & i)) = "0" Then
        Rows(i).EntireRow.Hidden = True
    End If
Next
ActiveSheet.PrintOut
Rows("3:1000").EntireRow.Hidden = False
ActiveSheet.Outline.ShowLevels RowLevels:=1
Sheets("Valg").Select
Range("A1").Select
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = False
Avatar billede tida Juniormester
16. marts 2005 - 13:21 #7
Øv øv....den er lynende hurtigt i første hug...anden gang ZZZZZZZ
Avatar billede sjap Praktikant
16. marts 2005 - 13:40 #8
Prøv at udkommentere linierne en af gangen, for at se om der er en enkelt linie, der gør en væsentlig forskel.

Du behøver ikke udkommentere de fire først linier og ikke "For i = 3 To 1000"
Avatar billede sjap Praktikant
16. marts 2005 - 13:54 #9
Ved ikke om det virker sløvende på hastigheden, men

If Application.WorksheetFunction.Sum(Range("b" & i & ":ao" & i)) = "0" Then
    Rows(i).EntireRow.Hidden = True
End If

kan erstattes af

Rows(i).EntireRow.Hidden = (Application.WorksheetFunction.Sum(Range("b" & i & ":ao" & i)) = 0)

Da programmet så har fat i egenskaben hidden for hver række, kan det godt tænkes at koden måske bliver langsommere. Det må du jo lige prøve dig frem med.
Avatar billede tida Juniormester
16. marts 2005 - 13:56 #10
Det har jeg prøvet...og det var her jeg opdagede at synderen er printkommandoen

ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True

Hvis jeg deler makroen i 2....del 1: gem alle nul rækker....del 2: vis alle rækker igen og helt udelader print....så kører det som en leg. Så snart jeg bringer et printlelement indover (også "vis på skærm") så går det galt.
Avatar billede sjap Praktikant
16. marts 2005 - 14:04 #11
Nåh, ja. Det burde jeg jo have set.

Faldt over denne her. Da ScreenUpdating er slået fra skulle det ikke betyde noget, men det skadet vel ikke at prøve.

ActiveSheet.DisplayPageBreaks = False
Avatar billede tida Juniormester
16. marts 2005 - 14:18 #12
hvor skal den "proppes" ind i forløbet ?
Avatar billede bak Forsker
16. marts 2005 - 14:18 #13
prøv lige denne line istedet. Dette er kun print.preview, men hvis det bliver bedre af det, skal jeg nok finde print også :-)

Application.ExecuteExcel4Macro "Print.preview()"
Avatar billede tida Juniormester
16. marts 2005 - 14:19 #14
Er det i stedet for

ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True

?
Avatar billede bak Forsker
16. marts 2005 - 14:21 #15
jeps
Avatar billede tida Juniormester
16. marts 2005 - 14:28 #16
Nej...ingen held, samme resultat
Avatar billede bak Forsker
16. marts 2005 - 14:33 #17
ok, var bare et skud fra hoften idet xl4 makro vedr. page.setup er hurtigere end vba, så det kunne tænkes at print også var det :-)
Avatar billede tida Juniormester
16. marts 2005 - 14:42 #18
Det er jo ikke så elegant,og super irriterende, for vi taler om en hel del filer....men.....hvis jeg opretter et print ark og kører makroen således

fjern nul rækker
kopier ark
indsæt i printark
print printark
tilbage til original ark
vis alle rækker

ja....så kører det upåklageligt

men det er godt nok noget af en omvej...og frygtelig irriterende at skulle rette samtlige filer til på denne måde....men det kan jo ende med at blive løsningen.
Avatar billede sjap Praktikant
16. marts 2005 - 19:14 #19
tida

Endnu et skud. I anden sammenhæng har jeg set, at der kan opstå problemer hvis f.eks. en kommandoknap eller lignende har focus. I det følgende har jeg derfor indsat en Range("A1").Select inden løkken. Måske skal den først stå efter løkken men før PrintOut - så du må prøve dig lidt frem.

Jeg må tilstå at jeg tvivler, men det er vel forholdsvis nemt for dig at prøve det.

Application.ScreenUpdating = False
Application.EnableEvents = False
Application.Calculation = xlCalculationManual
Sheets("RESULTATOPGØRELSE").Select
Range("A1").Select
ActiveSheet.Outline.ShowLevels RowLevels:=2
For i = 3 To 1000
    If Range("a" & i & ":a" & i + 3).Text = "" Then Exit For
    If Application.WorksheetFunction.Sum(Range("b" & i & ":ao" & i)) = "0" Then
        Rows(i).EntireRow.Hidden = True
    End If
Next
ActiveSheet.PrintOut
Rows("3:1000").EntireRow.Hidden = False
ActiveSheet.Outline.ShowLevels RowLevels:=1
Sheets("Valg").Select
Range("A1").Select
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = False
Avatar billede tida Juniormester
17. marts 2005 - 08:50 #20
Hej sjap

Nej heller ikke det gør nogen forskel, desværre !
Avatar billede sjap Praktikant
17. marts 2005 - 10:20 #21
Her testet med nedenstående, men kan ikke genskabe dit problem. Det der tager længst tid her er klart for-løkken.

Mit sidste bud er derfor: Har du prøvet at skrive til en anden printer?

StartArk = ActiveSheet.Name
StartCelle = ActiveCell.Address()
Application.ScreenUpdating = False
Application.EnableEvents = False
Application.Calculation = xlCalculationManual
Sheets("RESULTATOPGØRELSE").Select
ActiveSheet.Outline.ShowLevels RowLevels:=2
For i = 3 To 1000
    If Range("a" & i & ":a" & i + 3).Text = "" Then Exit For
    If Application.WorksheetFunction.Sum(Range("b" & i & ":ao" & i)) = 0 Then
        Rows(i).EntireRow.Hidden = True
    End If
Next
ActiveSheet.PrintOut
Rows("3:1000").EntireRow.Hidden = False
ActiveSheet.Outline.ShowLevels RowLevels:=1
Sheets(StartArk).Select
Range(StartCelle).Select
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
Application.ScreenUpdating = True
Avatar billede tida Juniormester
17. marts 2005 - 10:36 #22
Ja, printeren er ikke problemet....det giver således samme problem blot ved visning af print på skærm. Jeg har haft problemet i flere år...og jeg syntes jeg har prøvet ALT. Jeg har endog præsenteret problemet her på Eksperten for nogle år siden, uden megen held...http://www.eksperten.dk/spm/87133....dengang endte vi ud i en lang makro, temmelig kompliceret løsning, og også dengang med at kopiere over i et nyt ark og så udskrive herfra, en løsning jeg hurtigt droppede. Jeg håbede nu at nogle friske øjne måske kunne klare opgaven dennegang....men der er vist ikke rigtig noget at gøre ved det.
Avatar billede tida Juniormester
17. marts 2005 - 10:38 #23
Hov linket blev vist lidt for lang, vi prøver igen

http://www.eksperten.dk/spm/87133
Avatar billede sjap Praktikant
17. marts 2005 - 11:24 #24
Hvis problemet for printet er de skjulte rækker, og det kan løses ved ikke at lave skjulte rækker, så er der vel ikke noget i vej for at man f.eks. gør således

- lav en kopi af RESULTATOPGØRELSE
- kør ovenstående makro på kopien, men slet rækker i stedet for at skjule
- slet kopien

Det sker altsammen med Application.ScreenUpdating = False, så man kan ikke se alt det "uhyggelige", der sker bag kulisserne.

Hvis tiden er et problem, synes jeg du skulle overveje det.
Avatar billede sjap Praktikant
17. marts 2005 - 11:24 #25
P.S. Du skal selvfølgelig gøre det hele med en makro.
Avatar billede kabbak Professor
17. marts 2005 - 22:24 #26
Prøv med Filter
i AP3 sætter du formlen =SUM(B3:AO3)
træk den ned til række 1000

Skjul kolonnen

sæt denne kode i ThisWorkbook modulet

Private Sub Workbook_BeforePrint(Cancel As Boolean)
Sheets("RESULTATOPGØRELSE").Select
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
ActiveSheet.Outline.ShowLevels RowLevels:=2
  Range("AP2").Select
    Selection.AutoFilter Field:=1, Criteria1:="<>0", Operator:=xlAnd
    ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True
Application.ScreenUpdating = True
ActiveSheet.Outline.ShowLevels RowLevels:=1
  Selection.AutoFilter Field:=1
Range("A1").Select
Application.Calculation = xlCalculationAutomatic
Sheets("Valg").Select
Range("A1").Select
End Sub

nu kan du bruge almindelig print og vis udskrift
Avatar billede kabbak Professor
17. marts 2005 - 22:25 #27
Nb du skal have en overskrift i AP2, hvad der står er underordnet
Avatar billede kabbak Professor
17. marts 2005 - 22:31 #28
disse 2 linier skal måske fjernes for st det virker

Sheets("Valg").Select
Range("A1").Select

men ellers skal du tilbage til en almindelig makro igen
Avatar billede kabbak Professor
17. marts 2005 - 22:35 #29
nej det dur ikke, vi går tilbage til makroen,
men du skal stadigvæk gøre dette
--------------------------------------
Prøv med Filter
i AP3 sætter du formlen =SUM(B3:AO3)
træk den ned til række 1000

Skjul kolonnen

-----------------------------------------

Sub udskrivresultatudennul()
Sheets("RESULTATOPGØRELSE").Select
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
ActiveSheet.Outline.ShowLevels RowLevels:=2
  Range("AP3").Select
    Selection.AutoFilter Field:=1, Criteria1:="<>0", Operator:=xlAnd
    ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True
ActiveSheet.Outline.ShowLevels RowLevels:=1
  Selection.AutoFilter Field:=1
Application.ScreenUpdating = True
Range("A1").Select
Application.Calculation = xlCalculationAutomatic
Sheets("Valg").Select
Range("A1").Select
End Sub
Avatar billede tida Juniormester
18. marts 2005 - 11:22 #30
Hold fast.....det kører som lyn og torden...kabbak.....det er på nippet til at være genialt !!!
det var aldrig faldet mig ind at benytte Filter funktionen i en makro,
men...selvfølgelig !!! Jeg bukker mig i støvet og takker !!!
Sender du et svar, så kvitterer jeg med points.
Avatar billede kabbak Professor
18. marts 2005 - 14:28 #31
ok, så får du et svar ;-))
Avatar billede kabbak Professor
18. marts 2005 - 14:37 #32
tak for point ;-))
Avatar billede tida Juniormester
18. marts 2005 - 14:42 #33
Det er mig der takker
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