Probleme sur une barre de progression

Résolu
cco86260 Messages postés 166 Date d'inscription dimanche 22 janvier 2012 Statut Membre Dernière intervention 30 juillet 2015 - 4 sept. 2014 à 13:31
cco86260 Messages postés 166 Date d'inscription dimanche 22 janvier 2012 Statut Membre Dernière intervention 30 juillet 2015 - 9 sept. 2014 à 18:26
Bonjour a tous,

Donc voilà, je vais commencer par dire que grace à ce forum, j'ai un petit peu progresser dans le VBA, mais voilà, j'ai encore des lacunes... je vous explique :

J'ai créé une barre de progression pour un module de conversion en PDF (code venant de ce site), elle fonctionne parfaitement, sauf que si un seul document est sélectionné, VBA me dit :

Erreur 6 : Dépassement de capacité !

Ce que je crois comprendre a force de chercher, c'est qu'il faut un entier et non une décimale...

Je vous poste mon code pour voir...

Private Sub Cmd_PDF_Click()
Dim i As Byte
Dim nbToGo As Integer
nbToGo = ListBox1.ListCount - 1

Application.ScreenUpdating = False
To_PDF.Height = 225.75

'boucle sur les éléments de la ListBox
compteur = 0
Progression = 0

For i = 0 To ListBox1.ListCount - 1
compteur = compteur + 1
If ListBox1.Selected(i) = True Then
feuil = ListBox1.List(i) 'nom de la feuille
Sheets(feuil).Select
Progression = Progression + 1
image_barre.Width = Int((i / nbToGo) * 100) * 3.34 'c'est la ligne qui est mise en evidence lors du deboguage
Label_barre.Caption = Int((i / nbToGo) * 100) & "%"
DoEvents
'On lance la conversion
ToPdf
End If
Next
Application.ScreenUpdating = True
To_PDF.Height = 249.75

End Sub


Merci de votre aide, passez une agréable journée...
Christian

--

8 réponses

cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 22
4 sept. 2014 à 14:35
Bonjour,

Lors de la première boucle, la variable "i" est = 0
Probablement que la valeur 0 n'est pas acceptée ici...
image_barre.Width = Int((i / nbToGo) * 100) * 3.34


0
jordane45 Messages postés 37739 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 4 octobre 2023 342
Modifié par jordane45 le 4/09/2014 à 17:34
Bonjour,

Si c'est un ProgressBar que tu as utilisé... c'est la VALEUR que tu dois changer.. par sa LARGEUR...

'image_barre.Width = Int((i / nbToGo) * 100) * 3.34
image_barre.value = Int((i / nbToGo) * 100) * 3.34


Si tu veux vraiment modifier la largeur et non la valeur.. dans ce cas...oui..il ne faut que des ENTIERS...
et donc il faut déplacer ta dernière parenthèse :
image_barre.Width = Int((i / nbToGo) * 100 * 3.34)



EDIT : a quoi sert ton " 3.34 " ??
Si c'est un pourcentage de progression.. il ne sert à rien...


Et pour éviter toute division par 0 ... il serait bien de boucler de 1 à NbTogo+1

Avant de poser une question, merci de lire la charte du site.
Cordialement, Jordane
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 212
4 sept. 2014 à 17:30
Bonjour,
le problème est que s'il n'y a qu'un article, NBTOGO = listcount-1 = 0 ===>> division par 0


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviend
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 212
4 sept. 2014 à 19:03
Quant à l'avancement, une simple règle de 3 :
Avancement (qu'il soit une largeur si contrôle personnalisé ou propriété max si progressbar) : pas = maximum/nb total à traiter
valeur ou largeur = pas * nb articles traités.
Il est par ailleurs plus logique d'attendre, pour "avancer", la fin de chaque traitement d'un article et non, comme tu le fais, d'avancer avant le traitement.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cco86260 Messages postés 166 Date d'inscription dimanche 22 janvier 2012 Statut Membre Dernière intervention 30 juillet 2015 2
4 sept. 2014 à 19:16
Salut vous tous :)

Jordane45: comment vas tu? La valeur 3.34 sert pour la largeur de la progressBar, en fait il y a un outil image et dessus un autre outil image contenant justement une image perso (image_barre) ayant pour longueur 334px... donc elle progresse jusqu'à arriver a 334px, c'est donc bien la taille qui change ;) ... Le pourcentage d'avancement c'est la ligne du dessous (Label_barre.Caption).

Donc effectivement, vouloir diviser par zéro est vraiment très C.. , j'ai essayer de passer nbToGo a +1 de 2 manière, les voici :

nbToGo = ListBox1.ListCount - 1
à
nbToGo = ListBox1.ListCount + 1

ça fonctionne pour une feuille, mais du coup, lorsque je veux créer plusieurs rapports, il ne me créer que la dernière de ce que j'ai sélectionné.

Sinon, peut on faire en sorte que la progressBar se lance en fonction du nombre de feuille selectionner ? genre, Si une feuille est sélectionnée il lance directement la conversion sans progressBar, et si 2 ou plus sont sélectionnées alors utilise la progressBar ?

ucfoutu : salut, comment vas? Oui, comme dis plus haut, la division par zéro.... pas terrible comme idées, j'avais omis que NBTOGO = listcount-1 = 0, pas très doué encore...

Merci pour vos aides,

Passez une bonne soirée..

Christian

--
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 212
5 sept. 2014 à 10:41
Tu dois parcourir ta listbox par une boucle
for i = 1 to listbox1.listcount
et considérer dans ta boucle i-1 (qui correspond à l'indice réel)
quant à ton NbToGo, c'est listcount et non listcount-1
(sans préjudice du reste. Relis ce que j'en ai dit plus haut en ce qui concerne le calcul de la largeur ou de la valeur de la progressbar, selon que tu traites une image ou un contrôle ou que tu traites une progressbar)
0
cco86260 Messages postés 166 Date d'inscription dimanche 22 janvier 2012 Statut Membre Dernière intervention 30 juillet 2015 2
5 sept. 2014 à 11:23
Bonjour ucfoutu,

Donc voici ce que j'ai fais (grace à tes remarques), aux autres aussi :

Private Sub Cmd_PDF_Click()
Dim i As Byte
Dim nbToGo As Integer
nbToGo = ListBox1.ListCount

Application.ScreenUpdating = False
To_PDF.Height = 225.75

'boucle sur les éléments de la ListBox
compteur = 0
Progression = 0

For i = 1 To ListBox1.ListCount
compteur = compteur + 1
If ListBox1.Selected(i - 1) = True Then
feuil = ListBox1.List(i - 1) 'nom de la feuille
Sheets(feuil).Select
Progression = Progression + 1
image_barre.Width = Int((i / nbToGo) * 100) * 3.34
Label_barre.Caption = Int((i / nbToGo) * 100) & "%"
DoEvents
'On lance la conversion
ToPdf
End If
Next
Application.ScreenUpdating = True
To_PDF.Height = 249.75

End Sub


Bon je n'ai rien inventé, ça fonctionne, mais :

Voici le déroulement, Je créé mon rapport unique, je le met en PDF, une fois terminé la conversion, je me repositionne sur le classeur, je me dis que j'ai oublié 3 personnes (donc 3 rapport), je clique donc sur mon bouton "Ajouter rapports" mon USF s'ouvre me demandant s'il est unique ou collectif, je clique donc sur collectif vu qu'il y en a 3 identiques, mais il ne m'en met qu'un, par contre, en faisant cette même manip mais sans réaliser de convertion avant, ba il me les ajoute sans problème... aurais à nouveau déconné dans le code ?

Merci de ton aide

Christian

--
0
jordane45 Messages postés 37739 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 4 octobre 2023 342
5 sept. 2014 à 11:35
Bonjour,

Ta question initiale est traitée... il te faut donc mettre cette discussion en RESOLU. (lien se trouvant SOUS le titre de ta question).

Si tu as de nouveaux soucis..il te faut ouvrir une NOUVELLE discussion....
0
cco86260 Messages postés 166 Date d'inscription dimanche 22 janvier 2012 Statut Membre Dernière intervention 30 juillet 2015 2
Modifié par cco86260 le 5/09/2014 à 11:42
Bonjour jordane45,

Traitée en partie... si je remet ce code comme il était (avec sa div par 0) je peux ajouter convertir et tout mais quand je corrige avec vos précieux conseil (que je garde sous le coude) c'est là que ça déconne... bon demi-mal, je vais voir pour faire en sorte qu'une fois le rapport converti il se supprime du classeur... je devrais passer ce problème... je vois ça... et si je dois créer un nouveau poste... je le ferais... je met celui-ci en résolu...pour la forme... ;)
0
jordane45 Messages postés 37739 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 4 octobre 2023 342
5 sept. 2014 à 11:47
Traitée en partie...
Oui... mais Non....
La question était relative à la PROGRESSBAR...

Maintenant, tu rencontre un AUTRE souci sur le fonctionnement de ton appli....
Certes .. ce "nouveau" problème semble lié aux récentes modifications que tu as fait.... mais il n'en reste pas moins que c'est quand même une NOUVELLE question....

Sinon.. imagine...tu poses toutes les questions relatives à ton programme ( ben..c'est lié vu que c'est le même programme....) dans une seule discussion.....
Et là... comment... un internaute cherchant de l'aide sur un thème précis pourrait s'y retrouver si il doit lire 250 posts dans un même sujet ... ???
C'est pour ça que pour CHAQUE question..il est demandé d'ouvrir une nouvelle DISCUSSION.
0
cco86260 Messages postés 166 Date d'inscription dimanche 22 janvier 2012 Statut Membre Dernière intervention 30 juillet 2015 2
5 sept. 2014 à 11:55
En effet, vu comme ça... je ne peux rien dire...lol... bon je vais faire quelques test ce week-end sur mon fichier et je reposterais si nécessaire... et je posterais la solution si je le trouve... ce qui serait pour le moins normal... en attendant merci à tous pour les pistes fournies...

Passez un bon week-end... (en espérant que la météo soit au RDV).

Christian
0
cco86260 Messages postés 166 Date d'inscription dimanche 22 janvier 2012 Statut Membre Dernière intervention 30 juillet 2015 2
9 sept. 2014 à 08:01
Bonjour à tous,

Donc finalement, il n'y aura pas de nouveau post car la solution était vraiment toute bête, la réponse s'est trouvée sous mes yeux au moins mille fois... voici le code :

Private Sub Cmd_PDF_Click()
Dim i As Byte
Dim nbToGo As Integer
nbToGo = ListBox1.ListCount - 1

Application.ScreenUpdating = False
To_PDF.Height = 225.75

'boucle sur les éléments de la ListBox
compteur = 0
Progression = 0

For i = 0 To ListBox1.ListCount - 1
compteur = compteur + 1
If ListBox1.Selected(i) = True Then
feuil = ListBox1.List(i) 'nom de la feuille
Sheets(feuil).Select
Progression = Progression + 1
On Error Resume Next 'Voici la modif... et ça fonctionne
image_barre.Width = Int((i / nbToGo) * 100) * 3.34
Label_barre.Caption = Int((i / nbToGo) * 100) & "%"
DoEvents
'On lance la conversion
ToPdf
End If
Next

Application.ScreenUpdating = True
To_PDF.Height = 249.75

End Sub

En espérant que cela serve à quelqu'un... :)

Bonne continuation à tous,

Christian
0
jordane45 Messages postés 37739 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 4 octobre 2023 342
9 sept. 2014 à 10:19
Bon.. je ne peux pas m'empêcher d'y revenir...

Le
On Error Resume Next 
est à éviter... sauf en cas d'absolu nécessité.. ce qui n'est pas le cas ici....

En imaginant que tu veuilles faire ta barre de progression par rapport au nombre d'éléments dans ta listebox :
Private Sub Cmd_PDF_Click()
 Dim i As Byte
    Dim nbToGo As Integer
    Dim Progression  As Integer

    ' Nombre d'elements dans la liste
    nbToGo = ListBox1.ListCount
    Dim prc As Integer
   
   Application.ScreenUpdating = False
    To_PDF.Height = 225.75

    'boucle sur les éléments de la ListBox
    image_barre.Width = 1
    Progression = 0

        For i = 0 To nbToGo - 1
        Progression = Progression + 1
        prc = Int(Progression / nbToGo * 100)
        Debug.Print "Progression:" & Progression & "  nbToGo:" & nbToGo & "  prc = " & prc
        image_barre.Width = Int((Progression / nbToGo) * 100) * 3.34
        Label_barre.Caption = Int((Progression / nbToGo) * 100) & "%"
          
        If ListBox1.Selected(i) = True Then
            feuil = ListBox1.List(i) 'nom de la feuille
           Sheets(feuil).Select
            DoEvents
             'On lance la conversion
             ToPdf
         End If
        Next
        
    Application.ScreenUpdating = True
    To_PDF.Height = 249.75
    
End Sub


Il aurait été aussi possible de faire ta barre de progression par rapport au nombre d'éléments SELECTIONNES dans ta liste .... ( par contre il faut procéder en DEUX étapes)
Mais là.. ce serait une autre discussion....
0
cco86260 Messages postés 166 Date d'inscription dimanche 22 janvier 2012 Statut Membre Dernière intervention 30 juillet 2015 2
9 sept. 2014 à 18:26
Alors là... je suis mort de rire... mais merci quand même, c'est sympas... je ne connaissais pas la fonction debug.print, j'ai donc chercher sur le net, c'est effectivement une ligne à ne pas manquer...maintenant je vais tacher de mettre des commentaire la dessus pour que par la suite je puisse comprendre...

Merci encore, ;)

Bonne soirée

Christian
0
Rejoignez-nous