Kan dit sneller: Rows(rij).Hidden=True

  • Onderwerp starter Onderwerp starter EdWel
  • Startdatum Startdatum
Status
Niet open voor verdere reacties.

EdWel

Gebruiker
Lid geworden
23 sep 2008
Berichten
104
Beste meedenkers,

De uitvoering van onderstaande code om rijen te verbergen duurt veel te lang.
Heeft iemand een snellere manier?

Code:
Application.ScreenUpdating = False
Dim rij as Integer, kol as Byte

For rij = 1 To 500
    For kol = 1 To 25
        If Sheets(1).Cells(rij, kol) .Value = 0 Then
           Rows(rij).Hidden = True
           Exit For
        End If
    Next kol
Next rij

Application.ScreenUpdating = True
De eigenschap .Hidden is erg traag.

Groet, Ed
 
Ik zou dan toch overwegen om je systeem te upgraden want na reproductie van je sheet en uitvoering macro (met de nullen in de laatste kolom, dus alle lussen moesten volledig doorlopen worden) had ik na minder dan 1 sec het resultaat op m'n scherm
 
Ik was nu toch wel even benieuwd, matrix A1:Y500 met 0 gevuld en de code uitgevoerd. Duurde inderdaad ook maar een seconde op een 3 jaar oude Core2 6400 2.14 Ghz, 2 Gb RAM
 
Probeer anders deze eens
Code:
Application.Calculation = xlCalculationManual

je code

Application.Calculation = xlCalculationAutomatic
 
Hallo Warme bakkertje,
Application.Calculation = xlCalculationManual/Automatic werkt helemaal perfecto. Net zo snel als het autofilter nu.

Hallo Rene Dirks,
Er zaten nog wat andere toeters en bellen in mijn code die de zaak op mijn Dual E2140 1,6 Ghz/1 Mb Ram tot 2 seconden vertraagden. En da's irritant.

Opgelost, geweldig,
gracias amigos !!!

Ed
 
Je kunt het aantal beeldschermbewerkingen beperken met:

Code:
Sub tst()
  For j = 1 To 500
     If WorksheetFunction.CountIf(Cells(j, 1).Resize(, 25), 0) > 0 Then c4 = c4 & j & ":" & j & ","
  Next
  Range(Left(c4, Len(c4) - 1)).EntireRow.Hidden = True
End Sub
 
Hoi snb,

De volledige code is nu:
Code:
Dim hide(500,25) as Boolean, sep as Integer   '(Staat in een andere proc.)

Private Sub Update()
   Application.ScreenUpdating = False
   Application.Calculation = xlCalculationManual
   Dim rij As Integer, kol As Byte
   
   For rij = 1 To 500
      For kol = 1 To 25
         If hide(rij, kol) = True Then
            Rows(rij).Hidden = True
            Exit For
         End If
      Next kol
      If kol = 26 Then Rows(rij).Hidden = False
   Next rij
   
   Rows(sep).Hidden = False         'De scheidingsregel
   ActiveWindow.ScrollRow = 6       'Naar boven
   Application.Calculation = xlCalculationAutomatic
   Application.ScreenUpdating = True
End Sub
De array 'hide(rijen,kolommen)' wordt in diverse andere procedures volledig gevuld met Trues and Falses, afhankelijk van diverse criteria.
Zo krijg ik een compacte array, waar in bovenstaande code per regel uitgelezen wordt of er een True tussenzit. Zo ja: regel verbergen, zo nee: regel (weer) laten zien.

Kun jij jouw code hierin verwerken om de beeldschermbewerkingen te beperken?
(Niet noodzakelijk hoor, want met het bovenstaande was ik dik tevreden)

Groet, Ed
 
Deze code is voldoende; alle overige die je had is overbodig.

Code:
Private Sub Update()
  For j = 1 To 500
    For jj = 1 To 25
      If hide(j, jj) = True Then
            c4 =c4 & replace("*.*,","*",j)
            Exit For
      End If
    Next
  Next
  
  Range(left(c4,len(c4)-1)).entirerow.hidden=true
End Sub

Als je gebruik maakt van een objectvariable kan het veel efficiënter:
Code:
Sub tst()
  Set sq = Sheets(1).[A1:D10]
  For Each rw In sq.Rows
     If WorksheetFunction.CountIf(rw, True) > 0 Then c4 = c4 & Replace("*:*,", "*", rw.Row)
  Next
  Range(left(c4,len(c4)-1)).entirerow.hidden=true
End Sub
 
Hoi snb,

Klopt dit wel? Mijn code zegt dit:

Doorloop tabel(regel 1, alle 25 kolommen).
Zodra er een True tussen zit: regel verbergen.
Doorloop volgende regel.

Mijn code kan dus evt. 500 regels verbergen. Daarom begin ik ook met Application.ScreenUpdating = False.
Jouw code verbergt één regel nadat de 2 lussen doorlopen zijn.
Als je jouw laatste regel vervangt door: MsgBox Left(c4, Len(c4) - 1), zie je een enorme rij cijfers waar Rows().Hidden geen raad mee weet. Foutje in de syntax oid.?
Ik ben er altijd op uit om code zo kort en overzichtelijk mogelijk te houden maar hier weet ik geen raad mee.

Groet, Ed
 
Ik zie in mijn code geen Rows().Hidden

wel Range(..).entirerow.hidden
 
Laatst bewerkt:
Probeer dit dan even te runnen:

Code:
Dim hide(500, 25)

Sub FillArray()
   For r = 1 To 500
      For k = 1 To 25
         hide(r, k) = False  ' Hele tabel gevuld met False
      Next k
   Next r
   
   For r = 1 To 500 Step 33
      hide(r, 16) = True ' Op elke 33e regel zit nu een True
   Next r
   Update
End Sub
Dan volgt hieronder letterlijk jouw code, alleen de MsgBox heb ik erbij gezet:

Code:
Private Sub Update()
  For j = 1 To 500
    For jj = 1 To 25
      If hide(j, jj) = True Then
            c4 = c4 & Replace("*.*,", "*", j)
            Exit For
      End If
    Next
  Next
  MsgBox Left(c4, Len(c4) - 1)
  Sheets(1).Range(Left(c4, Len(c4) - 1)).EntireRow.Hidden = True
End Sub
Zie je wat er in de MsgBox staat?

Groet, Ed
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan