Testé avant poster. Aucun problème chez moi, les 0 non significatifs y sont.eriic
fait tes test tu verra que c'est pas aussi simple
Ensuite pour connaitre leur nombre c'est une simple différence de longueur de chaine.
Testé avant poster. Aucun problème chez moi, les 0 non significatifs y sont.eriic
fait tes test tu verra que c'est pas aussi simple
Ensuite pour connaitre leur nombre c'est une simple différence de longueur de chaine.
et en voila une belle
peu importe le nombre de caractères dans ta cellule 13,15,17,37,215,etc.....
tu aura toujours des séries de 2 puis la série de 3 a la fin
sans doute a améliorer
'exemple suivant une de tes dernieres reponses
' CN000000000000000 ' 17 caracteres dont 2 lettres
'CN0000000000000 ' 15 caracteres dont 2 lettres
'O000000000000 '13 caracteres dont 1 lettre
'0000000000000 ' 13 caracteres tout numeric
prévoir dans le cadre d'une amélioration une gestion d'erreur sur le len de la chaine tapée peut etre un test mod 2 sur le len (j'dis ca j'dis rien moi hein)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 Private Sub Worksheet_Change(ByVal Target As Range) Dim formatage$, chaine$, Fx# If Target.Column = 1 And Target.Cells.Count = 1 Then chaine = Target.Value If InStr(chaine, " ") = 0 Then Fx = (Len(chaine) / 2) - 1'pour obtenir le nombre de tranches -1 parce que on vire la derniere car elle est de 3 formatage = Application.Rept("@@ ", Round(Fx)) & "@@@"'creation du pattern(modele de formatage Target.Value = Trim(Format(chaine, formatage))'application du formatage End If End If End Sub
mes fichiers dans les contributions:
mail avec CDO en vba et mail avec CDO en vbs dans un HTA
survol des bouton dans userform
prendre un cliché d'un range
si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
et n'oublie pas de voter
Super Patrick, ça marche très bien. Je n'aurais jamais trouvé cette solution.
Désolé d'avoir tardé à répondre, mais je suis en convalescence suite à une grave maladie de ce fait je suis de repos l'après-midi. Je te présente toutes mes excuses.
Je ne pensais pas au départ que ma question fut aussi compliquée, plutôt la réponse.
Encore mille mercis à tous pour votre contribution.
Bonne fin de journée et bon weekend
Cordialement
René
J’entends et j’oublie,
Je vois et je me souviens,
Je fais et je comprends.
Confucius
Bonsoir,
J'ai commencé un code en début d'après-midi, mais dont je n'ai pa eu encore le temps de poster,
Je vois que c'est résolu, je le mettrai quand même dès que j'aurai accès à l'ordinateur.
PS : Patrick tu ne m'as toujours pas répondu
Cordialement
Ryu
La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein
Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple
Une fois votre problème solutionné pensez à mettre en n'oubliant pas d'indiquer qu'elle est la solution finale choisie
ton post22 chez moi visiblement ne tourne pas en boucle puisqu'après je peut sélectionner ailleurs mais par contre quand je veux fermer le fichier walouh!!! j'ai le cursor rond de seven qui tourne, qui tourne,, rrrrhhhhrrrhh pfiffff rrrrhhhhh piffff..........
et ma dernière soluce elle est pas belle hein ??
je te charge d y mettre une gestion sur un len en mod 2 =0
Amusez vous bien
mes fichiers dans les contributions:
mail avec CDO en vba et mail avec CDO en vbs dans un HTA
survol des bouton dans userform
prendre un cliché d'un range
si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
et n'oublie pas de voter
Re Patrick, RENE14,
Patrick : en effet ta dernière soluce et pal mal, mais il faudrait y mettre des gardes fous ... :
PS : tout d'abord, je suis complètement d'accord avec Eric, sur le fait que la colonne incriminée doit être formatée au format Texte
1 - dans le cas où tu tombes sur une cellule au format standard et que tu as une réf. commençant 0 ou 00 etc ..., ceux-ci vont disparaitre dans le résultat si la réf. est numérique.
2 - Si tu veux modifier une réf. déjà écrite en sélectionnant la partie à remplacer/incriminer (donc les espaces peuvent être sélectionnés aussi et remplacer par ce que tu écris), ton code ne fonctionne plus pour remettre la réf. corrigée decker
3 -Si tu supprimes la réf. dans la cellule, tu as une erreur qui survient
4 - si le nb de lettres/chiffres est inférieur à 3 (pour je ne sais quel raison), ça plante
Patrick, RENE14 :
Pour ma part j'ai préféré continuer sur le code que j'avais fait en début d'après-midi et sécuriser les parties ci-dessus
(dont le formatage se faisant à part dans le cas d'une cellule au format standard - je n'ai pas encore trouvé la solution pour l'intégrer dans un seul évènements)
PS: en plus de l'avoir essayé sur mon Mac je l'ai testé sur PC aussi Excel 2010 => pas de souci chez moi
Code Voilà le code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Column = 1 Then Target.NumberFormat = "@" End If End SubVoilà
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 Private Sub Worksheet_Change(ByVal Target As Range) Dim Txt$, NewTxt$, i&, n& If Target.Column = 1 And Target.Count = 1 Then Txt = Target.Value: If InStr(Txt, " ") Then Txt = Replace(Txt, " ", "") n = Len(Txt) - 3 If n >= 1 Then For i = n To 1 Step -2 If i = 1 Then NewTxt = Mid(Txt, i, 1) & " " & NewTxt Else NewTxt = Mid(Txt, i - 1, 2) & " " & NewTxt Next Target = Trim(NewTxt & Mid(Txt, n + 1)) End If End If End Sub
Cordialement
Ryu
La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein
Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple
Une fois votre problème solutionné pensez à mettre en n'oubliant pas d'indiquer qu'elle est la solution finale choisie
oui garde fou et gestion d'erreur je l'ai précisé dans ma réponse
je n'ai donné qu'un moteur faisant le boulot je te laisse ce soin
quand aux éventuelles reprises (sélection dans la chaine ca n'a pas été demandé et d'ailleurs ca me parait difficile de l'envisager dynamiquement comme le reste pour la simple et bonne raison qu'il n'existe pas d'évènement selection_sellength_change il faudrait un bouton ou une commande a cliquer ce qui rendrait le reste caduque autant tout faire alors avec cette commande et surtout ca ne correspondrait plus a la demande initiale
réfléchi avant d'énumérer des possibilités qui n'existe pas ou peuvent pas et qui ne correspondrait pas a la demande
ses terme ont été clairs
en gros il tape et ca se fait tout seul le reste n'est pas possible avec une cellule
il y a quand meme des possibilité qui pourraient s'aprocher de ce resultat pas completement mais pas loin
c'est l'evenement double clik qui remetrait la chaine sans espaces et qui permettrait de selectionner une partie pour la modifier
tu y pense maintenant j'y pense depuis le début
je te laisse plancher sur ce point je te montrerais mon exemple demain
après il faut être raisonnable c'est une mise en forme pas le programme tout entier
ajoute déjà le test sur empty ca règlera l'erreur déclenchée
rené14 attention ce n'est que le moteur ne le prends pas comme une solution finale il faut les gestions d'erreurs
mes fichiers dans les contributions:
mail avec CDO en vba et mail avec CDO en vbs dans un HTA
survol des bouton dans userform
prendre un cliché d'un range
si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
et n'oublie pas de voter
Coucou
C'est bien, de rappeler le message de demande..
Mais il convient alors de s'en rappeler également ceci, hein ...
Alors ? demande erronée (il semble que finalement oui) ?une macro qui modifierait automatiquement le format saisi en format texte
ou demande incomplète (il semble que finalement oui) ?
Voilà voilà ...
Bonne nuit
Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .
****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...
Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.
bonsoir jacques
non perso ca demande est claire maladroitement rédigé du sans doute au fait que rené ne métrise pas l'environnement VBA excel
j'attends toujours des explications pour ton format(xxxxx,string"0" ,"#") je pensait en avoir compris le sens et le role de chaque argument mais les test avec des lettres me font penser que mon interprétation est erronée
mes fichiers dans les contributions:
mail avec CDO en vba et mail avec CDO en vbs dans un HTA
survol des bouton dans userform
prendre un cliché d'un range
si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
et n'oublie pas de voter
Quoi ? Comment aurais-je pu écrire
qui n'a aucun sens !!!!
Code : Sélectionner tout - Visualiser dans une fenêtre à part format(xxxxx,string"0" ,"#")
Je pense que tu te réfère à
Relis donc mon message. Il disait que le reste était facile à deviner.
Code : Sélectionner tout - Visualiser dans une fenêtre à part Format(Range("A6").Value, "0" & String(12, "#"))
Tu n'en as deviné qu'une partie..
Je ne veux pas alourdir une discussion que j'estime déjà bien trop encombrée pour une futilité.
Amitiés
Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .
****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...
Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.
Patrick,
sélection dans la chaine ca n'a pas été demandé et d'ailleurs ca me parait difficile de l'envisager dynamiquementque fais ce bout de code :il y a quand meme des possibilité qui pourraient s'aprocher de ce resultat pas completement mais pas loin
c'est l'evenement double clik qui remetrait la chaine sans espaces et qui permettrait de selectionner une partie pour la modifier
il initialise le texte déjà formaté après la correction, comme au départ (quand tu écris la 1ère fois) en enlevant tous les espaces, et repasse dans la moulinette pour le re-formater correctement
Code : Sélectionner tout - Visualiser dans une fenêtre à part If InStr(Txt, " ") Then Txt = Replace(Txt, " ", "")
as tu essayé de modifié une réf. avec mon dernier code ??
PS : l'erreur est humaine, lorsque l'on écris dans un post un fichier excel, … etc , on peut se tromper, donc pouvoir corriger ce que l'on fait me parait normal, comme effacer une donnée (au lieu de planter - en plus si tu as plusieurs données à effacer je t'explique pas la galère)
Edit :en effet tu la précisé juste au dessus de ta capture, mais ça ne permet pas de faire la correction d'une réfoui garde fou et gestion d'erreur je l'ai précisé dans ma réponse
Cordialement
Ryu
La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein
Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple
Une fois votre problème solutionné pensez à mettre en n'oubliant pas d'indiquer qu'elle est la solution finale choisie
et voila maintenant la possibilité de corrigé ,supprimer, modifier
si la chaine a un nombre pair de caractères (ce qui est incompatible avec ce projet) un message t'en averti
utilisation de l'évènement double clik pour remettre la chaine sans espaces
l'erreur du len( chaine)=0 et du cells.count a été corrigé aussi
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Target.Column = 1 And Target.Cells.Count = 1 And Target.Value <> "" Then Application.EnableEvents = False Target.Value = Replace(Target.Value, " ", "") End If Application.EnableEvents = True End Sub Private Sub Worksheet_Change(ByVal Target As Range) Dim formatage$, chaine$, Fx# If Target.Cells.Count > 1 Then Exit Sub If Target.Column = 1 And Len(Target.Value) > 0 Then chaine = Target.Value If Len(Target.Value) Mod 2 = 0 And InStr(Target.Value, " ") = 0 Then MsgBox " il doit y a voir forcement un nombre impair de caracteres ": Exit Sub If InStr(chaine, " ") = 0 And Len(Target.Value) Mod 2 <> 0 Then Fx = (Len(chaine) / 2) - 1 'pour obtenir le nombre de tranches -1 parce que on vire la derniere car elle est de 3 formatage = Application.Rept("@@ ", Round(Fx)) & "@@@" 'creation du pattern(modele de formatage Target.Value = Trim(Format(chaine, formatage)) 'application du formatage End If End If End Sub
c'est cela que tu voulais ryu
mes fichiers dans les contributions:
mail avec CDO en vba et mail avec CDO en vbs dans un HTA
survol des bouton dans userform
prendre un cliché d'un range
si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
et n'oublie pas de voter
Bonjour à tous,
Je vois que ma discussion attire encore des solutions.
Mes références ne commenceront jamais par un zéro. Il n'y aura jamais moins de 13 caractères. Les références commencent soit par CN suivies de 11 ou 13 caractères numériques, O (O de Orange) suivies de 12 caractères numériques et en dernier une suite de 13 ou 15 caractères numériques, rien d'autres.
Merci beaucoup pour vos contributions.
Ps: j'ai modifié le code de Patrick en ajoutant une ligne qui empêche le bug si on efface le contenu de la cellule. J'ai fait plusieurs essais et je ne rencontre plus de soucis. A part si la référence débute par un zéro, mais cela ne risque pas d'arriver car il n'y a pas de référence commençant par zéro.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 Private Sub Worksheet_Change(ByVal Target As Range) Dim formatage$, chaine$, Fx# If Target.Column = 1 And Target.Cells.Value = "" Then Exit Sub If Target.Column = 1 And Target.Cells.Count = 1 Then chaine = Target.Value If InStr(chaine, " ") = 0 Then Fx = (Len(chaine) / 2) - 1 'pour obtenir le nombre de tranches -1 parce que on vire la derniere car elle est de 3 formatage = Application.Rept("@@ ", Round(Fx)) & "@@@" 'creation du pattern(modele de formatage) Target.Value = Trim(Format(chaine, formatage)) 'application du formatage End If End If End Sub
J’entends et j’oublie,
Je vois et je me souviens,
Je fais et je comprends.
Confucius
Dans la zone A4:A178 de mon tableau, j'ai des références saisies, elles sont toutes écrites en format texte. Ces références ont ce format "CN 00 00 00 00 000"; "O0 00 00 00 00 000" et "00 00 00 00 00 000".
Dans la zone F25:F97, il y a une zone de liste dans chaque cellule, elles font appel aux références saisies dans A4:A178.
J'aimerai mettre en place, si cela est possible bien entendu, une macro qui modifierait automatiquement le format saisi en format texte.
Par exemple : je saisie CN01010203004, je souhaite que le format soit en texte CN 01 01 02 03 004 dans la cellule. Idem pour les autres formats (O102030405006 - O1 02 03 04 05 006; 0000000000000 - 00 00 00 00 00 000)Mes références ne commenceront jamais par un zéro. Il n'y aura jamais moins de 13 caractères. Les références commencent soit par CN suivies de 11 ou 13 caractères numériques, O (O de Orange) suivies de 12 caractères numériques et en dernier une suite de 13 ou 15 caractères numériques, rien d'autres.Chercher les causes de perte de temps, donc ...A part si la référence débute par un zéro, mais cela ne risque pas d'arriver car il n'y a pas de référence commençant par zéro.
Y compris les "efforts" pour passer au format texte (forcément alors imposé automatiquement)
Combien de pages et de messages, déjà ?
Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .
****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...
Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.
rené la gestion du vide y était déjà dans mon dernier post #72
j'ai aussi apporté la possibilité de revenir dessus en cas de besoins de modification d'une partie ou une autre
Code : Sélectionner tout - Visualiser dans une fenêtre à part If Target.Column = 1 And Len(Target.Value) > 0 Then
d'autant plus que ceci me parait pas très catholique dans cet exercice
au mieux j'aurais mis juste après les déclarations de variables
Code : Sélectionner tout - Visualiser dans une fenêtre à part And Target.Cells.Value = ""
Code : Sélectionner tout - Visualiser dans une fenêtre à part if target(1).value="" then exit sub
mes fichiers dans les contributions:
mail avec CDO en vba et mail avec CDO en vbs dans un HTA
survol des bouton dans userform
prendre un cliché d'un range
si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
et n'oublie pas de voter
Je suis désolé si je vous ai fais perdre du temps. Pour celui qui demande, la vision du résultat est probante, mais pas toujours facile à exprimer au prime abord. J'avais commencé il y a quelque temps à me familiariser avec VBA mais de graves ennuis de santé m'ont obligé à revoir ma copie depuis les fondamentaux.
Je vous remercie encore mille fois et vous réitère mes excuses pour mon manque de clarté dans ma demande initiale.
René
J’entends et j’oublie,
Je vois et je me souviens,
Je fais et je comprends.
Confucius
re
de rien
et bon rétablissement
mes fichiers dans les contributions:
mail avec CDO en vba et mail avec CDO en vbs dans un HTA
survol des bouton dans userform
prendre un cliché d'un range
si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
et n'oublie pas de voter
Re,
C'est clair Jacques, avec les infos disséminées sur les 4 pages au lieu de tout avoir sur le 1er post …
RENE14 : Pas de souci, ça peut arriver, mais au moins tu sais ce que tu devra faire la prochaine fois => donner des explications claires et exhaustives, avec tout les tenants et aboutissants et le but final; et ce, dès le 1er post
Donc bien prendre le temps de rédiger en se relisant et en se posant les bonnes questions afin de savoir si tout est clair et que rien n'a été omis
je te souhaite un bon rétablissement
Patrick,
désolé pas eu le temps de te répondre (seul avec les enfants)
j'ai vu qq petits truc sur ton code en post #72 mais bon on va pas pinaillé;
pour faire court, j'ai fait un mixte de ton code (qui est déjà bien ) avec le mien et les dernières infos (on considère que la colonne est déjà au format texte)
Je le vois plutôt comme cela et même pour la correction qui est plus simple de cette manière
Code ce qui donne : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 Private Sub Worksheet_Change(ByVal Target As Range) Dim formatage$, chaine$, Fx# If Target.Column = 1 And Target.Count = 1 Then chaine = Target.Value: If chaine = "" Then Exit Sub Else If InStr(chaine, " ") Then chaine = Replace(chaine, " ", "") If Len(chaine) = 13 Or Len(chaine) = 15 Then Fx = (Len(chaine) / 2) - 1 'pour obtenir le nombre de tranches -1 parce que on vire la derniere car elle est de 3 formatage = Application.Rept("@@ ", Round(Fx)) & "@@@" 'creation du pattern(modele de formatage Target.Value = Trim(Format(chaine, formatage)) 'application du formatage Else MsgBox "Nombres de caractères/chiffres incorrects": Application.Goto Target: Exit Sub End If End If End Sub
Cordialement
Ryu
La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein
Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple
Une fois votre problème solutionné pensez à mettre en n'oubliant pas d'indiquer qu'elle est la solution finale choisie
je n'ai pas testé mais je crois deviner que tu utilise "chaine" pour ne pas avoir le retour de l'évènement change c'est ca
je suis pas sur que ca fonctionne je vais tester
et c'est pas 13 ou 15 mais 13,15 ou 17 les 13 pouvant avoir une lettre ou pas
mes fichiers dans les contributions:
mail avec CDO en vba et mail avec CDO en vbs dans un HTA
survol des bouton dans userform
prendre un cliché d'un range
si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
et n'oublie pas de voter
ok j'ai testé ca fonctionne aussi mais j'ai virer le if len 13 ou 15 et rempler par mon code original
Code : Sélectionner tout - Visualiser dans une fenêtre à part if len(chaine) mod 2<>0
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 Private Sub Worksheet_Change(ByVal Target As Range) Dim formatage$, chaine$, Fx# If Target.Column = 1 And Target.Count = 1 Then chaine = Target.Value: If chaine = "" Then Exit Sub Else If InStr(chaine, " ") Then chaine = Replace(chaine, " ", "") If Len(chaine) Mod 2 <> 0 Then Fx = (Len(chaine) / 2) - 1 'pour obtenir le nombre de tranches -1 parce que on vire la derniere car elle est de 3 formatage = Application.Rept("@@ ", Round(Fx)) & "@@@" 'creation du pattern(modele de formatage Target.Value = Trim(Format(chaine, formatage)) 'application du formatage Else MsgBox "Nombres de caractères/chiffres incorrects": Application.Goto Target: Exit Sub End If End If End Sub
mes fichiers dans les contributions:
mail avec CDO en vba et mail avec CDO en vbs dans un HTA
survol des bouton dans userform
prendre un cliché d'un range
si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
et n'oublie pas de voter
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager