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

Excel Discussion :

[Excel 2003] Validation de données avec menu déroulant


Sujet :

Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Inscrit en
    Juin 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 5
    Par défaut [Excel 2003] Validation de données avec menu déroulant
    Bonjour le forum !

    Alors voilà, je ne sais pas du tout si cela est possible, mais j'aimerais pouvoir autoriser/empêcher la saisie de certaines données dans une colonne (entrée libre pour l'utilisateur) en fonction des choix faits à partir d'un menu déroulant dans une autre colonne.

    Je vais essayer d'être plus claire

    Ma colonne A contient une liste déroulante qui limite le choix à 3 codes.
    Ma colonne B contient des numéros saisis librement.

    En fait, je voudrais empêcher la saisie de doublons dans ma colonne B pour un même code...

    Merci à tous pour votre aide !!

  2. #2
    Membre Expert
    Avatar de JackOuYA
    Inscrit en
    Juin 2008
    Messages
    1 040
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 1 040
    Par défaut
    Bonjour,

    Je te propose une solution VBA. pour cela direction l'éditeur VBE par ALT-F11
    rajout à la feuille excel concernée, du 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
     
    Private Sub Worksheet_Change(ByVal Target As Range)
       Dim intTarget As Range
       Dim c As Range
     
      ' Tout d'abords sur modication colonne A on efface tout ce qu'il y as dans colonne b correspondante
       Set intTarget = Intersect(Target, [A:A]) 'Test si dans colonne A (on peu limiter les lignes concernées..')
       If Not intTarget Is Nothing Then
         'Sur modification dans colonne A on efface la B
          intTarget.Offset(0, 1).ClearContents
          Exit Sub
       End If
     
     
       Set intTarget = Intersect(Target, [B:B])
       If Not intTarget Is Nothing Then
         For Each c In intTarget
          Debug.Print "traite " & c.Address
          If VerifieSiExiste(Intersect([A1].CurrentRegion, [A:A]), c) Then
             MsgBox "Déjà existant : " & c.Offset(0, -1) & "==>" & c
             c.ClearContents
          End If
         Next
       End If
    End Sub

    Rajout d'un module de code avec la fonction :

    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
    Function VerifieSiExiste(rAparcourir As Range, Target As Range) As Boolean
     Dim c As Range
     If Target.Value = "" Then
       VerifieSiExiste = False
       Exit Function
     End If
     For Each c In rAparcourir
           If c.Row <> Target.Row Then
               If Target.Offset(0, -1) = c And Target = c.Offset(0, 1) Then
                 VerifieSiExiste = True
                 Exit Function
               End If
     
           End If
      Next
     VerifieSiExiste = False
    End Function

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 130
    Par défaut
    SalutEperluette et le forum
    Tu peux créer une MFC avec une formule du genre :
    =SOMMEPROD(($B$1:$B$10000<>"")*($A$1:$A$10000 &$B$1:$B$10000 = A1&B1)*1)>1
    avec un fond rouge par exemple : les 2 lignes dont A et B sont égales (en les concaténant ça devrait suffire vu les données) passe en rouge à la validation
    On peut faire que seul le doublon passe en rouge.
    Après tout dépend de ce que tu entends par "empêcher"
    A+

  4. #4
    Futur Membre du Club
    Inscrit en
    Juin 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 5
    Par défaut
    Salut le forum !

    Tout d'abord un grand merci à JackOuYA et Gorfael d'avoir répondu si vite

    Gorfael, tu as raison j'aurais dû préciser cela : idéalement je voudrais signaler à l'utilisateur que sa saisie a déjà été entrée pour le code sélectionné, et donc empêcher la saisie du doublon en proposant une nouvelle saisie par exemple.

    En ce sens la solution VBA de JackOuYA me semble vraiment bien adaptée, mais je retiens l'idée d'une MFC : c'est tout pratique pour identifier rapidement les doublons dans un document.

    JackOuYA, j'ai testé ta solution et ça marche super bien, merci beaucoup !
    Par contre je me demandais s'il y aurait moyen de l'adapter pour tout le classeur, de façon à rechercher dans toutes les feuilles (3 au total), avec par exemple un message qui dirait 'La valeur X (c'est celle de la colonne B) a déjà été entrée pour le Code Y (c'est la sélection de la colonne A) dans la feuille X, cellule Y' ?

    Si en plus il y avait moyen d'installer un genre de bouton qui permette de se téléporter d'un clic de souris jusqu'à la cellule déjà entrée, et un autre qui permette de modifier sa saisie par exemple alors là ce serait carrément top !

    Bon je crois que j'en demande beaucoup là

    En tout cas merci pour votre aide jusqu'à présent, ça fait vraiment plaisir !!

    PS: ci-joint petit fichier d'exemple.
    Fichiers attachés Fichiers attachés

  5. #5
    Membre Expert
    Avatar de JackOuYA
    Inscrit en
    Juin 2008
    Messages
    1 040
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 1 040
    Par défaut
    Bonsoir,

    Tu peu adapter le code en le plaçant dans "ThisWorkbook"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
     
    End Sub
    il faudra alors rajouter au test de la plage modifié (déjà effectué savoir si colonne A) , le test de la feuille (savoir si tu est dans la bonne page.)

    ensuite pour ton bouton .. je sais pas trop tu peu utiliser un userform personnalisé, avec les objets sh et Target tu connais les endroit à atteindre .

    Où bien modifier le messagebox en choix " OK ou Abandon"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If MSgbox ("Existe déjà, voulez vous l'atteindre ",vbOKCancel )=vbOK Then ..

    dis nous si tu bloque..

  6. #6
    Futur Membre du Club
    Inscrit en
    Juin 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 5
    Par défaut
    Salut Jacques et le forum,

    Merci beaucoup pour ta réponse Jacques ! Euh... en fait je débute un peu (beaucoup) avec VBA et je crois que je vais encore avoir besoin de ton aide

    J'ai bricolé un petit peu le code mais ça ne marche pas... J'ai placé le code dans 'ThisWorkbook' puis j'ai essayé de rajouter 'Sheets(i).' pour chercher dans toutes les feuilles, comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set intTarget = Intersect(Target, Sheets(i).[A:A])
    J'ai aussi essayé de modifier le message box comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    If VerifieSiExiste(Intersect([A1].CurrentRegion, Sheets(i).[A:A]), c) Then
             MsgBox ("Déjà existant : " & c.Offset(0, -1) & "==>" & c
             c.ClearContents & "voulez vous l'atteindre ",vbOKCancel )=vbOK
    Donc pour le moment le code ressemble à ça :

    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_SheetChange(ByVal Sh As Object, ByVal Target As Range)
        Dim intTarget As Range
       Dim c As Range
     
      ' Tout d'abords sur modication colonne A on efface tout ce qu'il y as dans colonne b correspondante
       Set intTarget = Intersect(Target, Sheets(i).[A:A]) 'Test si dans colonne A (on peu limiter les lignes concernées..')
       If Not intTarget Is Nothing Then
         'Sur modification dans colonne A on efface la B
          intTarget.Offset(0, 1).ClearContents
          Exit Sub
       End If
     
     
       Set intTarget = Intersect(Target, [B:B])
       If Not intTarget Is Nothing Then
         For Each c In intTarget
          Debug.Print "traite " & c.Address
    If VerifieSiExiste(Intersect([A1].CurrentRegion, Sheets(i).[A:A]), c) Then
             MsgBox ("Déjà existant : " & c.Offset(0, -1) & "==>" & c
             c.ClearContents & "voulez vous l'atteindre ",vbOKCancel )=vbOK
    End If
         Next
       End If
    End Sub
    Je me rends bien compte que j'ai dû faire plein d'erreurs, mais je ne vois pas comment faire... Arg !

  7. #7
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 130
    Par défaut
    Salut Eperluette
    j'ai juste jeté un cil rapide sur ta macro:
    Set intTarget = Intersect(Target, Sheets(i).[A:A])
    tu commences ton traitement, mais où est défini i ?
    Je te conseillerais de t'obliger à déclarer tes variables, c'est chiant, mais ça te permet d'éviter des oublis et les fautes de frappe..

    De plus, quand tu fixe inTarget pour la seconde fois, tu ne t'occupes plus de la feuille => donc, c'est la feuille active qui est traitée.

    Les indentations dans un code doivent être là pour t'aider, pas pour autre chose : ça te permet de voir le code de la partie VRAI/FAUX d'un test, ou si tu es dans une boucle. Con^trôle, juste du visuel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Set intTarget = Intersect(Target, [B:B])
    If Not intTarget Is Nothing Then
        For Each c In intTarget
            Debug.Print "traite " & c.Address
            If VerifieSiExiste(Intersect([A1].CurrentRegion, Sheets(i).[A:A]), c) Then
                MsgBox("Déjà existant : " & c.Offset(0, -1) & "==>" & c & _
                       "voulez vous l'atteindre ", vbOKCancel) = vbOK
                'modifiée pour qu'Excel passe pas la ligne en rouge
            End If
        Next
    End If
    tu vois ou commence/fini les test, la boucle, etc...
    Euh... pas compris ta MsgBox
    A+

Discussions similaires

  1. bouton avec menu déroulant dans la tool bar.
    Par archerhawke dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 27/10/2009, 19h50
  2. [VBA-E]{débutant} Importation de données avec menu déroulant
    Par Thomas69 dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 27/04/2007, 17h02
  3. [JS] Pb avec menu déroulant - cf. 4e post
    Par Badaboumpanpan dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 25/10/2006, 15h13
  4. Problème avec menu déroulants
    Par davinout dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 26/04/2006, 19h33
  5. [CSS] petit problème avec menu déroulant et frame
    Par SylvainB dans le forum Mise en page CSS
    Réponses: 1
    Dernier message: 14/02/2006, 14h54

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