Restreindre la validation du contenu d'une cellule

Bonjour,

j'ai développé une application utilisée par plusieurs personnes.

Certaines données, en particulier des dates, sont saisies directement dans les cellules d'un tableau dans la feuille Excel.

Dans ce tableau, il y a 3 colonnes qui contiennent des dates. En cas d'erreur de saisie, les dates erronées perturbent les TDC.

( exemple: date saisie supérieure à la date du jour, enregistrement d'un espace dans la cellule, date incomplète excel inscrit année 1900 etc.)

Pour ces données saisies dans Excel, j'ai une macro

Private Sub Worksheet_Change(ByVal Target As Range)

qui détecte les anomalies de saisie, affiche un message d'erreur et efface le contenu erroné.

Cette macro fonctionne parfaitement quand on utilise la touche "Entrée" pour valider la saisie avec l'instruction " Application .MoveAfterReturn = False" dans la macro.

Par contre, si l’utilisateur emploie une autre touche que la touche "Entrée" pour valider le contenu, exemple une des touches de déplacement haut, droit, bas, gauche ou la souris pour cliquer sur une autre cellule, les contrôles de validité ne fonctionne plus parce que l'adresse de la cellule active a été modifiée.

Est-il possible de forcer l'utilisateur à utiliser la touche "Entrée" pour valider la saisie?

Peut-on

1) modifier à "Entrée" le code asci des touches haut, bas etc

2) bloquer temporairement la fonctionnalité de ces touches

Merci par avance pour votre aide.

Cdt,

Jean-Marie

Bonsoir,

Une solution la validation des données te permet de borner la saisie des dates et oblige à saisir une date.

Cordialement.

17jmv.xlsx (40.82 Ko)

Bonjour,

c'est étrange ce que tu décris.

En fonctionnement normal l'événement Change est bien déclenché sur les actions citées.

Même avec Application.MoveAfterReturn = False

Tu as mis un stop au début de ta macro et elle ne démarre vraiment pas ?

Tu n'aurais pas un Application.EnableEvents = False qui traine quelque part des fois, sans être remis à True ?

Pour y voir clair il faudrait l'intégralité de tes macros. Et ta version excel au cas où

eric

Bonsoir,

merci de répondre aussi rapidement.

J'utilise Excel 2007 et Excel 2013.Le résultat est le même.

Mon application vient de fêter ses 10 ans . Elle comporte 337 procédures, 5830 lignes de codes et 2223 lignes de commentaires.

C'est impossible de la mettre en ligne.

Effectivement, si l'instruction EnableEvents=False est présente, le code ne détecte pas les anomalies puisque la procédure n'est pas lancée.

Dans mon cas, la procédure Sub Worksheet_Change(ByVal Target As Range) se lance correctement, mais en validant l'entrée de la saisie par une touche autre que "Return", la cellule Target n'est plus la cellule de départ avec le contenu à contrôler, mais la cellule du dessous, ou à droite etc en fonction de la touche Haut, droite etc actionnée par l'utilisateur. donc le contenu de la cellule avec l'erreur n'est pas testé,

Comment peut-on faire pour conserver la cellule cible dans le cas où "Return" n'est pas utilisé pour valider le contenu?

Cdt

JM

Bonjour,

Je ne peux que répéter que chez moi Target est toujours la cellule modifiée.

Effectivement, si l'instruction EnableEvents=False est présente, le code ne détecte pas les anomalies puisque la procédure n'est pas lancée.

Si, Change doit se déclencher.

Ce que tu décris est l'événement SelectionChange, pas Change.

eric

Bonjour,

Je viens de tester en rajoutant la procédure "'SelectionChange" contenant le même code de détection d'erreur que "Change" et cela fonctionne dans tous les cas, même lorsque l'on valide la saisie en cliquant avec la souris sur une autre cellule.

Merci pour cette remarque qui me permet de résoudre le problème .

Concernant la validation de données directement dans Excel sans passer par une macro, j'ai un souci.

Globalement, le processus fonctionne.

Par contre lorsque je paramètre le contrôle comme indiqué dans l'exemple, la case à cocher:

"Appliquer ces modifications aux cellules de paramètres identiques"

ne peut pas être cochée sur deux des trois colonnes de ma table!?!. (Voir saisie d'écran)

Date fin TX case non activable

Date Facture case non activable

Date Réglement case activable

Dans la colonne Date Facture,des dates prévisionnelles sont inscrites automatiquement par formule en fonction de la valeur des paramètres "EDF" et "Etat" de la ligne. Dans les 2 autres colonnes, il n'y a pas de formules, c'est l'utilisateur qui inscrit la date..

Comme le contenu de la table est variable, il faut impérativement que ce contrôle soit reporté automatiquement lors de l'ajout d'une ligne par macro. Comment puis- activer cette case à cocher pour les 3 colonnes de la table?

Un grand merci pour votre aide.

Cdt

JM

2020 02 18 06 40 57 window

On peut supposer que comme tu n'es pas sur une colonne date il ne voit pas l'intérêt de proposer de l'étendre.

De toute façon cette case à cocher ne concerne que l'instant où tu mets cette validation.

Sélectionne toutes les cellules concernées avant de l'appliquer, comme tu as défini ta plage en tableau ça s'étendra lors de l'ajout de ligne.

eric

OK.

Merci

Bonne journée,

JM

Rebonjour,

j'ai encore un souci. La colonne contenant des dates calculées par formule pose problème quand j'utilise la proposition de Zebulon.

J'ai re testé la solution avec macro en utilisant les macro Change et SelectionChange dans la feuille1.

Cela ne fonctionne pas.

J'ai préparé un petit fichier qui permet de re créer le problème.

Je l'ai testé avec Excel 2007 et Excel 2013. Même résultat.

Si on utilise la touche "Retour" pour valider, le logiciel détecte une erreur de saisie.

Par contre, pour toutes autres touches utilisée pour valider, il ne détecte rien.

Il doit y avoir une erreur dans le code.

Est-ce que vous pouvez m'aidez?

Merci par avance,

Cdt

JM

6test-valid.xlsm (24.57 Ko)

Pourquoi recontrôler dans selectionChange ce qui a déjà été contrôlé dans Change ? C'est forcément correct

Tu peux supprimer cette partie.

Private Sub Worksheet_Change(ByVal Target As Range)

C'est Target la cellule modifiée, pas ActiveCell qui est la nouvelle cellule après déplacement.

A remplacer dans toute la procédure.

Je te laisse faire les tests après.

Déposer fichier corrigé si toujours pb...

C'est normal et voulu que tu ne rétablisses pas .Calculation = xlCalculationManual dans cette proc ?

Est-ce vraiment utile ?

Excel n'est pas bête, il ne recalcule que les formules devant l'être, celles dont un antécédent a changé. Les autres ne sont pas recalculées inutilement.

eric

Bonsoir,

Merci. maintenant, je comprend mon erreur et le comportement de la macro!. J'aurai du créer le fichier test plus tôt pour expliquer mon problème.

Suite à notre discussion précédente et à ton commentaire, j'ai rajouté la procédure SelectionChange pour vérifier. Je suis d'accord, avec toi, cette procédure n'est pas nécessaire.

Pour faire le fichier Test, j'ai simplifié au maximum sans trop faire attention aux instructions telles que "Screenupdating", "Calculation" etc.

Mon application traite 5 années glissantes d'un processus "Client to Cash" allant du premier contact avec le Client jusqu'au paiement de la facture en utilisant une combinaison d'états et de statuts mappant le Business Model des PME. Le but est d'actualiser pratiquement en temps réel toutes les informations permettant d'établir un tableau de bord couvrant les 5 derniers exercices pour les deux PME. Au total, dans la feuille Saisie, il y a près de 3000 lignes et 60 colonnes. Le tableur comporte aussi une dizaine de TDC.

La saisie des info est réalisée par des personne très peu qualifiées, d'où le besoin de mettre des contrôles sur les saisies de dates et éviter les problèmes avec les TDC.

Le tableur comprend de nombreuses formules et contrôles d'évènements qui déclenche le calcul des formules et/ou l'affichage de formulaires. A chaque modification d'un état, d'un statut ou d'une des dates sur une ligne, le tableur met à jour le carnet de commandes, l'en-cours en réalisation, le montant fabriqué dans la semaine en cours, le montant facturé, le solde à facturer, le dû client, le cash etc ...

Si je ne bloque pas le calcul, les performances sont médiocre même avec un PC de course.

Ok je fais la correction et le test et te confirme si le problème est résolu..

Un grand merci pour ton aide.

Cdt

Jean-Marie

Bonsoir,

j'ai fait la modification et testé. Tout fonctionne correctement.

Encore merci

J'ai passé le sujet à clos.

Bonne soirée,

JM

ok, bonne continuation

eric

Rechercher des sujets similaires à "restreindre validation contenu"