Probleme sur une barre de progression [Résolu]

cco86260 166 Messages postés dimanche 22 janvier 2012Date d'inscription 30 juillet 2015 Dernière intervention - 4 sept. 2014 à 13:31 - Dernière réponse : cco86260 166 Messages postés dimanche 22 janvier 2012Date d'inscription 30 juillet 2015 Dernière intervention
- 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

--
Afficher la suite 

Votre réponse

14 réponses

cs_MPi 3869 Messages postés mardi 19 mars 2002Date d'inscription 25 mai 2018 Dernière intervention - 4 sept. 2014 à 14:35
0
Merci
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


Commenter la réponse de cs_MPi
jordane45 21413 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 19 juin 2018 Dernière intervention - Modifié par jordane45 le 4/09/2014 à 17:34
0
Merci
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
Commenter la réponse de jordane45
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 11 avril 2018 Dernière intervention - 4 sept. 2014 à 17:30
0
Merci
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
Commenter la réponse de ucfoutu
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 11 avril 2018 Dernière intervention - 4 sept. 2014 à 19:03
0
Merci
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.
Commenter la réponse de ucfoutu
cco86260 166 Messages postés dimanche 22 janvier 2012Date d'inscription 30 juillet 2015 Dernière intervention - 4 sept. 2014 à 19:16
0
Merci
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

--
Commenter la réponse de cco86260
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 11 avril 2018 Dernière intervention - 5 sept. 2014 à 10:41
0
Merci
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)
Commenter la réponse de ucfoutu
cco86260 166 Messages postés dimanche 22 janvier 2012Date d'inscription 30 juillet 2015 Dernière intervention - 5 sept. 2014 à 11:23
0
Merci
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

--
jordane45 21413 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 19 juin 2018 Dernière intervention - 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....
cco86260 166 Messages postés dimanche 22 janvier 2012Date d'inscription 30 juillet 2015 Dernière intervention - 5 sept. 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... ;)
jordane45 21413 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 19 juin 2018 Dernière intervention - 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.
cco86260 166 Messages postés dimanche 22 janvier 2012Date d'inscription 30 juillet 2015 Dernière intervention - 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
Commenter la réponse de cco86260
cco86260 166 Messages postés dimanche 22 janvier 2012Date d'inscription 30 juillet 2015 Dernière intervention - 9 sept. 2014 à 08:01
0
Merci
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
jordane45 21413 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 19 juin 2018 Dernière intervention - 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....
cco86260 166 Messages postés dimanche 22 janvier 2012Date d'inscription 30 juillet 2015 Dernière intervention - 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
Commenter la réponse de cco86260

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.