IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Progressbar dans boucle = Erreur 380 [XL-2016]


Sujet :

Macros et VBA Excel

  1. #1
    Membre actif
    Homme Profil pro
    Chargé d'études RH
    Inscrit en
    Août 2014
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chargé d'études RH
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2014
    Messages : 162
    Points : 207
    Points
    207
    Par défaut Progressbar dans boucle = Erreur 380
    Bonjour,

    La macro suivante modifie les valeurs de plus de 800 cellules. Le temps d'attente est assez long et je souhaite afficher une progressbar pour faire patienter l'utilisateur.

    J'obtiens une erreur 380 "Invalid property value" sur la première ligne " UserForm_demo.ProgressBar1.Value = UserForm_demo.ProgressBar1.Value + 1 "

    Je dois surement faire une grosse connerie dans la propriété ".max" de la progressbar, mais je n'arrive pas à voir où ça cloche

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    Sub test()
    UserForm_demo.Repaint
        x = Application.WorksheetFunction.CountA(Union(Sheets("Import_PSG").Range("D:E"), Sheets("Import_PSG").Range("G:H")))  'un chiffre représentant le nombre de cellules à parcourir. Entre 800 et 1000 cellules
        UserForm_demo.ProgressBar1.Min = 0
        UserForm_demo.ProgressBar1.Max = x + 2
     
        For Each Cell In Range("G:G")
            If Cell = "text1" Then Cell = "A"
            If Cell = "text2" Then Cell = "B"
            If Cell = "text3" Then Cell = "C"
            If Cell = "text4" Then Cell = "D"
            If Cell = "text5" Then Cell = "E"
        UserForm_demo.ProgressBar1.Value = UserForm_demo.ProgressBar1.Value + 1
        Next Cell
        For Each Cell In Range("H:H")
            If Cell = "text11" Then Cell = "A"
            If Cell = "text12" Then Cell = "B"
            If Cell = "text13" Then Cell = "C"
        UserForm_demo.ProgressBar1 = UserForm_demo.ProgressBar1 + 1
        Next Cell
        For Each Cell In Range("E:E")
            If Cell = "text21" Then Cell = "A"
            If Cell = "text22" Then Cell = "B"
            If Cell = "text23" Then Cell = "C"
            If Cell = "text24" Then Cell = "D"
            If Cell = "text25" Then Cell = "E"
        UserForm_demo.ProgressBar1 = UserForm_demo.ProgressBar1 + 1
        Next Cell
        For Each Cell In Range("D:D")
            If Cell = "text31" Then Cell = "A"
            If Cell = "text32" Then Cell = "B"
            If Cell = "text33" Then Cell = "B"
            If Cell = "text34" Then Cell = "C"
            If Cell = "text35" Then Cell = "D"
            If Cell = "text36" Then Cell = "E"
        UserForm_demo.ProgressBar1 = UserForm_demo.ProgressBar1 + 1
        Next Cell
     
    End Sub
    Dans l'UserForm_Demo :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Sub UserForm_Activate()
    Me.Repaint
    End Sub
    Private Sub UserForm_Initialize()
    x = Application.WorksheetFunction.CountA(Union(Sheets("feuil1").Range("D:E"), Sheets("feuil1").Range("G:H")))
        With Me.ProgressBar1
            .Min = 0
            .Max = x + 2
        End With
        Me.Repaint
    End Sub
    Merci d'avance pour votre aide !

  2. #2
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 433
    Points
    12 433
    Par défaut
    Bonjour
    Vas-tu te sentir cette fois-ci encore offensé et me traiter de "condescendant" si je te fais remarquer que la méthode CountA ne compte que les cellules non vides et que tu incrémentes la valeur de ta progressbar dans tes boucles quel que puisse être le contenu des cellules (y compris vides) parcourues ?
    Ton Max est très vite dépassé, à un tel compte ...

  3. #3
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    UserForm_demo.Repaint
        For Each Cell In Range("G:G")                                 'Max .Rows.Count * 1
               UserForm_demo.ProgressBar1.Value = UserForm_demo.ProgressBar1.Value + 1
        Next Cell
        For Each Cell In Range("H:H")                                 'Max .Rows.Count * 2
               UserForm_demo.ProgressBar1 = UserForm_demo.ProgressBar1 + 1
        Next Cell
        For Each Cell In Range("E:E")                                 'Max .Rows.Count * 3
               UserForm_demo.ProgressBar1 = UserForm_demo.ProgressBar1 + 1
        Next Cell
        For Each Cell In Range("D:D")                                 'Max .Rows.Count * 4
             UserForm_demo.ProgressBar1 = UserForm_demo.ProgressBar1 + 1
        Next Cell
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    With Me.ProgressBar1
            .Min = 0
            .Max = (Sheets("feuil1").UsedRange.Rows.Count * 4) + 2              'Ou {Range("G:G")} 1048576
        End With

  4. #4
    Membre actif
    Homme Profil pro
    Chargé d'études RH
    Inscrit en
    Août 2014
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chargé d'études RH
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2014
    Messages : 162
    Points : 207
    Points
    207
    Par défaut
    Unparia,
    Merci de m'aider encore sur un nouveau sujet.

    La rancune ne fait pas partie de mes défauts, ce qui ne veut pas dire que je n'ai pas de mémoire.

    En effet, j'ai ce souci sur le max. Si je résume mon besoin : Je dois dire à Excel "Pour chaque cellule dans les cellules non vides des colonnes D, E, G et H..." n'est ce pas ?
    J'ai aussi réfléchi à une autre façon de modifier mes données avec la boucle suivante, qui me plait plus que la précédente.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
        For Each Cell In Union(Sheets("Feuil1").Range("D:E"), Sheets("Feuil1").Range("G:H"))
            If Cell = "Text1"= "A"
            If Cell = "Text11" Then Cell = "A"
            If Cell = "Text2"= "B"
            If Cell = "Text12"= "B"
            If Cell = "Text22" Then Cell = "B"
            If Cell = "Text3" Then Cell = "C"
            If Cell = "Text13" Then Cell = "C"
            If Cell = "Text4" Then Cell = "D"
            If Cell = "Text14" Then Cell = "D"
            If Cell = "Text5" Then Cell = "E"
            If Cell = "Text15" Then Cell = "E"
            If Cell = "Text25" Then Cell = "E"
        Next Cell
    Merci pour ton code rdurupt, je vais tester ça et je reviens pour dire ce qu'il en est

  5. #5
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 433
    Points
    12 433
    Par défaut
    Merci pour ton code rdurupt, je vais tester ça et je reviens pour dire ce qu'il en est
    Je crois bien que tu n'as pas compris le sens de l'intervention de rdurupt ...

    A rdurupt : il sera (avec 2016) en outre en erreur dès qu'il atteindra le rang suivant celui de la limite d'un integer. Et ce : dès la toute première colonne. Bien évidemment.
    Amitiés

  6. #6
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    Dim titre As String
    titre = Me.Caption
    ProgressBar1.Value = 0
    ProgressBar1.Max = Cells(Cells.Rows.Count, "G").End(xlUp).Count
    Me.Caption = titre & " : Toto"
    For Each Cell In Range("G2", Cells(Cells.Rows.Count, "G").End(xlUp))                         
        ProgressBar1.Value = Me.ProgressBar1.Value + 1
    Next Cell
    ProgressBar1.Value = 0
    ProgressBar1.Max = Cells(Cells.Rows.Count, "H").End(xlUp).Count
    Me.Caption = titre & " : Titi"
    For Each Cell In Range("H2", Cells(Cells.Rows.Count, "H").End(xlUp))
        ProgressBar1 = UserForm_demo.ProgressBar1 + 1
    Next Cell
    ProgressBar1.Value = 0
    ProgressBar1.Max = Cells(Cells.Rows.Count, "E").End(xlUp).Count
    Me.Caption = titre & " : Tutu"
    For Each Cell In Range("E2", Cells(Cells.Rows.Count, "E").End(xlUp))
        ProgressBar1 = UserForm_demo.ProgressBar1 + 1
    Next Cell
    ProgressBar1.Value = 0
    ProgressBar1.Max = Cells(Cells.Rows.Count, "D").End(xlUp).Count
    Me.Caption = titre & " : Riri"
    For Each Cell In Range("D2", Cells(Cells.Rows.Count, "D").End(xlUp))
        ProgressBar1 = UserForm_demo.ProgressBar1 + 1
    Next Cell
    Me.Caption = titre

  7. #7
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 433
    Points
    12 433
    Par défaut
    A rdurupt :
    en croisant les doigts pour que la dernière cellule remplie de chacune de ces colonnes ne soit d'un rang > 32.767

    EDIT : il serait probablement bien avisé de ne faire avancer la valeur que toutes les x cellules traitées, x se calculant alors à partir (et non par) de la division entière du countA total par 32.767

  8. #8
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par unparia Voir le message
    A rdurupt :
    en croisant les doigts pour que la dernière cellule remplie de chacune de ces colonnes ne soit d'un rang > 32.767

    EDIT : il serait probablement bien avisé de ne faire avancer la valeur que toutes les x cellules traitées, x se calculant alors à partir (et non par) de la division entière du countA total par 32.767
    j’avoue!

  9. #9
    Membre actif
    Homme Profil pro
    Chargé d'études RH
    Inscrit en
    Août 2014
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chargé d'études RH
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2014
    Messages : 162
    Points : 207
    Points
    207
    Par défaut
    Unparia, s'il te plait, même s'il te faut peu de temps pour tirer sur l'ambulance, ne pervertis pas rdurupt.

    rdurupt,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
     Sub test()
        UserForm_demo.Repaint
        titre = UserForm_demo.Caption
        UserForm_demo.ProgressBar1.Value = 0
        UserForm_demo.ProgressBar1.Max = Sheets("Feuil1").Cells(Columns(7).Cells.Count, 1).End(xlUp).Row
        UserForm_demo.Caption = titre & " : Toto"
        For Each Cell In Range("G2", Cells(Cells.Rows.Count, "G").End(xlUp))
                If Cell = "txt1" Then Cell = "A"
                If Cell = "txt2" Then Cell = "B"
                If Cell = "txt3" Then Cell = "C"
                If Cell = "txt10" Then Cell = "D"
                If Cell = "txt5" Then Cell = "E"
            UserForm_demo.ProgressBar1.Value = UserForm_demo.ProgressBar1.Value + 1
        Next Cell
        UserForm_demo.ProgressBar1.Value = 0
        UserForm_demo.ProgressBar1.Max = Sheets("Feuil1").Cells(Columns(8).Cells.Count, 1).End(xlUp).Row
        UserForm_demo.Caption = titre & " : Titi"
        For Each Cell In Range("H2", Cells(Cells.Rows.Count, "H").End(xlUp))
                If Cell = "Txt6" Then Cell = "A"
                If Cell = "Txt7" Then Cell = "B"
                If Cell = "Txt8" Then Cell = "C"
            UserForm_demo.ProgressBar1 = UserForm_demo.ProgressBar1 + 1
        Next Cell
        UserForm_demo.ProgressBar1.Value = 0
        UserForm_demo.ProgressBar1.Max = Sheets("Feuil1").Cells(Columns(5).Cells.Count, 1).End(xlUp).Row
        UserForm_demo.Caption = titre & " : Tutu"
        For Each Cell In Range("E2", Cells(Cells.Rows.Count, "E").End(xlUp))
                If Cell = "txt1" Then Cell = "A"
                If Cell = "txt2" Then Cell = "B"
                If Cell = "txt3" Then Cell = "C"
                If Cell = "txt4" Then Cell = "D"
                If Cell = "txt5" Then Cell = "E"
            UserForm_demo.ProgressBar1 = UserForm_demo.ProgressBar1 + 1
        Next Cell
        UserForm_demo.ProgressBar1.Value = 0
        UserForm_demo.ProgressBar1.Max = Sheets("Feuil1").Cells(Columns(4).Cells.Count, 1).End(xlUp).Row
        UserForm_demo.Caption = titre & " : Riri"
        For Each Cell In Range("D2", Cells(Cells.Rows.Count, "D").End(xlUp))
                If Cell = "txt1" Then Cell = "A"
                If Cell = "txt9" Then Cell = "B"
                If Cell = "txt2" Then Cell = "B"
                If Cell = "txt3" Then Cell = "C"
                If Cell = "txt10" Then Cell = "D"
                If Cell = "txt4" Then Cell = "D"
                If Cell = "Not mastered yet" Then Cell = "E"
            UserForm_demo.ProgressBar1 = UserForm_demo.ProgressBar1 + 1
        Next Cell
        UserForm_demo.Caption = titre
        ThisWorkbook.Save
        Unload UserForm_demo
     End Sub

  10. #10
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 433
    Points
    12 433
    Par défaut
    Unparia, s'il te plait, même s'il te faut peu de temps pour tirer sur l'ambulance, ne pervertis pas rdurupt.
    Ah !
    Je maintiens que ce code ne causera aucun problème si la dernière cellule remplie de chaque colonne ne dépasse pas le rang 32.767, mais plantera ton code si l'une seule dépasse ce rang.
    Si tu appelles cela "tirer sur l'ambulance", c'est ton problème.
    Le mien est de ne pas laisser passer (cette discussion sera lue et le code - en outre marqué RESOLU - peut-être copié/collé par d'autres) ce qui peut planter.
    Voilà

  11. #11
    Invité
    Invité(e)
    Par défaut
    Ne t'inquiète pas je suis déjà un grand pervers; peut être vas savoir plus subtile qu'Unparia; mais il te l'a déjà fait remarquer!

    Ceci dit "Toto" c'était pour l'exemple pour tes actions j'espère que tu trouveras un nom plus parlant!


    Et oui le point de 32.767 c'est pas la virgule mais le séparateur de milliers, au delà ta scrolbarre explose en plein vol!

    Ce qui nous ramène au sondage sur ce même forum, peut on faire dz projet professionnel avec VBA!
    Vue qu'il n'est plus maintenu depuis 2003 et que certains contrôles non pas évoluer depuis 1998?
    Dernière modification par Invité ; 14/09/2016 à 19h08.

  12. #12
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 433
    Points
    12 433
    Par défaut
    Que fait ce petit exemple bâclé ? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    ProgressBar1.Min = 0
    With Worksheets("Feuil1")
     .Range("A3") = "coucou"  ' juste pour avoir une grande plage de cellules à traiter
     .Range("G1000000") = "voila"
     .UsedRange
     MsgBox "on va traiter " & .UsedRange.Cells.Count & " cellules"
      ProgressBar1.Max = (.UsedRange.Cells.Count \ 32767) + 1
      nb = 0
      For Each c In .UsedRange.Cells
        nb = nb + 1
        ' ici tes instructions
        If nb = 32767 Then
          ProgressBar1.Value = ProgressBar1.Value + 1
          nb = 0
        End If
      Next
      MsgBox "on a traité " & .UsedRange.Cells.Count & " cellules"
    End With
    En te précisant que les msgbox ne sont ici que pour te "parler".

  13. #13
    Invité
    Invité(e)
    Par défaut
    Personnellement je préfère définir ma propre barre de progression

    http://www.developpez.net/forums/d14...o/#post7957823

  14. #14
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 433
    Points
    12 433
    Par défaut
    Personnellement je préfère définir ma propre barre de progression
    Et tu as tout-à-fait raison de le faire
    Puis-je ajouter qu'une barre de défilement n'a d'utilité réelle que si le nombre d'instructions est très élevé, que le traitement est long et qu'il est nécessaire de "rassurer" l'utilisateur..
    Dans le cas contraire, l'ajout et le traitement d'une barre de défilement ne fait qu'ajouter inutilement des lenteurs.
    Dans le cas présent, par exemple, tout le traitement dont il s'agit s'exécuterait à la vitesse grand V, sans aucune barre de défilement (pour quoi faire, si vitesse grand V ?) par simple utilisation de la méthode Range.Replace.
    Alors : une barre de défilement pour quoi faire ? Pour donner "un look pro" à ce qui finirait par s'écarter du professionnalisme ?
    Il est très rare et rarement justifié qu'une barre de défilement soit nécessaire ...

  15. #15
    Invité
    Invité(e)
    Par défaut
    Oui perso j'opte toujours pour la barre statut avec la tache et le %

    C'est juste une info pour que le type ne tape pas avec la pomme sur le coin de l'écran

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Progressbar dans une boucle
    Par pierrot67 dans le forum Débuter
    Réponses: 3
    Dernier message: 30/03/2011, 11h36
  2. Erreur d'index sur une List<int> dans boucle for
    Par popoliline dans le forum C#
    Réponses: 13
    Dernier message: 16/06/2010, 11h03
  3. Réponses: 12
    Dernier message: 19/09/2007, 15h33
  4. erreur 2015 dans boucle
    Par Daranc dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 12/07/2007, 10h21
  5. [Tableaux] Erreur dans Boucle
    Par mickado dans le forum Langage
    Réponses: 11
    Dernier message: 25/01/2007, 11h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo