XL 2021 Création et adaptation barre de progression

Nicolas JACQUIN

XLDnaute Impliqué
Supporter XLD
Bonjour à tous,
Je finalise mon projet,
Comment créer et adapter une barre de progression sur l'exécution d'un code,
exemple:

VB:
Sub CompterLignesMasquees()
    Dim ws As Worksheet
    Dim ligne As Range
    Dim compteur As Long
  
    ' Définir la feuille de calcul active
    Set ws = ActiveSheet
  
    ' Initialiser le compteur
    compteur = 0
  
    ' Parcourir chaque ligne de la feuille de calcul
    For Each ligne In ws.Rows
        ' Vérifier si la ligne est masquée
        If ligne.Hidden Then
            compteur = compteur + 1
        End If
    Next ligne
  
    ' Afficher le nombre de lignes masquées
    MsgBox "Nombre de lignes masquées : " & compteur
End Sub

et

Code:
Sub CompterColonnesMasquees()
    Dim ws As Worksheet
    Dim col As Range
    Dim compteur As Integer
  
    ' Initialisation
    Set ws = ActiveSheet
    compteur = 0
  
    ' Parcourir chaque colonne de la feuille active
    For Each col In ws.UsedRange.Columns
        ' Vérifier si la colonne est masquée
        If col.EntireColumn.Hidden Then
            compteur = compteur + 1
        End If
    Next col
  
    ' Afficher le nombre de colonnes masquées
    MsgBox "Nombre de colonnes masquées : " & compteur
End Sub

J'ai vu plusieurs choses mais ne sais pas du tout comment adapter, et si le code est le même selon la macro.

Merci à tous
Nicolas
 

patricktoulon

XLDnaute Barbatruc
re

1 déterminer la plage
2 pour les lignes prendre la colonne (x) (la 1ère visible)
prendre le speciallcells(xlcelltypevisible).cells.count et le soustraire au cells.count de la colonne
3 pareil pour les colonnes
prendre la 1ère ligne visible ave speciallcell
soustraire le cells.count du speciallcell(..) .count au .count de la ligne
pour info je n'utilise jamais le rows.count ou columns.count d'un speciallcell(...) ca sera forcement faux
pour la simple raison que le speciallcell va donner x areas mais avant tout 1 ligne ou colonne de début et un de fin et c'est là dessus qu'il va tabler
 

Dranreb

XLDnaute Barbatruc
Effectivement, dans les visibles, en comptant sur une seule colonne les cellules plutôt que les lignes et sur une seule ligne les cellules plutôt que les colonnes ça à l'air de se passer mieux, allez savoir pourquoi …
Donc :
VB:
Sub Test()
   Dim Rng As Range
   Set Rng = ActiveSheet.UsedRange
   MsgBox NbLigMsq(Rng) & " ligne(s) masquée(s), " _
      & NbColMsq(Rng) & " colonne(s) masquée(s).", _
      vbInformation, "Test"
   End Sub
Function NbLigMsq(ByVal Rng As Range) As Long
   Dim RngVis As Range
   Set RngVis = Rng.SpecialCells(Type:=xlCellTypeVisible)
   NbLigMsq = Rng.Rows.Count - Intersect(RngVis.Areas(1).Columns(1).EntireColumn, RngVis).Cells.Count
   End Function
Function NbColMsq(ByVal Rng As Range) As Long
   Dim RngVis As Range
   Set RngVis = Rng.SpecialCells(Type:=xlCellTypeVisible)
   NbColMsq = Rng.Columns.Count - Intersect(RngVis.Areas(1).Rows(1).EntireRow, RngVis).Cells.Count
   End Function
Tant mieux: on évite toute boucle.
 

patricktoulon

XLDnaute Barbatruc
re
tu te tors le cerveau pour rien avec le intersect areas et tout le toutim
VB:
 NbLigMsq = Rng.Rows.Count - Intersect(RngVis.Areas(1).Columns(1).EntireColumn, RngVis).Cells.Count
en compilant le usedrange en partant de A1 le rows.count et columns.count tu l'obtient avec le cells.count
d'ou ma proposition de determinéer la plage avant

1 déterminer la plage
VB:
Dim lesRows As Range, lescolumns As Range, nbcol&, nbrow&
'on dimensionne la plage à observer  de A1 à la dernière cells du usedrange
With ActiveSheet.UsedRange
Set plage = Range(.Parent.Cells(1), .Cells(.Cells.Count))
End With

2 on prend les visible d'une seule ligne
Code:
Set lescolumns = plage.Rows(1).SpecialCells(xlCellTypeVisible)
3 le nombre de cellules correspondra forcement au nombre de colonne
Code:
nbcol = plage.Columns.Count - lescolumns.Cells.Count

pareil pour les lignes mais en transposant la méthode
on prends les cellules visible d'une seule colonne
Code:
Set lesRows = plage.Columns(1).SpecialCells(xlCellTypeVisible)
le nombre de cellules correspondra forcement au nombre de ligne
Code:
nbrow = plage.Rows.Count - lesRows.Cells.Count

résultat
Code:
msgbox nbrow & " lignes masquées sur " & plage.Rows.Count & vbcrlf & _
nbcol & " colonnes masquées sur " & plage.Columns.Count

edit:
et si tu veux savoir quelle ligne ou colonne utiliser c'est simple
c'est la premiere cellule visible donc on a la ligne et colonne
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re:
comme ceci
et c'est limpide même pour un débutant;)
VB:
Sub test()

    Dim lesRows As Range, lescolumns As Range, nbcol&, nbrow&, col, lig&
    'on dimensionne la plage à observer  de A1 à la dernière cells du usedrange
    With ActiveSheet.UsedRange
        Set plage = Range(.Parent.Cells(1), .Cells(.Cells.Count))
    End With

    lig = plage.SpecialCells(xlCellTypeVisible).Cells(1).Row

    col = plage.SpecialCells(xlCellTypeVisible).Cells(1).Column

    Set lescolumns = plage.Rows(lig).SpecialCells(xlCellTypeVisible)

    nbcol = plage.Columns.Count - lescolumns.Cells.Count

    Set lesRows = plage.Columns(col).SpecialCells(xlCellTypeVisible)

    nbrow = plage.Rows.Count - lesRows.Cells.Count

    MsgBox nbrow & " lignes masquées sur " & plage.Rows.Count & vbCrLf & _
                    nbcol & " colonnes masquées sur " & plage.Columns.Count
End Sub
 

patricktoulon

XLDnaute Barbatruc
re
non pas tout à fait
tu utilise intersect , areas , column(x) , entirecolumn , etc...
d'autant plus que comme tu utilise "entirecolumn" ton calcul tu le fait sur la colonne entière
moi je le fais sur le usedrange object du quel tu pars toi même
j'ai volontairement séparé les actions pour expliquer on peut reduire aussi si tu veux
bref le tout c'est que tu a compris la nuance à utiliser column ou rows ou cells avec .count
 

patricktoulon

XLDnaute Barbatruc
re
oui j'avais compris ton principe
ce que je veux dire quand je dis calcul c'est pas le vba ,c'est ce qui ce passe en interne en terme de moulin
tu utilise le intersect de l'areas 1 entirecolumn (donc tout) et tu réduis au visible
mais j'ai rien contre, c'est peut être un peu compliqué pour un néophyte

on c'est bien amusé ;)
 

Discussions similaires

Réponses
7
Affichages
550

Statistiques des forums

Discussions
313 769
Messages
2 102 234
Membres
108 181
dernier inscrit
Chr1sD