XL 2021 Optimisation code pour affichage ligne et colonne

Nicolas JACQUIN

XLDnaute Impliqué
Supporter XLD
Bonjour à tous,

J'aurai besoin d'un petit coup de main pour optimiser de petits codes mais long à l'éxécution, le sujet:
1 code pour afficher toutes les colonnes masquées
1 code pour afficher toutes les lignes masquées
Après je suis d'accord j'ai été un peu éxessif sur le nombre de lignes et colonnes masquées

Pour les colonnes ça fonctionne mais environ 15 secondes
Pour les lignes arrivé un moment ça ne répond plus du tout

Donc est ce que les codes sont bon ? , ou à optimiser ?
J'ai pensé aussi ajouter une barre de progression mais 😩😩

Je vous joint un petit modèle

Merci de vos lumières
Nicolas

VB:
Private Sub CommandButton1_Click()
    Dim ws As Worksheet
    Dim col As Range
    Set ws = ActiveSheet
    nb = 0
    For Each col In ws.Columns
        If col.Hidden = True Then
            nb = nb + 1
        End If
    Next col
    MsgBox nb
End Sub

Private Sub CommandButton2_Click()
    Dim ws As Worksheet
    Dim col As Range
    Set ws = ActiveSheet
    For Each col In ws.Columns
        If col.Hidden = True Then
            col.Hidden = False
        End If
    Next col
End Sub

Private Sub CommandButton3_Click()
    Dim ws As Worksheet
    Dim lig As Range
    Set ws = ActiveSheet
    nb = 0
    For Each lig In ws.Rows
        If lig.Hidden = True Then
            nb = nb + 1
        End If
    Next lig
    MsgBox nb
End Sub

Private Sub CommandButton4_Click()
    Dim ws As Worksheet
    Dim lig As Range
    Set ws = ActiveSheet
    For Each lig In ws.Rows
        If lig.Hidden = True Then
            lig.Hidden = False
        End If
    Next lig
End Sub


Edit: Rien que pour compter le nombre de lignes masquées, il faut environ 5 secondes
 

Pièces jointes

  • Modèle.xlsm
    318 KB · Affichages: 5
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
Bonjour Nicolas
peux tu m'expliquer pourquoi tu va chercher la quelle est visible ou pas puisque tu veux toute les démasquer

VB:
Sub testRow()
ActiveSheet.Rows.Hidden = False
End Sub
Sub testcolumns()
ActiveSheet.Columns.Hidden = False
End Sub
 

Nicolas JACQUIN

XLDnaute Impliqué
Supporter XLD
Bonjour patricktoulon et Phil69970,

Merci pour vos réponse,
à Patrick, pour compléter mon programme de cracking, que je peux pas déposer ici,
voici à quoi correspond ta question, savoir si colonne ou ligne masquées.

Quand je lance mon programme, ça donne ceci

Capture d’écran 2024-06-15 130150.jpg


donc comme ce qui est protégé ou invisible (sur l'image), pour les lignes ou colonnes je veux faire la même chose, et après je clic sur le bouton et magie tout est visible.

Merci
 
Dernière édition:

TooFatBoy

XLDnaute Barbatruc
Bonjour,

donc comme ce qui est protégé ou invisible (sur l'image), pour les lignes ou colonnes je veux faire la même chose, et après je clic sur le bouton et magie tout est visible.
Le fait de démasquer une colonne qui n'est pas masquée ne provoque pas d'erreur, donc comme le dit le camarade Phil, tu n'as pas besoin de regarder si une colonne est masquée pour ensuite la démasquer.
Il te suffit de démasquer toutes les colonnes de la feuille. ;)
 

Nicolas JACQUIN

XLDnaute Impliqué
Supporter XLD
Bonjour Jacky ;) ,
Tu n'as pas lu correctement, tu ne sais pas forcément si une ligne ou colonne est masquée, le but pour moi c'est de le savoir à l'ouverture de mon prog, ( comme m'a posé la question Patrick ).
Quand je lance mon prog sur un fichier, ça me dit ce qui est masqué ou protégé, je clic sur le bouton correspondant et magie, tout débloqué.
A+
 

TooFatBoy

XLDnaute Barbatruc
Tu n'as pas lu correctement
Désolé :(


tu ne sais pas forcément si une ligne ou colonne est masquée
Ca je l'ai bien lu. ;)
le but pour moi c'est de le savoir à l'ouverture de mon prog,
Il me semblait que le but était de démasquer toutes les colonnes masquées :
1 code pour afficher toutes les colonnes masquées


( comme m'a posé la question Patrick ).
... ;)


Bonne chance pour la suite, camarade.
🖖
 

Nicolas JACQUIN

XLDnaute Impliqué
Supporter XLD
Désolé :(



Ca je l'ai bien lu. ;)

Il me semblait que le but était de démasquer toutes les colonnes masquées :




... ;)


Bonne chance pour la suite, camarade.
🖖

Si je m'exprime mal désolé, quand je lance mon prog, ça me mette en rouge les boutons des lignes et des colonnes si masquée.
le nombre on sens fou après oui c'est uste pour savoir si oui ou non.
Mais quand je clic sur le bouton si rouge, ça débloque tout et affiche tout.

Le seul problème que j'ai posé, c'est que mes codes me parresse long à l'éxécution, d'ou la demande si code bon ou pas bon, ou à optimiser.

edit: image animée
D'ou ma demande de condition si masqué alors démasquer
 
Dernière édition:

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour Nicolas, TooFatBoy, Patrick, Phil,
@Nicolas,
Ca rame car vous examinez 16384 colonnes et 1048576 lignes.
Suivant votre fichier réel, il doit être possible de réduire ces max. Par ex si vous savez que vous n'aurez jamais plus de 200 colonnes et 3000 lignes cela réduirait respectivement les temps de 87% et 99%.
L'autre solution est de calculer le nombre de lignes utiles, si votre fichier si prête, avec :
VB:
DernièreLigne = Range("A65500").End(xlUp).Row
DernièreColonne = Cells(1, Columns.Count).End(xlToLeft).Column
En ayant soin de choisir judicieusement la colonne et la ligne ayant le max de données.
Sinon, si on ne connait pas quelle ligne ou colonne choisir :
VB:
DerniereCellule_Ligne = Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious, LookIn:=xlFormulas).Row
DerniereCellule_Colonne = Cells.Find("*", SearchOrder:=xlByColumns, SearchDirection:=xlPrevious, LookIn:=xlFormulas).Column
Mais pour cela il faudrait un fichier test plus représentatif et non un fichier "vide".
Enfin, toujours commencer vos macros avec :
Code:
Application.ScreenUpdating = False
qui fige l'affichage et donc accélère grandement les processus.
En PJ un essai, juste pour exemple, sur 200 colonnes et 3000 lignes.
 

Pièces jointes

  • Modèle.xlsm
    313.1 KB · Affichages: 3
Dernière édition:

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour @sylvanu ,

Il me semble que End() ne tient pas compte des colonnes masquées en bout de ligne (ni des lignes masquées en bout de colonne non plus).

Si les colonnes utilisées sont 1 à 3 000 et si les colonne 2 001 à 3 000 sont masquées alors
DernièreColonne = Cells(1, Columns.Count).End(xlToLeft).Column retournera 2 000
et non 3 000 (idem pour les lignes).

Un majorant du nombre de colonne est :
DernièreColonne = ActiveSheet.UsedRange.Column + ActiveSheet.UsedRange.Columns.Count - 1

nota : remplacer ActiveSheet par la feuille concernée.
 

Nicolas JACQUIN

XLDnaute Impliqué
Supporter XLD
Bonjour les amis, j'ai vu toutes vos explications et du coup oui j'ai réduit le nombre recherché et du coup c'est instantané

VB:
Public Function colonne()
    Dim ws As Worksheet
    Dim i As Long
    Dim MaxColumns As Long
    MaxColumns = 500
    colonne = 0
    For Each ws In ActiveWorkbook.Worksheets
        For i = 1 To MaxColumns
            If ws.Columns(i).Hidden Then
                colonne = colonne + 1
            End If
        Next i
    Next ws
End Function

Public Function ligne()
    Dim ws As Worksheet
    Dim i As Long
    Dim MaxRows As Long
    MaxRows = 5000
    ligne = 0
    For Each ws In ActiveWorkbook.Worksheets
        For i = 1 To MaxRows
            If ws.Rows(i).Hidden Then
                ligne = ligne + 1
            End If
        Next i
    Next ws
End Function

Merci à tous
 
Dernière édition:

Discussions similaires

Réponses
5
Affichages
323
Réponses
10
Affichages
303

Statistiques des forums

Discussions
315 080
Messages
2 116 024
Membres
112 637
dernier inscrit
pseudoinconnu