Rechercher : dans
Par :

Excel : Limiter nombre caractère à saisir

Dernière réponse le 26 jan 2009 à 17:17:48 stranger-46, le 23 jan 2009 à 12:15:28 
 Signaler ce message aux modérateurs

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 :)

Si tu ne sais pas demande, si tu sais partage.

Configuration: Windows XP
Internet Explorer 6.0

Meilleures réponses pour « Excel : Limiter nombre caractère à saisir » dans :
Liste déroulante avec saisie semi automatique pour EXCEL VoirC'est une procédure qui demande un investissement personnel et qui n'est pas nécessairement facile à comprendre et à réaliser dès la première fois. Afin de rendre cette astuce facile à utiliser, nous allons employer les plages et les formules...
Compter les mots dans un document (OpenOffice.org ou Word) VoirIl est parfois utile de pouvoir compter le nombre de mots ou de caractères dans un document. Les deux principales suites bureautiques permettent de le faire très simplement : Avec Word Avec OpenOffice.org Avec Word Ouvrez votre document...
Générer des nombres aléatoires efficacement avec rand() VoirGénérer des nombres aléatoires efficacement avec rand() Vous avez peut-être remarqué qu'en C, en utilisant la fonction rand() de la bibliothèque standard, vous obtenez des résultats décevants, trop souvent les mêmes. Prenons un exemple, vous...
Tableur - La saisie de données VoirSAISIE DE DONNEES LITTERALES Vous êtes prêt à entrer des données dans votre feuille de calcul. Nous vous déconseillons toutefois de le faire avant d’avoir réfléchi soigneusement à ce que vous voulez obtenir : de façon générale, mieux vaut bâtir sur...
Javascript - Les chaînes de caractères VoirQu'est-ce qu'une chaîne de caractère Une chaîne de caractère est, comme son nom l'indique, une suite de caractères. On la représente par la suite de caractères encadrée par des guillemets simples (') ou doubles ("), sachant que les deux types de...
VBScript - Les fonctions de chaînes de caractères VoirLes fonctions de chaînes de caractères Fonction Description Filter(InputStrings, Value[, Include[, Compare]]) Sélectionne des chaînes de caractères parmi un tableau de chaînes...

1

michel_m, le 23 jan 2009 à 12:21:35
  • +1

Bonjour,

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

voili-voilou Je ne réponds pas à des questions techniques par message privé
Cordialement, Michel

Répondre à michel_m

2

stranger-46, le 23 jan 2009 à 13:47:02
  • +1

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 :)


Si tu ne sais pas demande, si tu sais partage.

Répondre à stranger-46

3

michel_m, le 23 jan 2009 à 14:21:06

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... Je ne réponds pas à des questions techniques par message privé
Cordialement, Michel

Répondre à michel_m

5

m@rina, le 23 jan 2009 à 14:28:58

Hello Michel !

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

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

Bizz
A ++ ;)

m@rina Inutile de me poser des questions en MP... 
Définitivement je n'y réponds pas... Le forum est fait pour ­ça.

Répondre à m@rina

4

m@rina, le 23 jan 2009 à 14:24:45

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

Inutile de me poser des questions en MP... 
Définitivement je n'y réponds pas... Le forum est fait pour ça.

Répondre à m@rina

6

stranger-46, le 23 jan 2009 à 15:57:45

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



Si tu ne sais pas demande, si tu sais partage.

Répondre à stranger-46

7

m@rina, le 23 jan 2009 à 16:37:59

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 Inutile de me poser des questions en MP... 
Définitivement je n'y réponds pas... Le forum est fait pour ­ça.

Répondre à m@rina

8

michel_m, le 23 jan 2009 à 16:39:44

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 Le forum est basé sur le partage de connaissances:Je ne réponds pas à des questions techniques par message privé.Cordialement, Michel

Répondre à michel_m

9

michel_m, le 23 jan 2009 à 16:40:48

Et bing, une bosse!
Bizous Marina Le forum est basé sur le partage de connaissances:Je ne répo­nds pas à des questions techniques par message privé.Cordial­ement, Michel

Répondre à michel_m

10

stranger-46, le 23 jan 2009 à 17:17:15

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 ...
Si tu ne sais pas demande, si tu sais partage.

Répondre à stranger-46

11

m@rina, le 23 jan 2009 à 19:58:47

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
Inutile de me poser des questions en MP... 
Définitivement je n'y réponds pas... Le forum est fait pour ça.

Répondre à m@rina

12

stranger-46, le 26 jan 2009 à 08:33:16

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.
Si tu ne sais pas demande, si tu sais partage.

Répondre à stranger-46

13

m@rina, le 26 jan 2009 à 10:44:22
  • +2

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
Inutile de me poser des questions en MP... 
Définitivement je n'y réponds pas... Le forum est fait pour ça.

Répondre à m@rina

14

 stranger-46, le 26 jan 2009 à 17:17:48

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!
Si tu ne sais pas demande, si tu sais partage.

Répondre à stranger-46