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 :

Controler cellule active [XL-2007]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Février 2012
    Messages : 7
    Par défaut Controler cellule active
    bonjours à tous
    j'ai une feuille " Inscription" ou la colonne "a:a" est nommée "Dossard" ou j'inscris tous les dossards par coureur.
    puis une feuille "Classement"ou je note tous les dossards par ordre d'arrivée pour chaque tour dans les cellules ("A2:E102")
    pour éviter les erreurs de saisies, pour un numéro de dossard n'étant pas dans la feuille "Inscription",qu'un msgbox me dise "Ce dossard etc"
    ex: si je tape 20 et 20 existe dans la plage "Dossard" rien se passe
    mais si je tape 200 et que 200 n'est pas dans la plage "Dossard" le msgbox s'active et que la cellule active concernée soit effacée
    Notre association vous remercie pour le temps que vous passez pour nous
    mais qui nous évitera des erreurs sur le classement final.

  2. #2
    Membre Expert
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2013
    Messages
    885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 885
    Par défaut controle cellule active
    Bonjour,

    Il semble selon mes essais que ceci devrait convenir.

    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
     
    ' procédure à loger dans la feuille classement
     
    Sub worksheet_change(ByVal target As Range)
    Dim ligne As Integer
    Dim valeur As Integer
    If target.Column = 1 Then '1 signifie colonne "A" de la feuille classement
      valeur = target.Value
    Else
    Exit Sub
    End If
    With Sheets("inscription")
       On Error GoTo 1  ' pour eviter une erreur si le dossard n'esxiste pas
       ligne = Application.Match(valeur, .Range("a:a"), 0) ' "A:A" doit être adapté à la colonne réelle de la feuille
    1  If ligne Then
         MsgBox "le dossard " & valeur & " existe" 'ligne à retirer après vérification du résultat
       Else
         MsgBox "le dossard " & valeur & " n'existe pas"
       End If
    End With
    End Sub

  3. #3
    Invité
    Invité(e)
    Par défaut Avec une liste de validation et une zone nommée
    Bonjour,

    Avec une zone nommée Dossards et une liste de Liste de validation.

    En pièce jointe, l'exemple correspondant.

    Cordialement.

  4. #4
    Membre Expert
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2013
    Messages
    885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 885
    Par défaut controle cellule active
    bonjour Eric,

    Effectivement, c'est une excellente façon de minimiser les erreurs. je dis minimiser car la même valeur peut être sélectionnée deux fois par inadvertance (100 au lieu de 101 par exemple).
    Pour être sûr que cela ne se produise pas, il faudrait vérifier les doublons éventuels. Ce problème vaut également pour ma proposition.

    Cordialement,

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonjour Paul,

    Tu as raison. Pour empêcher les doublons dans une colonne, j'ai mis la macro événementielle dans la feuille Classement :

    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
    Option Explicit
     
    Private Sub WorkSheet_Change(ByVal ZZ As Range)
     
       If ZZ.Count > 1 Then Exit Sub
     
       On Error Resume Next
       If Not Application.Intersect(ZZ, ActiveSheet.UsedRange) Is Nothing Then
     
              If WorksheetFunction.CountIf(Columns(ZZ.Column), ZZ) > 1 Then
                    MsgBox ("Dossard déjà saisi dans la colonne !")
                    Application.EnableEvents = False
                    ZZ.ClearContents
                    Application.EnableEvents = True
              End If
     
       End If
     
    End Sub
    Cordialement.
    Dernière modification par AlainTech ; 11/11/2013 à 12h54. Motif: Suppression de la citation inutile

  6. #6
    Membre habitué
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Février 2012
    Messages : 7
    Par défaut
    merci Nibledispo d'avoir répondu a mon problème
    ton code ne traite que la colonne A qui correspond au 1er tour
    mais les coureurs font 5 tours
    en colonne B tour 2
    en colonne c tour 3
    en colonne d tour 4
    et en colonne e tour 5
    est ce que l'on peut traiter les 5 colonnes
    merci pour ta patience, ton savoir et du temps que tu donne à notre association

  7. #7
    Membre Expert
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2013
    Messages
    885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 885
    Par défaut controle cellule active
    Bonjour,

    Je ne manque pas d'être étonné par ton ignorance de la proposition d'Eric qui est de mon avis plus aboutie et de loin préférable à mon code. Mais cela est ton affaire!

    Voici néanmoins le code adapté aux 5 tours.
    Sur ce code, j'ai ajouté le code gestion des doublons éventuels proposé par Eric qu'il te sera aisé de retirer si tu n'en vois pas l'intérêt.

    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
    31
    32
     
    ' procédure à loger dans la feuille classement
     
    Sub worksheet_change(ByVal target As Range)
    Dim ligne As Integer
    Dim valeur As Integer
    If target.Column <= 5 Then '1 signifie colonne "A" de la feuille classement
       valeur = target.Value
    Else
      Exit Sub
    End If
    With Sheets("inscription")
       On Error Resume Next  ' pour éviter un message d'erreur si le dossard n'existe pas
       ligne = Application.Match(valeur, .Range("A:A"), 0) ' "A:A" doit être adapté à la colonne dossards de la feuille inscription
       If ligne Then
       Else
         MsgBox "le dossard " & valeur & " n'existe pas"
       End If
    End With
     
    'traitement des doublons
    If target.Count > 1 Then Exit Sub
    On Error Resume Next
    If Not Application.Intersect(target, ActiveSheet.UsedRange) Is Nothing Then
       If WorksheetFunction.CountIf(Columns(target.Column), target) > 1 Then
          MsgBox ("Dossard déjà saisi dans la colonne !")
          Application.EnableEvents = False
          target.ClearContents
          Application.EnableEvents = True
       End If
    End If
    End Sub
    Cordialement,

  8. #8
    Membre habitué
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Février 2012
    Messages : 7
    Par défaut
    Merci Nibledispo pour ton dernier code et à toi Eric pour traiter les doublons.
    mais il reste un petit problème
    lorsque je veux effacer toutes mes cellules pour une autre course avec une macro il me renvoie à ton code ligne 8 Valeur = target.Value
    peut-on désactiver temporairement toute la procédure le temps que j'efface les 5 colonnes
    merci d'avance

  9. #9
    Membre Expert
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2013
    Messages
    885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 885
    Par défaut controle cellule active
    Bonjour,

    La solution d'Eric dont je répète qu'elle est préférable ne pose pas ce problème auquel je n’avais pas pensé.

    S'agissant de mon code, il y a surement un moyen de régler ce problème mais il ne me vient pas d’emblée à l'esprit.

    Cordialement.

  10. #10
    Expert confirmé Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Par défaut
    Ajouter une condition
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If WorksheetFunction.CountIf(Columns(target.Column), target) > 1 And Selection.Rows.Count = 1 Then
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur :resolu: si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

  11. #11
    Membre habitué
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Février 2012
    Messages : 7
    Par défaut
    merci Casefayere et à tous de m'avoir répondu.
    mais cette fonction je ne sais pas ou la mettre dans le code
    moi même je suis bénévole trésorier dans un club pour sénior
    cordialement

  12. #12
    Membre Expert
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2013
    Messages
    885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 885
    Par défaut controle cellule active
    Bonsoir,

    Voici le code complet revu.

    Attention: si tu supprimes des colonnes ou/et des lignes tout va bien mais si tu supprimes une seule cellule tu auras le message dossard existe déjà. Ce qui est sans conséquence par ailleurs.

    Cela implique que si tu fais une erreur de saisie, il ne faut pas la supprimer mais taper la bonne valeur par dessus.
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
     
    ' procédure à loger dans la feuille classement
     
    Sub worksheet_change(ByVal target As Range)
    Dim ligne As Integer
    Dim valeur As Integer
    If target.Column >= 5 Then '5 signifie numero de colonne max admis de la feuille classement
      Application.EnableEvents = False
       target.ClearContents
      Application.EnableEvents = True
      Exit Sub
    End If
    With Sheets("inscription")
       On Error Resume Next  ' pour éviter un message d'erreur si le dossard n'existe pas
       ligne = Application.Match(target, .Range("A:A"), 0) ' "A:A" doit être adapté à la colonne dossards de la feuille inscription
       If ligne Then
       Else
         MsgBox "le dossard " & target & " n'existe pas"
         Application.EnableEvents = False
          target.ClearContents
         Application.EnableEvents = True
       End If
    End With
     
    'traitement des doublons
    If target.Count > 1 Then Exit Sub
    On Error Resume Next
    If Not Application.Intersect(target, ActiveSheet.UsedRange) Is Nothing Then
       If WorksheetFunction.CountIf(Columns(target.Column), target) > 1 Then
          MsgBox ("Dossard déjà saisi dans la colonne !")
          Application.EnableEvents = False
          target.ClearContents
          Application.EnableEvents = True
     
       End If
    End If
     
    ' effacer des colonnes et des lignes
    If WorksheetFunction.CountIf(Columns(target.Column), target) > 1 And Selection.Rows.Count = 1 Then 
       Application.EnableEvents = False
        target.ClearContents
       Application.EnableEvents = True
    End If
    End Sub
    Cordialement,

  13. #13
    Membre habitué
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Février 2012
    Messages : 7
    Par défaut
    Bonjour à tous
    désolé de vous répondre si tard mais mon club organisait un concours de belote pour nos adhérents
    le temps de faire mes comptes de la journée je me suis précipité sur votre forum pour voir si vous aviez trouver une solution
    bravo a tout ceux qui on participer à mon manque de connaissance en VBA pour résoudre ce problème
    vous allez rendre des coureurs heureux de connaitre leur placement aussitôt arrivé
    mon club vous remercie et vous invite à notre a prochaine course suivit d'un repas
    encore bravo a vous et à Développez.com pour votre professionnalisme, votre patience et de ne rien lacher
    le trésorier campagne72

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

Discussions similaires

  1. Excel -> changer la cellule active
    Par sony351 dans le forum C++Builder
    Réponses: 5
    Dernier message: 04/10/2006, 11h03
  2. probleme lors d'une requete sql (controle non activé)
    Par junty dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 09/09/2005, 15h45
  3. [JTable][editable] cellule activée/ désactivée
    Par nawel dans le forum Composants
    Réponses: 5
    Dernier message: 09/05/2005, 14h37
  4. Réponses: 8
    Dernier message: 14/03/2005, 21h43
  5. [DBGrid] coordonnees ecran de la cellule active ?
    Par kase74 dans le forum Bases de données
    Réponses: 2
    Dernier message: 20/09/2004, 17h00

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