Validation de données en VBA

Bonjour le forum,

Pour les besoins d'une macro j'ai mis en place des validations de données obligeant l'utilisateur à respecter certaines conditions.

Le problème c'est que si on supprime des lignes sur le tableau, ma formule de validation devient erronée. Du coup, je veux créer une macro qui remet cette formule. J'en ai fait une avec l'enregistrement de macro.

Voici mon code :

Sub ValidationDonnées()
        Application.Goto Reference:="ListeCas"
    With Selection.Validation
        .Delete
        .Add Type:=xlValidateCustom, AlertStyle:=xlValidAlertStop, Operator:= _
        xlBetween, Formula1:= _
        "=ET(A2>0;NB.SI($A$2:$A$1048576;A2)>0;NB.SI($A$2:$A$1048576;A2)=1;ENT(A2)=A2;$A1>0)"
        .IgnoreBlank = False
        .InCellDropdown = True
        .InputTitle = "Conditions"
        .ErrorTitle = "Conditions non respectées"
        .InputMessage = _
        "Nombre entier, supérieur à zéro, unique et pas de saut de ligne."
        .ErrorMessage = _
        "Les conditions ne sont pas respectées." & Chr(10) & "" & Chr(10) & "- Nombre entier" & Chr(10) & "- Supérieur à zéro" & Chr(10) & "- Unique (dans la colonne)" & Chr(10) & "- Directement à la suite (pas de saut de ligne)" & Chr(10) & ""
        .ShowInput = True
        .ShowError = True
    End With

C'est au niveau de la formule que ça plante, j'ai fait quelque recherche et il se peut que ça soit à cause de la langue, j'ai donc remplacé ma formule par

"=AND(A2>0;COUNTIF($A$2:$A$1048576;A2)>0;COUNTIF($A$2:$A$1048576;A2)=1;INT(A2)=A2;$A1>0)"

Mais si je suis là c'est que cette méthode ne marche pas non plus

Ma formule fonctionne et sert à :

  • Imposer les nombres entier
  • Imposer un nombre supérieur à zéro
  • Imposer le fait qu'il soit unique
  • Empêcher les sauts de ligne

Auriez-vous une ou des solutions à mon problème ?

Merci d'avance,

Skiinck

bonjour,

Poser une validation en VBA n'est pas forcément une bonne idée...

Ça serait peut-être mieux de d'essayer de définir une fois pour toute une validation insensible aux suppressions...

Pour cela un fichier joint serait le bienvenu... Relire ici

Sinon sur le fond l'idée de traduire en anglais : c'est tout à fait cela.

A+

Merci de ta réponse,

J'ai lu le règlement avant de poster, c'est pourquoi j'ai mis l'exemple car la pièce jointe ne me semblait pas utile 8)

J'ai enlevé ce qui n'était pas utile dans mon fichier Exemple.

Ma macro principale sert à créer des pages en fonction des lignes qu'il y a dans la feuille "Cas Recencé" et pour son bon déroulement il faut que les conditions dit plus haut soient respectées sur la première colonne de cette même feuille.

Skiinck

10exemple.xlsm (146.11 Ko)

bonjour,

Pour ce type de problématique, il semble préférable d'interdire toute saisie dans la colonne A et de laisser VBA déterminer par lui-même quel Numéro entrer.

MAX(Range("ListeCas") +1

par exemple...

parce que effectivement là tu as un problème difficile à résoudre. Si les suppressions sont acceptées de toute façon soit tu va avoir un trou dans la numérotation soit les lignes suivantes seront renumérotées.

En principe il est préférable d'accepter les trous dans la numérotation et de laisser VBA gérer.

Conseil : modifier les formules sur le modèle suivant :

Listecas :

=DECALER('Cas Recencé'!$A$1;1;;NBVAL('Cas Recencé'!$A:$A)-1)

Hum... Recencé s'écrit : Recensé !

A+

Merci pour la petite correction sur "Rencensé", j'avais récupéré le fichier et je ne m'en était jamais rendu compte et je te remercie aussi pour le temps que tu me consacre. Je n'oublie bien sûr pas ceux qui cherchent dans leur coin discrètement , merci.

Effectivement le plus simple serait de placer les numéros par VBA je n'y avait pas pensé.

En fait il faudrait que ça soit comme un NuméroAuto sur Access (se place tout seul, toujours unique).

Je n'ai pas compris à quoi sert le code ci-dessous. J'ai essayé de voir se qu'il fait mais pas j'ai pas réussi

MAX(Range("ListeCas") +1)

Ensuite j'ai bien compris comment fonctionne le code ci-dessous mais pas quelles formules je devrais modifier !

=DECALER('Cas Recensé'!$A$1;1;;NBVAL('Cas Recensé'!$A:$A)-1)

Skiinck

Up !

Rechercher des sujets similaires à "validation donnees vba"