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
 

Nicolas JACQUIN

XLDnaute Impliqué
Supporter XLD
Testez ça :
VB:
Sub Test()
   Dim Rng As Range, RngVis As Range
   Set Rng = ActiveSheet.UsedRange
   Set RngVis = Rng.SpecialCells(Type:=xlCellTypeVisible)
   MsgBox Rng.Rows.Count - RngVis.Rows.Count & " ligne(s) masquée(s), " _
      & Rng.Columns.Count - RngVis.Columns.Count & " colonne(s) masquée(s).", _
      vbInformation, "Test"
   End Sub

Ca match bien comment je peut l'adapter à ce que j'ai poster en post14, merci, je suis perdu un peu
 

patricktoulon

XLDnaute Barbatruc
donc je resume
tu veux une progressbar pour compter des ligne et ou colonnes vide
tu veux cela par ce que des fois c'est long
ok
mais a ajouter une progressbar tu va rallonger le temps forcement
c'est absurde
comme je te l'ai dit avec specialcell tu l'a tout de suite
comment faut il faire ?:
en premier déterminer la plage qui va partir de A1 à la dernière cells du usedrange
ensuite demander le speciallcell xlcelltypevisible de la plage .rows(1 )et soustraire au count
(on obtient les colonnes)
ensuite faire pareil pour les lignes le speciallcell xlcelltypevisible de la plage .columns(1 )et soustraire au count
(on obtient les lignes )
tu veux un vumètre ?
ben fait toi en 1 2 labels dans userform le prorata est facile a calculer non ?
et pas besoins de boucler tu a un visuel graphique sur le prorata immédiatement
démonstration
en rouge c'est les masquées en vert les visibles
demo1.gif

voila 2500 ligne sur 200 colonne c'est instantané
alors pourquoi tu va t'ennuyer a compter ?
c'est absurde

le code du userform
VB:
Private Sub UserForm_Activate()
    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


    Set lescolumns = plage.Rows(1).SpecialCells(xlCellTypeVisible)
    nbcol = plage.Columns.Count - lescolumns.Cells.Count

    Set lesRows = plage.Columns(1).SpecialCells(xlCellTypeVisible)
    nbrow = plage.Rows.Count - lesRows.Cells.Count

    BB1.Width = (FF1.Width / plage.Rows.Count) * nbrow
    BB2.Width = (FF1.Width / plage.Columns.Count) * nbcol

    c1 = nbrow & " lignes masquées sur " & plage.Rows.Count
    c2 = nbcol & " colonnes masquées sur " & plage.Columns.Count
End Sub
j'ai inventé le HiddenOmètre
diabolo.gif
 

Dranreb

XLDnaute Barbatruc
Vérifier quand même s'il n'y aurait pas de problème si, pour y compter les colonnes, la ligne 1 était masquée. Pareil pour compter les lignes si la colonne 1 était masquée
Si c'était le cas il faudrait prendre la première ligne du 1er Areas
 

Nicolas JACQUIN

XLDnaute Impliqué
Supporter XLD
Patrick,
je sais pas si tu as compris ma demande, le but de ma progress barre, est de l'afficher le temps du calcul du nombre de lignes vides et de la réafficher le temps du calcul des colonnes vides, pas de faire un graphe du nombre de chaques.
Le code de Dranreb fonctionne bien, le truc c'est de l'adapter à mon projet,
plaise ou ne ne déplaise.
 

patricktoulon

XLDnaute Barbatruc
Après quelques tests, non, mon code ne marchait pas si bien.
re
@Dranreb oui je sais pour les raisons que tu a cité pour moi je pense en fait il faut prendre une ligne(visible et une colonne(visible) redimensionnée comme je l'ai cité plus haut (au usedrange )mais en partant de A1

@Nicolas JACQUIN

c'est toi qui a pas compris
j'ai fais ça pour m'amuser mais ton truc n'a pas de sens
nombre de lignes vides et de la réafficher le temps du calcul des colonnes vides, pas de faire un graphe du nombre de chaques.
activesheet.columns.hidden=false(instantané)
activesheet.rows.hidden=false(instantané)

alors dis mois pourquoi ou quel est l'intérêt de faire ça avec une boucle et en plus la rallentir avec le repaint de controls dans un userform
ABSURDE !!!!

tu serais du genre a prendre ta trottinette pour faire toulon/ brest toi
et la ferrari pour aller chercher ta baguette au boulanger en bas de chez toi
 

Dranreb

XLDnaute Barbatruc
Chez moi le .Rows.Cont d'un range disjoint ne rend que le nombre de ligne de l'Areas(1).
J'ai du faire comme ça finalement :
VB:
Sub Test()
   Dim Rng As Range, RngVis As Range, Z As Range, NbLVis As Long, NbCVis As Integer
   Set Rng = ActiveSheet.UsedRange
   Set RngVis = Rng.SpecialCells(Type:=xlCellTypeVisible)
   For Each Z In Intersect(RngVis.Areas(1).Columns(1).EntireColumn, RngVis).Areas
      NbLVis = NbLVis + Z.Rows.Count: Next Z
   For Each Z In Intersect(RngVis.Areas(1).Rows(1).EntireRow, RngVis).Areas
      NbCVis = NbCVis + Z.Columns.Count: Next Z
   MsgBox Rng.Rows.Count - NbLVis & " ligne(s) masquée(s), " _
      & Rng.Columns.Count - NbCVis & " colonne(s) masquée(s).", _
      vbInformation, "Test"
   End Sub
 

Dranreb

XLDnaute Barbatruc
Apprenez à adapter bon sang ! Serait ce plus simple en le mettant sous forme de fonctions ? :
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, Z As Range, NbVis As Long
   Set RngVis = Rng.SpecialCells(Type:=xlCellTypeVisible)
   For Each Z In Intersect(RngVis.Areas(1).Columns(1).EntireColumn, RngVis).Areas
      NbVis = NbVis + Z.Rows.Count: Next Z
   NbLigMsq = Rng.Rows.Count - NbVis
   End Function
Function NbColMsq(ByVal Rng As Range) As Long
   Dim RngVis As Range, Z As Range, NbVis As Long
   Set RngVis = Rng.SpecialCells(Type:=xlCellTypeVisible)
   For Each Z In Intersect(RngVis.Areas(1).Rows(1).EntireRow, RngVis).Areas
      NbVis = NbVis + Z.Columns.Count: Next Z
   NbColMsq = Rng.Columns.Count - NbVis
   End Function
 

Dranreb

XLDnaute Barbatruc
@patricktoulon, en ne prenant qu'un colonne non masquée il ne me trouve que le nombre de lignes de la 1ère Area :
VB:
Function NbLigMsq(ByVal Rng As Range) As Long
   Dim RngVis As Range, Z As Range, NbVis As Long
   Set RngVis = Rng.SpecialCells(Type:=xlCellTypeVisible)
   For Each Z In Intersect(RngVis.Areas(1).Columns(1).EntireColumn, RngVis).Areas
      NbVis = NbVis + Z.Rows.Count: Next Z
   MsgBox Intersect(RngVis.Areas(1).Columns(1).EntireColumn, RngVis).Rows.Count & " lignes au lieu de " & NbVis
   NbLigMsq = Rng.Rows.Count - NbVis
   End Function
 

Discussions similaires

Statistiques des forums

Discussions
314 654
Messages
2 111 598
Membres
111 215
dernier inscrit
fateh