Excel : Limiter nombre caractère à saisir [Résolu/Fermé]

Messages postés
25
Date d'inscription
lundi 5 juin 2006
Statut
Membre
Dernière intervention
11 novembre 2010
- - Dernière réponse :  MP - 24 janv. 2018 à 15:49
Bonjour,

Je cherche à limiter le nombre de caractères pouvant etre saisis dans une cellule (45 caractères Maximum).
C'est à dire, lorsque je clic à l'intérieur de la cellule, je ne puisse pas saisir au delà de la limite définie.

Sur Internet je n'ai trouvé que des réponses faisant référence à : Données > Validation, ce qui malheureusement ne résout pas mon problème.

J'avais cherché au début à aller dans les préférences de cellules et peut etre mettre 40 x "*" pour limiter mon texte, mais cela ne marche pas :(

Du coup j'avais pensé à procéder autrement :

Créer une macro qui va copier la colonne (que je veux limiter), dans une autre, puis en faisant une formule on ne prendra que 40 caractères en partant de gauche et on copie/colle le tout dans la colonne initiale.

Mais pour que l'utilisateur n'aie rien d'autre à faire que de saisir ses données, la macro devra s'executer à chaque fois qu'on clic sur "Entrée" dans notre plage de cellules (colonne Z on va dire).

J'ai trouvé le code suivant :

worksheets_SelectionChange(ByRef target As Range)

Mais j'ai un peu de mal à savoir comment lui attribuer ma colonne "Z", et surtout si "selectionChange", correspond bien au fait d'appuyer sur "Entrée"

Tous les conseils sont bienvenues :)

Afficher la suite 

15 réponses

Meilleure réponse
Messages postés
15980
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
20 novembre 2019
2824
12
Merci
bonjour,

XL<2007
tout simplement
données-validation-longueur de texte

voili-voilou

Dire « Merci » 12

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 70052 internautes nous ont dit merci ce mois-ci

tres simple et ca a resolu mon probleme
Messages postés
15605
Date d'inscription
mardi 12 juin 2007
Statut
Contributeur
Dernière intervention
20 novembre 2019
8812
2
Merci
Bonjour stranger-46

Il faut faire une boucle sur Target :

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Application.Intersect(Target, Range("AD:AD")) Is Nothing Then
On Error Resume Next
For Each c In Target
If Len(c) > 45 Then
c.Value = Left(c.Value, 45)
End If
Next c
End If
End Sub

m@rina
Messages postés
25
Date d'inscription
lundi 5 juin 2006
Statut
Membre
Dernière intervention
11 novembre 2010
0
Merci
Bonjour Michel_m,

Comme je l'ai dit plus haut : Données > Validation ne résout pas mon problème. Cette méthode affiche un message d'avertissement, du coup l'utilisateur doit supprimer des caractères pour essayer de s'adapter à la longueur du texte fixée.

Or mon idée c'est que l'utilisateur ne doit s'inquiéter que de la saisie (l'apparition des messages d'avertissment va vite devenir lassant) d'ou l'idée :

1) Soit, lorsque la personne saisie les données, elle ne peut plus rien saisir une fois la limite atteinte

2) Soit, lorsque la personne saisie et fait "entrée", le texte saisie est raccourci pour atteindre le nombre de caractères fixé.

La deuxième méthode me semble la plus réalisable, le problème c'est comment écrire en VBA le fait que : lorsqu'il y a une modification dans la colonne "Z" (exemple), alors exécuter macro "x" (celle-là je vais la faire, comme expliqué plus haut).

Je pense que la première fois j'étais pas assez claire, j'espère que cette fois c'est un peu plus précis :)


Messages postés
15980
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
20 novembre 2019
2824
0
Merci
OK, j'avais lu trop vite, excuses moi

Cette macro événementielle coupe le texte saisi (après appui sur entrée) dans la zone Z1:Z1000 à 45 caractères

Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Range(Z1:Z1000")) Is Nothing Then: Exit Sub
Application.EnableEvents = False
    Target = Left(Target.Value, 25)
Application.EnableEvents = True
End Sub


pour installer cette macro clic droit sur l'onglet de la feuille-visualiser le code et tu copies colles cette macro

En espèrant que...
m@rina
Messages postés
15605
Date d'inscription
mardi 12 juin 2007
Statut
Contributeur
Dernière intervention
20 novembre 2019
8812 -
Hello Michel !

Tu as été plus rapide que moi !! ;)))

Bon, voilà, ça fait deux exemples ;)

Bizz
A ++ ;)

m@rina
Messages postés
15605
Date d'inscription
mardi 12 juin 2007
Statut
Contributeur
Dernière intervention
20 novembre 2019
8812
0
Merci
Bonjour,

Voici une macro événementielle à insérer dans la feuille en question :

Private Sub Worksheet_Change(ByVal Target As Range)

If Not Application.Intersect(Target, Range("A1")) Is Nothing Then
If Len(Range("A1")) > 45 Then
Range("A1").Value = Left(Range("A1").Value, 45)
End If
End If
 
End Sub

Messages postés
25
Date d'inscription
lundi 5 juin 2006
Statut
Membre
Dernière intervention
11 novembre 2010
0
Merci
Bonjour Marina,

Michel : merci pour ton code il fait exactement ce que je voulais (mais en plus simple en plus). Mais je viens de remarquer un problème ...

Le code fait bien ce qu'on lui demande, sauf qu'en cas d'un déplacement de cellule ou un "couper" ou bien dans le cas d'une suppression de plus de 1 cellule (par ex : je sélectionne 2 cellules et je fais "supp"), dans la colonne "Z" bien sur, et bien j'ai l'erreur "Run-time error '13' : Type mismatch" ... et le déboggage va sur la ligne "Target = Left(Target.Value, 25)"

C'est d'autant plus embetant qu'une fois que j'ai cliqué sur "End" ou "Dobogage", la macro ne marche plus, il faut refermer la feuille et reouvrir de nouveau.

J'imagine que c'est du à la target.value, lorsqu'elle est nulle (pour au-delà de 1 cellule) la formule de "left" ne peut marcher sur du vide.



Du coup, c'est seulement plus tard que j'ai vu le message de marina, j'ai modifié un peu ton code pour qu'il ne prenne pas en compte uniquement une seule cellule mais plusieurs. Mais étant peu calé en VBA, la macro marche "presque" bien ... elle ne s'arrete plus ...

--- Elle marche pour "suppression" et "couper", et ne s'arrete plus pour une exécution normal et pour le "copier".

Pour info, le debogueur met en jaune le deuxième "End if".

Voici le code :


Private Sub Worksheet_Change(ByVal Target As Range)

Dim ligne As Integer

ligne = 2

While Worksheets("Sheet1").Cells(ligne, 1).Value <> ""


If Not Application.Intersect(Target, Cells(ligne, 30)) Is Nothing Then ' 30 pour colonne "AD" (j'avais pris "Z" comme exemple mais 30 plus facile à retenir :p )

If Len(Cells(ligne, 30)) > 4 Then

Cells(ligne, 30).Value = Left(Cells(ligne, 30).Value, 5) ' 5 - pour pouvoir faire des tests rapidement au lieu de taper 40 caractère :)
End If
End If

ligne = ligne + 1
Wend

End Sub



Messages postés
15605
Date d'inscription
mardi 12 juin 2007
Statut
Contributeur
Dernière intervention
20 novembre 2019
8812
0
Merci
Bonsoir,

Je ne comprends pas ta boucle WHILE qui exécute tant que la condition est vraie, ça risque de tourner en rond.
Une macro événementielle porte un événement, càd au moment où l'utilisateur change le contenu de la cellule, et non pas tant qu'une condition est vraie.

Peux-tu nous dire ce que tu veux faire exactement ? Sur quelles cellules portent l'action et sous quelle(s) condition(s) ?

m@rina
Messages postés
15980
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
20 novembre 2019
2824
0
Merci
1/ le If Len(Cells(ligne, 30)) > 4 Then est inutile...

2/ok pour ligne déclaré en integer si tu utilises moins de 32000 + des poussières de lignes; si tu en utilises moinds de 256 déclare en Byte.

3/ ton truc ne s'arrètera jamais car worksheeet_change se déclenche quand tu modifies une saisie. c"est pour cela que j'ai désactivé l'action des événements (enableevents), le += souvent indispensable avec worksheet_change

4/ pour éviter la sélection de plusieurs cellules
If Not Application.Intersect(Target, Cells(ligne, 30)) and target.count=1 Is Nothing Then
Messages postés
15980
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
20 novembre 2019
2824
0
Merci
Et bing, une bosse!
Bizous Marina
Messages postés
25
Date d'inscription
lundi 5 juin 2006
Statut
Membre
Dernière intervention
11 novembre 2010
0
Merci
Je viens de tester de rajouter le "target.count=1" dans ton premier code Michel, et ça me retourne erreur : "type mismatch" en selectionnant le "=".

En fait pour la boucle, Marina, c'est juste que comme tu as donné un code avec une seule cellule à l'intérieur "A1", je voulais remplacer cette cellule par des cellules variables (vu que en tout dans ma base j'ai plus de 15000 cells, et leur nombre est amené à augmenter ou diminuer).

Du coup mon while était destiné à dire : tant que ma colonne "A" (ex: code article) a des données (différente de rien) alors la cellule (ligne) de la colonne "AD" (30) doit etre raccourcis en nombre de caractères.

Difficile d'expliquer un tableau par écrit :)

Pour mieux représenter disons que la colonne "A" ce sont des codes articles, et la colonne "AD" sont des informations sur article. Il n'y a pas toujours une information pour chaque article. Par contre une personne peut en ajouter à n'importe quel moment, mais vu que toutes ces données sont ensuites exploitées dans des TCD, l'ajout de la colonne "AD" rend l'affichage des TCD complétement illisibles (mauvaise mise en page etc etc), d'ou l'intéret de limiter le nombre de caractères.

Je me serais contenter volontier de ton premier code Michel, puisqu'il fait exactement ce qu'il faut, mais je sais que les utilisateurs seront amenés à supprimer plus d'une cellule à la fois ou couper etc...

En tout cas merci pour votre aide, je ne sais pas si j'aurais le temps d'aller sur le forum durant le week-end, donc bon week-end à vous et peut etre à Lundi :)

PS: je suis quand meme surpris qu'une fonction qui me semble assez basique (vu que le fait de limiter la saisi à un nombre de caractères donné, est présente dans de nombreux logiciels) ne soit pas integrée à Excel ...
Messages postés
15605
Date d'inscription
mardi 12 juin 2007
Statut
Contributeur
Dernière intervention
20 novembre 2019
8812
0
Merci
Bonsoir

Du coup mon while était destiné à dire : tant que ma colonne "A" (ex: code article) a des données (différente de rien) alors la cellule (ligne) de la colonne "AD" (30) doit etre raccourcis en nombre de caractères.

Voui, mais il s'agit d'un événement sur la colonne AD qui se passe quand l'utilisateur saisit dans une seule cellule.
Aussi, quand l'utilisateur saisit dans une cellule de la colonne AD, il suffit de vérifier si la cellule correspondante de la colonne A est remplie... En même temps, je ne vois même pas pourquoi ça serait utile.

voilà le code :

Private Sub Worksheet_Change(ByVal Target As Range)

If Not Application.Intersect(Target, Range("AD:AD")) Is Nothing Then
If Len(Target) > 45 Then
Target.Value = Left(Target.Value, 45)
End If
End If
 
End Sub


et si tu veux vraiment vérifier au moment de la frappe si la cellule de la colonne A est remplie, ça donne ça :

Private Sub Worksheet_Change(ByVal Target As Range)

If Not Application.Intersect(Target, Range("AD:AD")) Is Nothing Then
If Len(Target) > 45 And Target.Offset(0,-29) <> "" Then
Target.Value = Left(Target.Value, 45)
End If
End If
 
End Sub


m@rina
Messages postés
25
Date d'inscription
lundi 5 juin 2006
Statut
Membre
Dernière intervention
11 novembre 2010
0
Merci
Bonjour Marina,

En effet maintenant que tu le fais remarquer, il m'est inutile de faire référence à la colonne "A", du coup je retiens ton premier code.

Cette fois le code gère bien le couper/copier/coller (sauf pour deux cellules simultanément) dans la colone "AD", mais pas la suppression de plus d'une cellule (remarque : je n'ai aucune erreur si les cases selectionnées, le sont avec "CTRL" + "Cellule par cellule") ainsi que le "copier" par "glisser" (lorsque je sélectionne une cellule et pour la copier sur celle du bas, je clique sur le petit carré de la cellule et je "glisse" en bas) : erreur de : "type mismatch".

Est-ce que vous auriez une idée sur comment éviter ces erreurs?
Sinon c'est pas grave, la macro marche deja tres bien et puis je pense que ces quelques petites contraintes sont acceptables.
Messages postés
25
Date d'inscription
lundi 5 juin 2006
Statut
Membre
Dernière intervention
11 novembre 2010
0
Merci
Alors là ...

MERCI BEAUCOUP!!! :)

Ca marche vraiment comme je voulais et sans aucune contrainte pour l'utilisateur, c'est vraiment excellent!

Merci beaucoup Marina et toi aussi Michel, d'avoir consacré "un peu" de votre temps pour mon problème!

Bonne soirée à vous!
Merci beaucoup pour tous ce que vous faites. Je suis sûr que cela rend service à un nombre incalculable de personnes comme moi.
Messages postés
1
Date d'inscription
mardi 23 juillet 2013
Statut
Membre
Dernière intervention
23 juillet 2013
0
Merci
Bonjour,

Tres interessant!

J ai un probleme similaire et je me demandais si qqun pouvait m assister.

En effet, j'ai 23000 lignes sur excel dont environ 3000 excedent 80 caracteres sur une colonne particuliere.

Le soucis c est que je voudrai modifier certains mots (toujours les memes) de ces 3000 lignes afin de respecter la restriction.

Si qqun sait comment faire, je vous remercie deja pour vos efforts!
Messages postés
15980
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
20 novembre 2019
2824
0
Merci
Bonjour,

23000 lignes la méthode va ^tre différente question de rapidité

MAIS
excedent 80 caracteres sur une colonne particuliere.

Le soucis c est que je voudrai modifier certains mots (toujours les memes) de ces 3000 lignes afin de respecter la restriction.


que veux tu dire?
mots vs caractères, certains mots =lesquels?
Action au coup par coup (nouvelle ligne) ou sur la totalité des 23000 lignes?

pour l'instant c'est on ne peut plus flou....

Michel