Macro à optimiser

Anthonymctm

XLDnaute Occasionnel
Bonjour à tous,

J'utilise une macro qui me permet de masquer les lignes dont la colonne N = 0.

VB:
Sub Masquer_D()
For Each C In Range("Descriptif!N3:N250")
        If C.Value = "0" Then
            Lgndebut = C.Row
            lgnfin = Lgndebut + Range(C.Address).MergeArea.Rows.Count - 1
            Worksheets("Descriptif").Rows(Lgndebut & ":" & lgnfin).EntireRow.Hidden = True
        End If
    Next
End Sub

Sauf qu'elle est super lente.. je me dis qu'il y a peut-être moyen de l'optimiser voire de la refaire différemment.

Merci à tous :)
 

patricktoulon

XLDnaute Barbatruc
re
bon ben j'ai testé et c'est le toulonnais qui gagne
VB:
Sub Masquer_D1()
    Dim p As Range, plage As Range, t
    t = Timer
    Set plage = Range("Descriptif!N3:N250")
    With plage
        For Each cel In plage.Cells
            If cel = "0" Then If p Is Nothing Then Set p = cel Else Set p = Union(p, cel.MergeArea)
        Next
    End With
   MsgBox "patrick " & Timer - t & vbCrLf & p.EntireRow.Address
 'p.EntireRow.Hidden = True'ligne a débloquer
End Sub
Sub Masquer()
Dim LG&, t
t = Timer
LG = Cells(Rows.Count, "N").End(3).Row
Application.ScreenUpdating = False
Cells(2, Columns.Count).Resize(LG - 1).Formula = "=IF(N2=0,""$"",1)"
Columns(Columns.Count).SpecialCells(xlCellTypeFormulas, 2).EntireRow.Hidden = True
Columns(Columns.Count).Delete
MsgBox "stapple " & Timer - t
End Sub
avec ta methode j'ai un timer 0.0235xxxxxx
avec la mienne 0
et en plus soit c'est moi qui est pas compris le but soit ta méthode n'est pas adaptée
je me retrouve avec les lignes 2 a 26 masquées

demo staple
demo3.gif


demo patrick
demo2.gif
 

Staple1600

XLDnaute Barbatruc
Re

Pas sur que le Timer renvoie un temps des plus juste ;)
Un coup, mon code est plus rapide, un coup c'est le tien ??Bizarre, non ?
NB: Réafficher manuellement entre chaque éxécution des macros
VB:
Sub Masquer_D1()
    Dim p As Range, plage As Range, t
    t = Timer
    Set plage = ActiveSheet.Range("N2:N250")
    plage.FormulaR1C1 = "=MOD(ROW(),ALEA.ENTRE.BORNES(1,25))"
    plage.Value = plage.Value
    With plage
        For Each cel In plage.Cells
            If cel = 0 Then If p Is Nothing Then Set p = cel Else Set p = Union(p, cel.MergeArea)
        Next
    End With
   MsgBox "patrick " & Timer - t '& vbCrLf & p.EntireRow.Address
 'p.EntireRow.Hidden = True'ligne a débloquer
End Sub
Sub Masquer()
Dim LG&, t
t = Timer
Range("N2:N250").FormulaR1C1 = "=MOD(ROW(),ALEA.ENTRE.BORNES(1,25))"
Range("N2:N250").Value = Range("N2:N250").Value
LG = Cells(Rows.Count, "N").End(3).Row
Application.ScreenUpdating = False
Cells(2, Columns.Count).Resize(LG - 1).Formula = "=IF(N2=0,""$"",1)"
Columns(Columns.Count).SpecialCells(xlCellTypeFormulas, 2).EntireRow.Hidden = True
Columns(Columns.Count).Delete
MsgBox "Staple " & Timer - t
End Sub
 

Staple1600

XLDnaute Barbatruc
Re

Pourquoi titiller le clipboard ?
(On ne fait pas de copier/coller dans le code, non ?)

Sinon, moi j'avais compris
Masquer si en colonne N , la cellule contient 0 (et pas "0" comme inscrit dans dans ton code ;))
Quant à moi, je n'ai pas pris en compte le cas d'éventuelles cellules fusionnées.

Aprés chaque éxécution, je sélectionne les lignes et clic_droit puis Afficher

Donc pour éviter cet inconvénient, je teste désormais ainsi
VB:
Sub Masquer_D1_II()
    Dim p As Range, plage As Range, t
    t = Timer
    Sheets.Add
    Set plage = Range("N2:N250")
    plage.FormulaR1C1 = "=MOD(ROW(),ALEA.ENTRE.BORNES(1,25))"
    plage.Value = plage.Value
    Application.CutCopyMode = False
    With plage
        For Each cel In plage.Cells
            If cel = 0 Then If p Is Nothing Then Set p = cel Else Set p = Union(p, cel.MergeArea)
        Next
    End With
   MsgBox "patrick " & Timer - t
End Sub
Sub Masquer_III()
Dim LG&, t
t = Timer
Sheets.Add
Range("N2:N250").FormulaR1C1 = "=MOD(ROW(),ALEA.ENTRE.BORNES(1,25))"
Range("N2:N250").Value = Range("N2:N250").Value
LG = Cells(Rows.Count, "N").End(3).Row
Application.CutCopyMode = False
Application.ScreenUpdating = False
Cells(2, Columns.Count).Resize(LG - 1).Formula = "=IF(N2=0,""$"",1)"
Columns(Columns.Count).SpecialCells(xlCellTypeFormulas, 2).EntireRow.Hidden = True
Columns(Columns.Count).Delete
MsgBox "Staple " & Timer - t
End Sub
Et là, sauf erreur, ton code ne masque les lignes quand une cellule en N est égale à zéro.
 

patricktoulon

XLDnaute Barbatruc
re
ben oui mais visiblement timer utilise le clip (va savoir toi )

et mon code a été fait en fonction du premier message
c'est pas 0 mais "0"
et les cellules fusionnées c'est ce que le demandeur a envisagé aussi dans son code (.MergeArea)
la seule chose que je ne sais pas c'est :
si il veut du debut(Lgndebut ) au dernier lgnfin = Lgndebut + avec les intersect
ou
du debut au dernier sans les intersects

code e de l'énoncé
VB:
Sub Masquer_D()

For Each C In Range("Descriptif!N3:N250")

        If C.Value = "0" Then

            Lgndebut = C.Row

            lgnfin = Lgndebut + Range(C.Address).MergeArea.Rows.Count - 1

            Worksheets("Descriptif").Rows(Lgndebut & ":" & lgnfin).EntireRow.Hidden = True

        End If

    Next

End Sub
a tu remarqué que quand tu vide le clip tu n'a plus l'incohérence du timer ?est ce que ça se confirme chez toi
 

Staple1600

XLDnaute Barbatruc
Re

Je suis parti du principe que le demandeur voulait dire N=0 et non pas N="0"
Car ce n'est pas la même chose comme le montre ce petit test (mais bon tu sais déjà ça)
VB:
Sub test()
Range("A1:B1") = Array(0, """0""")
MsgBox IsNumeric([A1])
MsgBox IsNumeric([B1])
End Sub
Le mieux serait d'avoir un fichier exemple fourni le demandeur pour voir comment sont formatées les cellules en colonne N et ce qu'elles contiennent 0 ou "0"

PS: Toujours des bizarreries au niveau du chronométrage des procédures, mais bon comme disait l'autre grand Jacques
"ca m'en touche une sans faire bouger l'autre" ;)
 

Anthonymctm

XLDnaute Occasionnel
Bonjour à tous !

Passionnant vos échanges ! (J'y comprend rien mais ça a l'aire intéressant :D)

Alors, oui il faut que cela fonctionne sur les cellule groupées. Parfois les lignes à masquer vont par exemple de 4 à 7 puis seule (non groupée) puis groupées différement de 15 à 23 etc. En fait c'est toute la zone ou N est groupé.

Après pour la question des intersect, je ne sais pas vous dire : je ne sais pas ce que c'est ^^'

La première macro que j'ai posté, qui n'est pas de moi bien sur, fonctionne bien pour ce que j'en ai besoin. (à part qu'elle dure 3minutes)

Donc pour les zéros je suppose qu'en l'état c'est bon. Parfois la valeur provient d'une formule, parfois c'est directement tapé depuis le clavier numérique.

Hésitez pas si vous avez des questions :)
 

Discussions similaires

Réponses
7
Affichages
292

Statistiques des forums

Discussions
311 733
Messages
2 082 019
Membres
101 872
dernier inscrit
Colin T