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
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
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.
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.
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+
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
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 :
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.
Bonjour Mapomme,
Exact, ça m'a échappé.
Par contre la seconde proposition marche correctement, et elle est plus "universelle" car indépendante d'une ligne ou colonne particulière.
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