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 :

Boucle infinie possible?


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 681
    Par défaut Boucle infinie possible?
    Bonjour,

    Mon responsable a eu un soucis de boucle infini sur un de mes fichiers. Le message de confirmation de sauvegarde ce fesait en boucle (si on choisissait la réponse Yes).
    La macro en cause:
    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
    Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    'se lance automatiquement avant la sauvegarde
    'vérifie que tous les controles sont bon
    'on change la valeur du controle maitre suivant le résultat
    'si il y a un pb, on demande la confirmation de la sauvegarde
    Dim sh As Worksheet, msg As String
    msg = ""
    For Each sh In ThisWorkbook.Sheets
        If verif2(sh) Then msg = msg & "Attention les contrôles de la feuille " & sh.Name & " ne sont pas bons" & Chr(10)
    Next sh
    If Len(msg) > 1 Then
        Range("ctrlM") = "pb"
        MsgBox msg
        Select Case MsgBox("Voulez vous vraiment sauvegarder?", vbYesNo, "Problème(s) détécté(s)")
        Case vbYes
            'procédure si click sur Oui
        Case vbNo
            'procédure si click sur Non
            Cancel = True
    End Select
    Else
        Range("ctrlM") = "ok"
    End If
    End Sub
    Cependant je n'ai pas réussi a reproduire le problème, et je ne comprends pas comment une boucle infini peut être possible avec ce code.
    Si quelqu'un voit une possible boucle infinie dans ce code, je veux bien qu'on m'explique.

    Merci d'avance.

    ps: si besoin le code de verif2
    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
     Function verif2(sh As Worksheet) As Boolean
    'Utilisée dans le BeforeSave, et par la sub test_par_feuille2
    'Vérifie sur la feuille passée en paramètre que les controles sont ok.
    'Renvoie vrai si non.
    Dim test As Boolean
    Dim pln As Name
    Dim cell As Range, ct As Long
     
    test = False
     
    For Each pln In ThisWorkbook.Names
        If pln.Name = "ctrl_" & sh.Index Then 'recherche la plage correspondante a la feuille
            ct = 0
            For Each cell In Range("ctrl_" & sh.Index) 'on compte le nombre de cellules "ok"
                If cell.Text = "ok" Then ct = ct + 1
            Next cell 'on le compare avec le nombre de cellules de la plage
            If Not (ct = Range("ctrl_" & sh.Index).Count) Then test = True
     
        End If
    Next pln
     
    verif2 = test
    End Function

  2. #2
    Membre Expert Avatar de Thautheme
    Homme Profil pro
    salarié
    Inscrit en
    Août 2014
    Messages
    1 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : salarié

    Informations forums :
    Inscription : Août 2014
    Messages : 1 373
    Par défaut
    Bonjour Halaster, bonjour le forum,

    Peut-être déclarer la variable test en première ligne en haut du module : Private test As Boolean...

  3. #3
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par halaster08 Voir le message
    Bonjour Halaster,

    Peut-être en remplaçant Sheets par Worksheets dans cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    For Each sh In ThisWorkbook.Worksheets

  4. #4
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 681
    Par défaut
    Merci de vos réponses.

    Citation Envoyé par Thautheme Voir le message
    Bonjour Halaster, bonjour le forum,

    Peut-être déclarer la variable test en première ligne en haut du module : Private test As Boolean...
    Pourquoi le déclarer en haut du module? c'est juste une variable "temporaire" qui sert dans la fonction et doit être suprimé ensuite, non?
    Quand j'écris: " verif2 = test " vérif2 prend la valeur de test a ce moment là, ce n'est pas un pointeur vers test, si?

    Citation Envoyé par Eric KERGRESSE Voir le message
    Bonjour Halaster,

    Peut-être en remplaçant Sheets par Worksheets dans cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    For Each sh In ThisWorkbook.Worksheets
    Ok je vais essayer.

    Mais en fait ce que je ne comprends pas c'est comment une boucle infinie est possible.
    La boucle sur les sheets est forcément finie.
    De plus c'est le message de confirmation que mon responsable voyait en boucle. donc cette partie la:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Range("ctrlM") = "pb"
        MsgBox msg
        Select Case MsgBox("Voulez vous vraiment sauvegarder?", vbYesNo, "Problème(s) détécté(s)")
        Case vbYes
            'procédure si click sur Oui
        Case vbNo
            'procédure si click sur Non
            Cancel = True
    End Select
    Est-il possible que le "Private Sub Workbook_BeforeSave" se relance lui même?

  5. #5
    Membre Expert
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 817
    Billets dans le blog
    10
    Par défaut
    Bonjour,

    Pour te répondre, il nous faudrait le code de : 'procédure si click sur Oui
    dans :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Select Case MsgBox("Voulez vous vraiment sauvegarder?", vbYesNo, "Problème(s) détécté(s)")
        Case vbYes
            'procédure si click sur Oui
        Case vbNo
            'procédure si click sur Non
            Cancel = True
    End Select

  6. #6
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 681
    Par défaut
    Elle est là.
    Il n'y a rien, si non on empeche la sauvergarde, si oui la sauvegarde se fait

  7. #7
    Membre Expert
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 817
    Billets dans le blog
    10
    Par défaut
    As-tu d'autres procédures événementielles?
    Par exemple un WorkSheet_Change ?

Discussions similaires

  1. [Boucle Infinie] pour un menu
    Par NhyMbuS dans le forum C++
    Réponses: 5
    Dernier message: 20/07/2005, 09h14
  2. symptome de la boucle infinie dans une requete
    Par ouam81 dans le forum Langage SQL
    Réponses: 8
    Dernier message: 27/05/2005, 12h10
  3. Réponses: 15
    Dernier message: 24/05/2005, 08h34
  4. [Socket] Pb de boucle infinie
    Par Myogtha dans le forum Entrée/Sortie
    Réponses: 12
    Dernier message: 10/06/2004, 14h10
  5. [C#] Comment eviter les boucles infinies ?
    Par Thomas Lebrun dans le forum C#
    Réponses: 12
    Dernier message: 09/06/2004, 00h04

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