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 :

Message d'information concernant un doublon


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2016
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2016
    Messages : 72
    Par défaut Message d'information concernant un doublon
    Bonjour à tous,

    Je viens à vous puisque je n'arrive pas à deux choses:

    - Lorsque qu'il y a détection d'un doublon, ma Msgbox apparaît une première fois pour me dire le premier doublon apparaît à la ligne "X". Puis une deuxième fois pour me dire que le deuxième doublon est à la ligne "XX". Je souhaiterais faire apparaître le message qu'une seule fois en me disant "le N° de référence apparait deux fois, une fois à la ligne "X" et une fois à la ligne "XX".

    -D'autre part, je n'arrive pas à coder pour faire apparaître la msgbox "aucun doublon détecté" s'il rien n'est trouvé.
    J'ai essayé de coder :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     If Application.CountIf(Plage, Cel.Value) = "" Then
     
                MsgBox "il n'y a pas de doublons détectés"
           End if
    Désolé pour le niveau de la question mais çà fait que deux semaines que je me suis lancé dans VBA et saisir la logique du code n'est pas chose facile !

    Merci d'avance !!!

    Voici mon code :
    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
    Private Sub CommandButton4_Click()
     
        Dim Plage As Range
        Dim Cel As Range
     
        With Worksheets("Base de données")
     
        'en colonne "B" à partir de A19
           Set Plage = .Range(.Cells(19, 2), .Cells(.Rows.Count, 1).End(xlUp))
     
        End With
     
       For Each Cel In Plage
     
            If Application.CountIf(Plage, Cel.Value) > 1 Then
     
                MsgBox "Attention, la réference de l'Appel d'Offre '" & Cel.Value & "' existe déja," _
                       & " veuillez trouver un des doubles à la ligne '" & Cel.Address(0, 0) _
                       & ""
                       End If
     
     
     
        Next Cel
     
    End Sub

  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 Arone77 Voir le message
    - Lorsque qu'il y a détection d'un doublon, ma Msgbox apparaît une première fois pour me dire le premier doublon apparaît à la ligne "X". Puis une deuxième fois pour me dire que le deuxième doublon est à la ligne "XX". Je souhaiterais faire apparaître le message qu'une seule fois en me disant "le N° de référence apparait deux fois, une fois à la ligne "X" et une fois à la ligne "XX".
    Dans ce cas, il faut que tu mettes une double boucle For imbriquées.
    La première itère sur le critère de recherche, la seconde fait le recherche pour chaque élément de la première.
    Si tu veux que le message n'apparaisse qu'une fois, il faut que ta recherche (la seconde boucle) ne se fasse pas sur la plage entière mais uniquement à partir de la cellule suivant celle qui sert de critère de recherche.

    Pour accélérer, il est possible de remplacer la seconde boucle par l'utilisation d'un Find.

    -D'autre part, je n'arrive pas à coder pour faire apparaître la msgbox "aucun doublon détecté" s'il rien n'est trouvé.
    Déclare une variable de type Boolean.
    Initialise-la à la valeur True.
    Lorsque tu trouves un double, passe-la à False.
    A la fin de ton code, teste-la : si elle est True, alors affiche ton MsgBox.

  3. #3
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2016
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2016
    Messages : 72
    Par défaut
    En essayant de faire pour la première fois un for imbriqué,
    j'ai écris quelque chose ca mais ca ne fonctionne pas

    Qu'en pensez vous ?
    J'ai nomé resultat as range
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    For Each Cel In Plage
        For Each Resultat In Plage
            If Application.CountIf(Plage, Cel.Value) = Application.CountIf(Plage, Resultat.Value) Then
     
     
                MsgBox "Attention, la réference de l'Appel d'Offre '" & Cel.Value & "' existe déja," _
                       & " veuillez trouver un des doubles à la ligne '" & Cel.Address(0, 0) '"& resultat.Address(0, 0)_
                       
                       End If
     
      Next Cel
     Next Resultat
    End Sub

  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
    Je n'ai pas regardé ton code en détail mais une chose pique les yeux d'entrée : tes deux boucles ne sont pas imbriquées, elles sont croisées, ce qui, informatiquement parlant, est très mal (presque autant que de croiser les flux dans Ghostbusters ).
    C'est comme les rimes en poésie : tes For / Next devraient se lier comme des rimes embrassées et non comme des rimes croisées.
    https://fr.wikipedia.org/wiki/Rime#Rimes_de_fin_de_vers

    Autrement dit, il faudrait que tu intervertisses soit tes deux For, soit tes deux Next.

  5. #5
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2016
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2016
    Messages : 72
    Par défaut
    J'ai inversé, j'ai espéré, j'ai appuyé sur F8, le curseur est passé, j'ai espéré un peu plus, j'ai testé un doublon... et c'était raté ! J'ai trafiqué, j'ai cherché... et j'y suis pas arrivé !!!!

    Je donne ma langue au chat C'est possible ?!

    Dernier code tenté :

    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
    Private Sub CommandButton4_Click()
     
        Dim Plage As Range
        Dim Cel As Range
        Dim Resultat As Range
        Dim A As Boolean
     
        With Worksheets("Base de données")
     
        'en colonne "B" à partir de A19
           Set Plage = .Range(.Cells(19, 2), .Cells(.Rows.Count, 1).End(xlUp))
     
        End With
     
       For Each Cel In Plage
        For Each Resultat In Plage
     
            If Application.CountIf(Plage, Cel.Value) = Application.CountIf(Plage, Resultat.Value) > 1 Then
            A = False
                MsgBox "Attention, la réference de l'Appel d'Offre '" & Cel.Value & "' existe déja," _
                       & " veuillez trouver un des doubles à la ligne '" & Cel.Address(0, 0) & Resultat.Address(0, 0) & "'" _
                        & ""
                       End If
     
        Next Resultat
      Next Cel
      If A = True Then
        MsgBox "il n'y a pas de doublon détecté"
    End if
    End sub

  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
    Set d = CreateObject("Scripting.Dictionary")
    With Worksheets("Base de données")
     
        'en colonne "B" à partir de A19
           Set palge = .Range(.Cells(19, 2), .Cells(.Rows.Count, 2).End(xlUp))
    For i = 1 to  palge.rows.count
        'en colonne "B" à partir de A19
         if d.existes(  palge(i).value)=True then msg=msg & palge(i).Address & vbcrlf
         d(palge.(i).value=palge.(i).value
    Next
    If msg<>"" then MsgBox "Attention, la référence de l'Appel d'Offre " & vbcrlf & msg
        End With

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 24/10/2006, 13h18
  2. affichage de message d'information personnalisé
    Par josémaria dans le forum Autres Logiciels
    Réponses: 3
    Dernier message: 19/10/2006, 16h03
  3. Réponses: 4
    Dernier message: 18/07/2006, 07h06
  4. [VBA-E]empecher les messages d'information
    Par arno01 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 07/04/2006, 07h56
  5. [Info][XML] Informations concernant JAXB
    Par sylvain_2020 dans le forum Persistance des données
    Réponses: 2
    Dernier message: 29/11/2004, 22h47

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