Vérification d'une plage de cellule par une macro

D'abord bonjour à tous, je me présente LeZéro, stagiaire débutant sur Excel et super débutant en VBA ! :p

Entrons dans le vif du sujet. On me demande de protéger une plage de cellule de la manière suivante :

Pour chaque ligne (1403 sur cette plage) il faut que la valeur X ne soit présente au maximum q'une fois (sur la ligne).

que la valeur S ne soit pas présente si la valeur X n'est pas déjà sur la ligne.

Pour éviter les doublons (soit la première condition), j'ai réussi à trouver une solution avec la validation des données personnalisée et la formule "NB.SI". Or, celle ci ne marche plus lorsqu'il s'agit de la faire fonctionner en enregistrant une macro avec cette manip (erreur 1004). Mais le problème c'est que je ne me vois pas répéter l'opération pour chacune des 1403 lignes de cette plage : il faut faire une boucle (enfin je crois).

Pour la deuxième condition, après avoir trimé sur les moteurs de recherches et autres forums, je ne trouve rien.

Votre aide me serait extrêmement précieuse ! Merci d'avance.

Bonjour LeZéro, et

Une proposition de code pour répondre à ton problème.

Ca tient compte des valeurs entrées sur les lignes 1 à 10, plage à adapter à tes besoins.

Pour coller le code :

  • Ouvre ton classeur Excel
  • Alt+F11 (Ouvres VBE)
  • Dans VBAProject(Nom_de_ton_classeur)/Microsoft Excel Objects : double cliques sur le nom de la feuille pour laquelle tu veux que le code soit actif
  • Colle le code dans la fenêtre blanche

Fais des tests et dis nous...

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Target.Count > 1 And Not Intersect(Target, Range("1:10")) Is Nothing Then

Select Case Target
Case Is = "x"
    If Application.WorksheetFunction.CountIf(Range(Target.Row & ":" & Target.Row), "x") > 1 Then
    Target.Clear
    Target.Select
    MsgBox ("Impossible, la valeur ''x'' est déjà présente sur la ligne")
    End If
Case Is = "s"
    If Application.WorksheetFunction.CountIf(Range(Target.Row & ":" & Target.Row), "x") = 0 Then
    Target.Clear
    Target.Select
    MsgBox ("Impossible, la valeur ''x'' n'est pas présente sur cette ligne")
    End If
End Select
End If
End Sub

Bonjour,

Le code de Sylvain pour améliorer la rapidité.

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Target.Count > 1 And Not Intersect(Target, Range("1:10")) Is Nothing Then
On Error GoTo fin
Application.EnableEvents = False
Select Case Target
Case Is = "x"
    If Application.WorksheetFunction.CountIf(Range(Target.Row & ":" & Target.Row), "x") > 1 Then
    Target.Clear
    Target.Select
    MsgBox ("Impossible, la valeur ''x'' est déjà présente sur la ligne")
    End If
Case Is = "s"
    If Application.WorksheetFunction.CountIf(Range(Target.Row & ":" & Target.Row), "x") = 0 Then
    Target.Clear
    Target.Select
    MsgBox ("Impossible, la valeur ''x'' n'est pas présente sur cette ligne")
    End If
End Select
Application.EnableEvents = True
End If
Exit Sub
fin: Application.EnableEvents = True
End Sub

Amicalement

Dan

Eh bien je dois saluer votre réactivité ! Merci

Mais malheuresement lorsque je rentre vos codes, la seule chose impossible à faire devient l'insertion de la valeur X.

Ainsi, toujours pas d'alerte lorsqu'il s'agit d'entrer un seul S sur une ligne, ou encore deux X sur une ligne.

Vu ton message : attention je n'ai pas mis de majuscules dans le code (je pensais que tu modifierai "x" et "s" par autre chose...)

Le code marche pour des minuscules.

Salut Dan,

Toujours le soucis du détail...

Merci !

re,

LeZéro, il te suffit de mettre ceci juste avant Private Sub Worksheet_Change(ByVal Target As Range):

Option compare text

Dan

Quel code cela donnerait avec une macro nommée "Protection" ?

Je rame pour comprendre les erreurs de compilations en haut du code, si vous pouviez me le taper en entier avec le nom Protection.

Re,

C'est un évènement automatique, qui vérifie le contenu de chaque cellule que tu valides.

Donc si tu as déjà plusieurs "X" sur une ligne avant de coller le code, ça ne te les enlèvera pas...

Essaye avec ce fichier : https://www.excel-pratique.com/~files/doc/LeZero.xls

Celui là marche avec des majuscules X et S

Attention : pas de copier coller sur plusieurs cellules en même temps, ça ne lancerait pas le code...

re,

Quel code cela donnerait avec une macro nommée "Protection" ?

Que veux tu dire ?

As-tu suivi les indications de Sylvain pour mettre ta macro au bon endroit ?

Dan

Je les ai suivies, mais maintenant je n'arrive pas à faire fonctionner la macro (j'appuie sur le boutton triangulaire bleu "exécution").

De plus, j'ai besoin de mettre à disposition cette macro rapidement, via un boutton sur la feuille (ce que je sais faire). Or ne faut il pas que la macro soit présente sur la liste des macros pour que ceci puisse se faire ?

Re,

la macro soit présente sur la liste des macros pour que ceci puisse se faire ?

non, car la macro de Sylvain t'évite justement le bouton puisqu'elle réagit directement au X ou S que tu vas écrire dans tes lignes.

Tu ne verras donc pas cette macro dans la liste de tes macros.

Si tu veux absolument la remplacer il faudra changer certaines instructions pour que cela fonctionne correctement.

A te relire

Dan

Bien je ferais sans le boutton.

Mais une fois avoir collé le code dans l'éditeur VBA, que faire ? Ai-je simplement à fermer la fenêtre ?

Je précise que cette macro doit être utilisable plusieures fois.

Re,

Après avoir collé le code au bon endroit, tu retournes sous excel et tu testes.

Sinon tu essayes sur le fichier vierge que j'ai joint tout à l'heure, mais où le code est présent.

(https://www.excel-pratique.com/~files/doc/LeZero.xls)

La macro démarre à chaque nouvelle valeur rentrée dans les lignes 1 à 10, infiniment.

Très bien Sylvain, merci à toi et à Nad-dan !

Rechercher des sujets similaires à "verification plage macro"