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 sur boucle


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2019
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Janvier 2019
    Messages : 101
    Par défaut MsgBox sur boucle
    Bonjour à tous,

    Voici mon problème: J'ai créé un bout de macro tel quel:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For N = 2 To DligneNA
    If IsError(Cells(N, 10)) Then MsgBox ("Le Code société " & Cells(N, 7) & " ne correspond pas dans le référentiel !")
    Next N
    ça fonctionne sans soucis.
    En N7= des codes 5 digits.
    En N10= parfois des #N/A

    Cependant, il est fréquent que le code en N7 soit le même pour plusieurs lignes de ma boucle, ce qui occasionne le même Msgbox. Je souhaiterais ainsi ne recevoir ce code qu'une seule fois.

    Ce à quoi j'ai pensé :


    Stocker le code à part, puis faire à nouveau une boucle sur ces codes stockés et supprimer les doublons pour faire à nouveau un msgbox sur ces codes triés.


    Ca fonctionnerait, mais je pense qu'il existe une méthode plus simple et je m'en remet aux experts de ce forum. Si il n'y a pas plus simple, je garderait cette méthode;


    J'espère m'être fait comprendre !

    Bonne journée,
    Mickamax

  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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim CC As String
    CC = ""
    For N = 2 To DligneNA
        If IsError(Cells(N, 10)) Then CC =  CC & Chr(13) &Cells(N, 7)
    Next N
    If Len(CC) > 0 Then MsgBox ("Le(s) Code(s) société(s) suivant(s) ne correspond(ent) pas dans le référentiel !" & CC)

  3. #3
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Salut,

    Mickamax,

    Il ne faut pas confondre Cells(N, 7) et N7.

    Menhir,

    Dis-moi si je me trompe.
    Dans ton message, unique certes, seront reportés plusieurs fois les mêmes codes.

    Personnellement, j'aurais créé un dictionnaire sur les codes dont la formule dépendante est en erreur.
    Plus précisément, j'aurais balayé les cellules spéciales de formules en erreur en colonne 10
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SpecialCells(xlCellTypeFormulas, xlErrors)
    et alimenté le dictionnaire des codes reportés dans la colonne 7.
    Et dans le message,


  4. #4
    Membre très actif
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 364
    Par défaut
    Bonsoir…

    J’en étais resté là
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub e()
        Dim Zone As Range, R As Range, S As String
        Set Zone = Range("J2", Cells(Rows.Count, 10).End(xlUp))
        For Each R In Zone
            If IsError(R) Then S = S & R.Address & vbLf
        Next
        If S <> "" Then MsgBox S, , "Code absent en"
    End Sub
    Remarque : dans le code de Menhir, on peut se dispenser de la deuxième ligne (la variable est initialisée dès sa déclaration).
    De Marcel
    Dis-moi si je me trompe.
    Dans ton message, unique certes, seront reportés plusieurs fois les mêmes codes.
    Je ne comprends pas cela par contre ton code est le bienvenu (voir ci-dessous).

    Une solution MFC serait acceptable ?
    Nom : VBA vs Mfc.jpg
Affichages : 364
Taille : 135,2 Ko

  5. #5
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Bonjour à vous, Bonjour au Forum,

    Le test s'effectue sur les formules en erreur.
    Au demeurant, ce sont les dépendants de celles-ci, donc les codes, qui alimentent le dictionnaire.

    ACTIVER LA REFERENCE MICROSOFT SCRIPTING.RUNTIME
    (Menu Outils\Références de l'éditeur VBE)

    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
    Option Explicit
     
    Public Sub dico_erreurs()
     
    Dim dernl As Long
    Dim c As Range
     
    Dim dico As Scripting.dictionary
     
    Set dico = CreateObject("Scripting.Dictionary")
     
    With ThisWorkbook.Worksheets("lawks")
            dernl = .Cells(.Rows.Count, 7).End(xlUp).Row
            For Each c In .Range("J2:J" & dernl).SpecialCells(xlCellTypeFormulas, xlErrors)
                    With c.Offset(0, -3)
                            If Not dico.Exists(.Value) Then dico.Add .Value, .Value
                    End With
            Next c
    End With
     
    MsgBox _
            Prompt:="Les codes suivants sont en erreur." & Chr(13) _
                                        & Join(dico.Keys, " - "), _
            Buttons:=vbCritical, _
            Title:="Codes en erreur."
     
    Set dico = Nothing
     
    End Sub
    A noter:
    1 - La déclaration du dictionnaire peut être formulées de plusieurs façons.
    La méthode utilisée ici permet une saisie facilitée des propriétés et méthodes.
    Elle nécessite néanmoins l'activation de la Référence Microsoft Scripting.Runtime
    2 - Le 2ème paramètre xlErrors de la méthode SpecialCells permet une sélection plus fine
    3 - l'argument "séparateur" de la méthode Join est ici précisé.
    A défaut, celui-ci est un espace.

  6. #6
    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 OrDonc Voir le message
    Remarque : dans le code de Menhir, on peut se dispenser de la deuxième ligne (la variable est initialisée dès sa déclaration).
    Ne sachant pas ce qui, dans ton code, précède les lignes données, j'ai préféré prendre des précautions qui, de toute façon, n'entravent pas l'exécution.

Discussions similaires

  1. [MySQL] Problème sur Boucle While après un LEFT JOIN
    Par matperino dans le forum PHP & Base de données
    Réponses: 12
    Dernier message: 28/05/2007, 17h43
  2. [VBA-E]Problème de triet effacement de doublon sur boucle
    Par baptbapt dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 04/09/2006, 11h06
  3. Réponses: 3
    Dernier message: 11/06/2006, 12h09
  4. Réponses: 18
    Dernier message: 07/06/2006, 15h16
  5. [BATCH] Aide sur boucle for et test
    Par t_om84 dans le forum Windows
    Réponses: 3
    Dernier message: 07/06/2006, 10h12

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