Bar de progression

kyasteph

XLDnaute Occasionnel
Bonjour,

j'ai une macro qui fait appel à une userform contenant une barre de progression.
Jusque la aucun probleme,ma macro marche comme je le souhaite;de meme que le userform s'affiche au moment voulu et disparait à la fin de la macro,impeccable.
Cependant pendant l'exécution de ma macro ma barre de progression(à l'interieur du usf) se remplit automatiquement or je souhaite qu'elle progresse en fonction de l'exécution de la macro.
C'est la que je suis bloqué,je ne sais vraiment comment y arriver,je penche la dessus depuis plusieurs jours maintenant.

Merci de m'aider s'il vous plait

voici mon code
Code:
Option Explicit
Dim ProgressIndicator As UserForm1

Sub Rassembler()
'Déclarations, opérations préliminaires...
    Dim Counter As Integer
    Dim RowMax As Integer, ColMax As Integer
    Dim r As Integer, c As Integer
    Dim PctDone As Single
Application.Calculation = xlManual
FiltrerDateRassembler
Application.ScreenUpdating = False
'   Crée une copie du forme dans une variable
    Set ProgressIndicator = New UserForm1
    
'   Affiche Barreprogression dans état modeless
    ProgressIndicator.Show vbModeless
    If TypeName(ActiveSheet) <> "Worksheet" Then
        Unload ProgressIndicator
        Exit Sub
    End If
    Counter = 1
    RowMax = 650
    ColMax = 50
    For r = 1 To RowMax
        For c = 1 To ColMax
            Counter = Counter + 1
        Next c
        PctDone = Counter / (RowMax * ColMax)
        Call UpdateProgress(PctDone)
    Next r
'Feuilles à traiter
Const cF = "JAL_AN/Gestion_Créancier/Gestion_Caisse/Gestion_Banque/JAL_OD"

'Ligne des en-têtes de chaque feuille à traiter
Const cFligneDebut = "11/10/9/11/11"

'Noms des champs à copier
Const cChamps = "N°compte gle/Mois/Date/Libellé/Débit/Crédit"

'Le & remplace ' as long', le $ remplace ' as string'
Dim i&, j&, DebLig&, Finlig&, NumCol, rep&
Dim F, FligneDebut, Champs, NomF$, Sh As Worksheet
Dim rgTitre As Range, rgAcopier As Range, rgBase As Range, rgIci As Range

'Split transforme une chaine de caractères en un tableau de mots à une dimension
'le séparateur de mots est le caractère /
'indice inf du tableau résultant est toujours 0 (jamais 1)
F = Split(cF, "/")                        'tableau des noms des feuilles à traiter
FligneDebut = Split(cFligneDebut, "/")    'Tableau des n° ligne des en-têtes
Champs = Split(cChamps, "/")              'Tableau des champs à copier

'effacer précédent traitement
Sheets("TCD").Activate
ActiveSheet.Unprotect "MDP"
Range("A2:H" & Rows.Count).Clear
Application.ScreenUpdating = False

'lbound(tablo,2) retourne le plus petit indice de la deuxième dimension de tablo
'ubound(tablo,1) retourne le plus grand indice de la première dimension de tablo
'ex: si DIM tablo( 0 to 4, 10 to 29) alors
'lbound(tablo,1)=0, ubound(tablo,1)=4, lbound(tablo,2)=10, ubound(tablo,2)=29
'si on traite la première dimension du tableau, on peut omettre ,1
'lbound(tablo)=0, ubound(tablo)=4
'Quand on ne connait pas à l'avance les bornes des indices d'un tableau, c'est pratique.
'Quand on ne sait plus si SPLIT donne des tableaux à base 0 ou 1, lbound et ubound
'permette de contourner cet oubli.

For i = LBound(F) To UBound(F)
  'Boucle sur les noms de feuilles à traiter
  NomF = F(i): Set Sh = Sheets(NomF)
'on ôte le filtres automatique
  If Sh.AutoFilterMode Then Sh.AutoFilterMode = False
  'n° ligne des en-têtes
  DebLig = FligneDebut(i)
  'recherche de la dernière ligne à copier
  Finlig = Sh.Range("b" & Rows.Count).End(xlUp).Row
  If Finlig > DebLig Then
    'il y a effectivement des données à copier
    'Définir la cellule où copier les champs - on se base sur la colonne C des dates
    Set rgBase = Range("c" & Rows.Count).End(xlUp).Offset(1, -2)
    'définir la zone d'en-tête
    Set rgTitre = Sh.Range(Sh.Cells(DebLig, "a"), Sh.Cells(DebLig, _
        "a").End(xlToRight))
    'rétablir le filtre mais en affichant tout
    Sh.Unprotect "MDP"
    rgTitre.AutoFilter
    For j = LBound(Champs) To UBound(Champs)
      'boucle sur les champs à copier
      'on error resume next permet de continuer l'exécution si le champ cherché
      'ne se trouve pas dans la ligne des titres
      NumCol = 0
      'rechercher le numéro de colonne du champ à copier dans la ligne d'en-têtes
      On Error Resume Next
      NumCol = Application.WorksheetFunction.Match(Champs(j), rgTitre, 0)
      If NumCol > 0 Then
        'le champ a été trouvé (donc son numéro), on copie les données
        Set rgAcopier = Sh.Range(Sh.Cells(DebLig + 1, NumCol), Sh.Cells(Finlig, _
            NumCol))
        Set rgIci = rgBase.Offset(, j)
        rgAcopier.Copy
        rgIci.PasteSpecial xlPasteValues
        rgIci.PasteSpecial xlPasteFormats
      
      ElseIf NomF = "Gestion_Créancier" And Champs(j) = "Débit" Then
        ' le champ à copier est inconnu
        '==> VERRUE 1 : feuille = "Gestion_Créancier" et Champs = "Débit"
        'chercher le champ "Mtant TTC" (on suppose qu'il existe toujours)
        'pas de gestion du cas où il serait inexistant!
        NumCol = Application.WorksheetFunction.Match("Mtant TTC", rgTitre, 0)
        Set rgAcopier = Sh.Range(Sh.Cells(DebLig + 1, NumCol), Sh.Cells(Finlig, _
            NumCol))
        Set rgIci = rgBase.Offset(, j)
        rgAcopier.Copy
        rgIci.PasteSpecial xlPasteValues
        rgIci.PasteSpecial xlPasteFormats
        'chercher le champ "Dt TVA" (on suppose qu'il existe toujours)
        'pas de gestion du cas où il serait inexistant!
        NumCol = Application.WorksheetFunction.Match("Dt TVA", rgTitre, 0)
        Set rgAcopier = Sh.Range(Sh.Cells(DebLig + 1, NumCol), Sh.Cells(Finlig, _
            NumCol))
        Set rgIci = rgBase.Offset(, j)
        rgAcopier.Copy
        rgIci.PasteSpecial Paste:=xlPasteValues, _
            Operation:=xlPasteSpecialOperationSubtract
        
      ElseIf NomF = "Gestion_Créancier" And Champs(j) = "Crédit" Then
        '' le champ à copier est inconnu
        '==> VERRUE 2 : feuille = "Gestion_Créancier" et Champs = "Crédit"
        'chercher le champ "Mtant TTC" (on suppose qu'il existe toujours)
        'pas de gestion du cas où il serait inexistant!
        'on ne fait rien càd on laisse la cellule à vide
      
      Else
        'le champ à recopier n'existe pas et ne fait pas l'objet d'une VERRUE
        'on y met le texte en rouge <Champs> PAS TROUVÉ
        Set rgIci = rgBase.Offset(, j).Resize(Finlig - DebLig)
        rgIci.Value = "Champ <" & Champs(j) & "> PAS TROUVÉ"
        rgIci.Font.Bold = True
        rgIci.Font.Color = RGB(255, 0, 0)
      End If
    Next j
    Set rgIci = rgBase.Offset(, j).Resize(Finlig - DebLig)
    rgIci = NomF
  End If
Next i

Range("a1").CurrentRegionShrinkToFit = False
Range("a1").CurrentRegion.Borders.LineStyle = xlContinuous
Range("a1").CurrentRegion.FormatConditions.Delete
Range("a1").Resize(, UBound(Champs) - LBound(Champs) + 1).Value = Champs
Range("a1").Offset(, UBound(Champs) - LBound(Champs) + 1) = "Code JAL"
'déplacement de la dernière colonne de TCD (Code JAL) avant la colonne B
Columns(UBound(Champs) - LBound(Champs) + 2).Cut
Columns("B:B").Insert Shift:=xlToRight
Range("a1").CurrentRegion.EntireColumn.AutoFit
Range("a1").CurrentRegion.Rows(1).Interior.Color = RGB(200, 200, 200)

'VERRUE:  Suppression des lignes où N°compte gle est à vide
Set rgAcopier = Nothing
On Error Resume Next
Set rgAcopier = _
    Range("a1").CurrentRegion.Offset(1).Columns(1).SpecialCells(xlCellTypeBlanks)
On Error GoTo 0
If Not rgAcopier Is Nothing Then
  'il y a des cellules vide, on supprime leur ligne
  rgAcopier.EntireRow.Delete
End If

'Création COLONNE Intitulé
    Range("H1") = "Intitulé"
    Range("H2").Select
    ActiveCell.FormulaR1C1 = "=IF(ISBLANK(RC[-7]),"""",CONCATENATE(RC[-7],"" - "",(LOOKUP(RC[-7],COMPTES,INTITULE_COMPTES))))"
    Selection.Copy
    Range("H3:H" & ActiveSheet.UsedRange.Rows.Count).Select
    Selection.PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone, _
        SkipBlanks:=False, Transpose:=False
    Application.CutCopyMode = False
    Range("H1").CurrentRegion.EntireColumn.AutoFit
    
'RANGER par N° de compte du plus petit au plus grand
Range("A1:J1").Select
    Selection.AutoFilter
    ActiveWorkbook.Worksheets("TCD").AutoFilter.Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("TCD").AutoFilter.Sort.SortFields.Add Key:=Range( _
        "D1"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
        xlSortNormal
    With ActiveWorkbook.Worksheets("TCD").AutoFilter.Sort
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    
'Création COLONNE Solde Débit.
    Range("I1") = "Solde Débit."
    Range("I2").Select
    ActiveCell.FormulaR1C1 = _
        "=IF(SUMPRODUCT((R2C[-8]:RC[-8]=RC[-8])*(R2C[-3]:RC[-3]-R2C[-2]:RC[-2]))>0,SUMPRODUCT((R2C[-8]:RC[-8]=RC[-8])*(R2C[-3]:RC[-3]-R2C[-2]:RC[-2])),0)"
    Selection.Copy
    Range("I2:I" & ActiveSheet.UsedRange.Rows.Count).Select
    Selection.PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone, _
        SkipBlanks:=False, Transpose:=False
    Application.CutCopyMode = False
    Range("I1").CurrentRegion.EntireColumn.AutoFit
    
'Création COLONNE Solde Crédit.
    Range("J1") = "Solde Crédit."
    Range("J2").Select
    ActiveCell.FormulaR1C1 = _
        "=IF(SUMPRODUCT((R2C[-9]:RC[-9]=RC[-9])*(R2C[-4]:RC[-4]-R2C[-3]:RC[-3]))<0,SUMPRODUCT((R2C[-9]:RC[-9]=RC[-9])*(R2C[-3]:RC[-3]-R2C[-4]:RC[-4])),0)"
    Selection.Copy
    Range("J2:J" & ActiveSheet.UsedRange.Rows.Count).Select
    Selection.PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone, _
        SkipBlanks:=False, Transpose:=False
    Application.CutCopyMode = False
    Range("J1").CurrentRegion.EntireColumn.AutoFit
    
    Range("A1:J1").Select
    Selection.AutoFilter

Range("a1").Select
Application.ScreenUpdating = True
ActiveSheet.Protect "MDP"
For i = LBound(F) To UBound(F)
  'Boucle sur les noms de feuilles à traiter
  NomF = F(i): Set Sh = Sheets(NomF)
  'On reprotege les feuilles déprotégées
Sh.Protect "MDP"
Next
    Unload ProgressIndicator
    Set ProgressIndicator = Nothing
Sheets("Grand_Livre").Select
Application.ScreenUpdating = True
Application.Calculation = xlAutomatic
End Sub

Code:
Sub UpdateProgress(pct)
    With ProgressIndicator
        .FrameProgress.Caption = Format(pct, "0%")
        .LabelProgress.Width = pct * (.FrameProgress _
           .Width - 10)
    End With
'   L'instruction DoEvents est responsable fde la mise à jour de l'Userform
    DoEvents
End Sub
 

excfl

XLDnaute Barbatruc
Re : Bar de progression

Bonjour à tous,

Il y a le bar : ou le bar :
2dahvmh.gif


30w9if4.gif


et la barre de progression :

1089sfn.gif


excfl
 
Dernière édition:

Paf

XLDnaute Barbatruc
Re : Bar de progression

Bonjour à tous

Pas sûr d'avoir tout compris et pas facile sans PJ pour faire des tests !!

Sub UpdateProgress(pct) n'est appelé qu'une seule fois en début de Sub Rassembler() la barre de progression ne sera donc mise à jour qu'une fois.

dans un code présentant une seule boucle il est facile de mettre à jour une barre de progression en modifiant sa valeur dans chaque itération.

Dans un code comme celui de Sub Rassembler(), il faudrait peut-être le découper en phases où l'on peut estimer l'avancement (boucles ...):
par exemple:
'Boucle sur les noms de feuilles à traiter
'Création des COLONNES
' protege les feuilles déprotégées
....

et pour chaque phase appeler une sub pour afficher le titre du traitement en cours et une autre (la même?) à chaque itération pour mise à jour de la barre de progression

A+
 

kyasteph

XLDnaute Occasionnel
Re : Bar de progression

Bonjour,
Ma bar de progression se remplit d'un trait de seconde en passant de 0% à 100% automaiquement.
Je ne sais si c'est ce que veut dire excfi:"Le bar reste bien vide....." en tout cas je ne sais comment le remplir.
Ce que je voudrais c'est que ma bar se remplisse en fonction de l'exécution de ma macro en partant de 0% à 100%.

Merci de m'aider svp.
 

VIARD

XLDnaute Impliqué
Re : Bar de progression

Bonjour Kyasteph, Excfl, Paf, MJ13, Roland_M et à toutes et tous

Voici quelques barres de progression.
Il faut que la barre soit intimement liée au code en question.

salutation

Jean-Paul
 

Pièces jointes

  • BarresProgression.xls
    47.5 KB · Affichages: 60

kyasteph

XLDnaute Occasionnel
Re : Bar de progression

Bonjour à tous,
Merci pour toutes vos explications mais j'avoue que je ne m'en sors toujours pas;c'est pourquoi je vous envoie un fichier joint(la macro a été juste simplifiée).
Vous trouverez la macro en exécutant le bouton commande dans la feuille "TCD".
Merci de m'aider svp.
 

Pièces jointes

  • ProgresBar.zip
    627.4 KB · Affichages: 58

Roland_M

XLDnaute Barbatruc
Re : Bar de progression

re

pour les barres de progression, le plus simple c'est de servir de Statusbar !
voici un code on ne peut plus simple !
 

Pièces jointes

  • BarreProgress1.xls
    32 KB · Affichages: 54
  • BarreProgress1.xls
    32 KB · Affichages: 57
  • BarreProgress1.xls
    32 KB · Affichages: 48

Roland_M

XLDnaute Barbatruc
Re : Bar de progression

re

voir avec cet essai dans ton classeur !
mais pour moi une barre ne sert à rien si ce n'est de ralentir le travail !
il faut avoir beaucoup de données à traiter !
 

Pièces jointes

  • Copie de ProgresBar.zip
    625.6 KB · Affichages: 59

Dranreb

XLDnaute Barbatruc
Re : Bar de progression

Bonjour.

Si ça vous intéresse j'ai un joli petit Userform qui affiche une barre de taux d'activité par seconde, une barre de progression, le pourcentage effectué, l'heure de fin prévue estimée et enfin la durée restante estimée. Il y a aussi un module qui le pilote. Il est muni d'une Sub Tâche où on indique le nombre de passages prévus et une Sub OùÇaEnEst à exécuter impérativement autant de fois que ce nombre, donc à la fin de la boucle la plus interne, comme ça aurait dû être aussi le cas pour votre procédure UpdateProgress qui joue le même rôle. En revanche contrairement à celle ci, OùÇaEnEst rend la main presque aussitôt le plus souvent: il ne rectifie l'affichage que tous les quarts de seconde au maximum, et ne ralentit donc guère les traitements ou il est appelé un grand nombre de fois. Il convient toutefois de ne songer à l'utiliser qu'après avoir mis tout en œuvre pour faire en sorte de ne pas en avoir besoin, ce qui est rarement le cas.
 
Dernière édition:

kyasteph

XLDnaute Occasionnel
Re : Bar de progression

Bonjour,
Merci à tous pour vos differentes contributions.Roland merci pour les differents sites,j'ai pu enfin trouver quelque chose qui correspond à ce que je veux.
je joins une piece jointe.(Macro "Attente").En tout cas ça répond à ce que je veux;je vais maintenant l'améliorer pour qu'il soit parfait...
Encore une fois merci à tous;vous etes formidables;longue vie au forum
 

Pièces jointes

  • ProgresBar1.zip
    639.9 KB · Affichages: 53

Discussions similaires

Réponses
14
Affichages
641

Statistiques des forums

Discussions
312 169
Messages
2 085 909
Membres
103 031
dernier inscrit
Karmeliet69