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 :

MsgBox et alerte


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2018
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2018
    Messages : 141
    Par défaut MsgBox et alerte
    Bonjour,

    J'ai un code qui doit m'informer si la valeur n'est pas en dur ( elle contient une formule ).
    Il est fonctionnel sauf parfois il affiche qu'une seule alerte alors qu'il y'en a plusieurs.
    donc des fois tout va bien, d'autres fois non !

    ce bout de code est à l’intérieur d'une boucle.

    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
    If f2.Cells(id.Row, .Cells(1, j)).HasFormula = False Then
                                .Cells(i, j).Copy Destination:=f2.Cells(id.Row, .Cells(1, j))
                                f2.Cells(id.Row, .Cells(1, j)).AddComment vbCrLf & "Valeur : " & tmp & " source : " & f1.Name & Now & Chr(10) & tmp_comment
                                Else
                                reponse = MsgBox("Cellule " & id & " Colonne " & f2.Cells(id.Row, .Cells(1, j)).Colonne & " " & "a une formule!!  " & "voulez vous continuer ?", vbYesNo + vbCritical)
     
                                 If reponse = vbYes Then
                                 If f2.Cells(id.Row, .Cells(1, j)).HasFormula = False Then
                                 .Cells(i, j).Copy Destination:=f2.Cells(id.Row, .Cells(1, j))
                                 f2.Cells(id.Row, .Cells(1, j)).AddComment vbCrLf & "Valeur : " & tmp & " source : " & f1.Name & Now & Chr(10) & tmp_comment
                                 End If
                                 Else
                                 Exit Sub
                                 End If
     
                                End If
    merci pour votre aide

  2. #2
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par Peerl Voir le message
    J'ai un code qui doit m'informer si la valeur n'est pas en dur ( elle contient une formule ).
    Il est fonctionnel sauf parfois il affiche qu'une seule alerte alors qu'il y'en a plusieurs.
    Difficile de le savoir sans voir la boucle.
    La seule chose qu'on peut supposer en voyant cette partie de code, c'est que c'est peut-être dû au Exit Sub.

    Avec une indentation correcte, ton code se lit mieux :
    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
    If f2.Cells(id.Row, .Cells(1, j)).HasFormula = False Then
        .Cells(i, j).Copy Destination:=f2.Cells(id.Row, .Cells(1, j))
        f2.Cells(id.Row, .Cells(1, j)).AddComment vbCrLf & "Valeur : " & tmp & " source : " & f1.Name & Now & Chr(10) & tmp_comment
    Else
        reponse = MsgBox("Cellule " & id & " Colonne " & f2.Cells(id.Row, .Cells(1, j)).Colonne & " " & "a une formule!!  " & "voulez vous continuer ?", vbYesNo + vbCritical)
     
        If reponse = vbYes Then
            If f2.Cells(id.Row, .Cells(1, j)).HasFormula = False Then
                .Cells(i, j).Copy Destination:=f2.Cells(id.Row, .Cells(1, j))
                f2.Cells(id.Row, .Cells(1, j)).AddComment vbCrLf & "Valeur : " & tmp & " source : " & f1.Name & Now & Chr(10) & tmp_comment
            End If
        Else
            Exit Sub
        End If
    End If
    De plus, le "=False" complique les choses.
    Sans compter que tu fais un second test pour tester la même chose sur la même cellule alors que tu es toujours dans le If et que la réponse est connue.

    Plus simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    If f2.Cells(id.Row, .Cells(1, j)).HasFormula Then
        If MsgBox("Cellule " & id & " Colonne " & f2.Cells(id.Row, .Cells(1, j)).Colonne & " " & "a une formule!!  " & "voulez vous continuer ?", vbYesNo + vbCritical) = vbYes Then
            .Cells(i, j).Copy Destination:=f2.Cells(id.Row, .Cells(1, j))
            f2.Cells(id.Row, .Cells(1, j)).AddComment vbCrLf & "Valeur : " & tmp & " source : " & f1.Name & Now & Chr(10) & tmp_comment
        Else
            Exit Sub
        End If
    Else
        .Cells(i, j).Copy Destination:=f2.Cells(id.Row, .Cells(1, j))
        f2.Cells(id.Row, .Cells(1, j)).AddComment vbCrLf & "Valeur : " & tmp & " source : " & f1.Name & Now & Chr(10) & tmp_comment
    End If
    Encore plus simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    If f2.Cells(id.Row, .Cells(1, j)).HasFormula Then
        If MsgBox("Cellule " & id & " Colonne " & f2.Cells(id.Row, .Cells(1, j)).Colonne & " " & "a une formule!!  " & "voulez vous continuer ?", vbYesNo + vbCritical) = vbNo Then Exit Sub
    End If
    .Cells(i, j).Copy Destination:=f2.Cells(id.Row, .Cells(1, j))
    f2.Cells(id.Row, .Cells(1, j)).AddComment vbCrLf & "Valeur : " & tmp & " source : " & f1.Name & Now & Chr(10) & tmp_comment

  3. #3
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2018
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2018
    Messages : 141
    Par défaut
    Bonjour Menhir,

    Enfaîte le principe de ce bout de code , c'est qu'il faut pas importer la donnée dans une cellule qui a une formule pour pas l'écraser. Et donc j'ai pensé à ce que je test si la cellule n'a pas de formule on colle la donnée copié dans cette cellule sinon on affiche un message d'alerte m'indiquant cette cellule et le faite de continuer ne veut pas dire coller la donnée quand même mais continuer l'importation des autres cellules (next)
    peut être mon code n'est pas logique en répétant le même test mais j'ai pas trouvé d'autres solution...

    je vais tester tes propositions mais je reste septique sur le faite de ne pas écraser la donnée si on continue!

  4. #4
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par Peerl Voir le message
    peut être mon code n'est pas logique en répétant le même test mais j'ai pas trouvé d'autres solution...
    La solution est de supprimer le second test.
    Etant donné que son résultat ne peut être que Vrai, il est inutile.
    C'est comme si tu plaçais une porte fermée à clé et, juste derrière, une autre porte identique avec la même serrure en se disant que c'est une sécurité supplémentaire. Celui qui a la clé de la première porte pourra forcément aussi ouvrir la seconde.

    je vais tester tes propositions mais je reste septique sur le faite de ne pas écraser la donnée si on continue!
    Compare tes deux tests (on fait abstraction du test de la réponse à la MsgBox).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    If f2.Cells(id.Row, .Cells(1, j)).HasFormula = False Then
    If f2.Cells(id.Row, .Cells(1, j)).HasFormula = False Then
    Ils sont absolument identiques.
    Tu es donc d'accord que la réponse du premier sera la même que la réponse du second.
    Or, on ne peut atteindre le second que si le premier a répondu Faux.
    Donc le second répondra forcément Faux.

    Si le second pouvait répondre Vrai à sa condition, le premier test aurait empêché de l'atteindre puisqu'il aurait lui-même répondu Vrai et n'aurait pas fait passer le code par le Else.

    Ce que fait mon dernier code, c'est la chose suivante :
    Si la cellule contient une formule, la MsgBox demande si on veut l'écraser.
    Si on répond "NON", le programme s'arrête avec un Exit Sub.
    Donc, à la sortie du End If, il ne peut rester que deux cas : soit il n'y a pas de formule, soit il y a une formule pour laquelle on accepte la copie.
    Dans les deux cas, on fait la copie.

  5. #5
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2018
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2018
    Messages : 141
    Par défaut
    Citation Envoyé par Menhir Voir le message

    Ce que fait mon dernier code, c'est la chose suivante :
    Si la cellule contient une formule, la MsgBox demande si on veut l'écraser.
    Si on répond "NON", le programme s'arrête avec un Exit Sub.
    Donc, à la sortie du End If, il ne peut rester que deux cas : soit il n'y a pas de formule, soit il y a une formule pour laquelle on accepte la copie.
    Dans les deux cas, on fait la copie.
    Honnêtement je savais que le faite de répéter le test deux fois n'était pas la bonne solution !
    par contre, si j'ai utilisé le msgbox avec yes et no c'est surtout pour donner le choix soit à continuer l'opération en sautant les cellules avec formule soit on arrête tout...

Discussions similaires

  1. [XL-2010] Affichage d'une alerte avec MsgBox
    Par Devine dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 06/06/2012, 19h57
  2. [Débutant] probleme d'alert ou msgbox
    Par narutoe dans le forum ASP.NET
    Réponses: 1
    Dernier message: 24/11/2011, 11h06
  3. [AC-2003] Alerte MSGBOX sur doublons
    Par Joss0109 dans le forum IHM
    Réponses: 2
    Dernier message: 08/12/2010, 09h25
  4. msgbox d'alerte sur des dates!!!
    Par T'chab dans le forum Access
    Réponses: 6
    Dernier message: 04/05/2006, 16h36

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