formatage string [VBA] - VB/VBA/VBS - Programmation
Marsh Posté le 27-10-2017 à 20:56:38
Bonjour,
Code :
|
Marsh Posté le 28-10-2017 à 12:29:04
Bonjour, bonjour !
Debug.Print Format("D11122222000", "@@@@ @@@@@ @@@" )
Voilà, voilà !
Marsh Posté le 28-10-2017 à 14:10:11
Merci
vos 2 méthode fonctionnent mais à condition que le nombre de caractères soit le bon
pour info le format exact de la string est
1lettre +
3 chiffres accolés à la lettre
1 espace, tiret, point ou rien (qui je supprime avant d'en arriver a ce stade)
5 chiffres
1 espace, tiret, point ou rien (qui je supprime avant d'en arriver a ce stade)
3 chiffres (dans 90% des cas)
je veux la mettre en forme, pour détecter visuellement les erreurs
Debug.Print Format("D12313245", "@@@@ @@@@@ @@@"
Debug.Print Format("D12313245123", "@@@@ @@@@@ @@@"
Debug.Print "pas bon"
Debug.Print Format("D1231324", "@@@@ @@@@@ @@@"
Debug.Print Format("D123132451", "@@@@ @@@@@ @@@"
Debug.Print Format("D123132451324", "@@@@ @@@@@ @@@"
cela me donne :
D 12313 245 j'aurais préféré D123 13245
D123 13245 123 j'aurais préféré D123 13245 123
pas bon
D1231 324 j'aurais préféré D123 1324
D1 23132 451 j'aurais préféré D123 13245 1
D123 13245 1324 j'aurais préféré D123 13245 1324
comment forcer le formatage en partant de la gauche ?
Marsh Posté le 28-10-2017 à 14:47:02
Évidemment ma réponse correspond uniquement à l'exposé initial, ne pouvant deviner les non dits ‼
C'est pourtant simple : faire correspondre mon format de base avec la longueur du texte à formater
via les fonctions traitant du texte comme indiqué dans l'aide VBA interne. (Left, Len, …)
Marsh Posté le 28-10-2017 à 15:35:46
ok, donc tu ne vois pas de paramètres à mettre sur format pour lui imposer d'écrire 4+5+(éventuellement)3 caractères en partant de la gauche
pour qu'il ne m'affiche pas cela
D 12313 245
D1231 324
D1 23132 451
si ce n'est pas faisable, pas grave
je peux détecter la longueur totale de 9 ou 12 caractère(seuls valides), et signaler le problème à ce stade
Marsh Posté le 28-10-2017 à 15:46:25
Code :
|
cela fonctionne
j'espérai simplement avoir une formulation possible plus simple, en 1 ligne
Marsh Posté le 28-10-2017 à 19:00:44
C'est dommage avec ce p'tit effort avec Len d'avoir oublié la moitié de mon explication : où est donc la fonction Left ?‼
Les If sont inutiles car en une ligne il suffit d'utiliser la fonction Left conditionnée à la longueur de la chaine au sein de Format …
Vu l'effort, pour cette fois :
Code :
|
Marsh Posté le 28-10-2017 à 19:12:55
Autre effort à produire : trouver l'erreur dans mon exemple ci-dessus puis proposer une parade, bon week-end !
Marsh Posté le 28-10-2017 à 19:35:22
les 2 imbriqués l'un dans l'autre me perturbe !
je n'arrive pas trop a comprendre, et même si j'y arrive, je ne serai pas en capacité de le recomprendre facilement plus tard
ton code tel quel ne fonctionne pas, mais cela va avec une adaptation
le soucis qu'il reste est pour ce cas de figure D531123451
logiquement je devrais avoir en retour D531 12345 1
mais non
tous les cas de figure fonctionnent sauf un
D5311234 -> D531 1234
D53112345 -> D531 12345
D531123451 -> D531 123451 => pas bon
D5311234512 -> D531 12345 12
D53112345123 -> D531 12345 123
D531123451231 -> D531 12345 1231
D5311234512312 -> D531 12345 12312
D53112345123123 -> D531 12345 123123
Merci pour l' @, avec quelques adaptations je m'en sortirai
Marsh Posté le 28-10-2017 à 19:50:54
Pas besoin d'adaptation particulière mais juste poser et appliquer la simple Logique :
Code :
|
L'effort fait les forts …
Marsh Posté le 28-10-2017 à 22:37:47
ton code fonctionne en effet, mais trop complexe pour moi
merci, car certains détails me sont utiles !
Marsh Posté le 29-10-2017 à 09:43:40
Bonjour,
Tu peux aussi faire simplement :
Code :
|
Marsh Posté le 29-10-2017 à 12:23:44
daniel-12 a écrit : ton code fonctionne en effet, mais trop complexe pour moi |
Et pourtant concernant le formatage sa « formulation est simple, en 1 ligne » …
Marsh Posté le 29-10-2017 à 12:42:16
ça fonctionne, oui
mais il y a trop de fonctions imbriquées dans la même ligne
vous ne trouvez pas ?
quand j'ai posé la question au début, j’imaginais qu'il y avait une solution simple en mettant simplement un argument a format
Marsh Posté le 29-10-2017 à 12:49:04
Juste lire l'aide VBA interne concernant cette fonction …
On ne peut pas faire plus simple vu le format conditionné par la longueur.
Sinon ta p'tite usine à gaz avec un If par condition (voir mieux via un Select Case) …
Marsh Posté le 29-10-2017 à 12:52:46
Variante faisant moins usine à gaz :
utiliser une variable tableau bornée entre la plus petite longueur et la plus grande longueur
contenant chaque format associé à une longueur.
Lors du formatage utiliser cette variable tableau avec pour indice la longueur du texte à formater …
Marsh Posté le 29-10-2017 à 13:46:01
mon usine à gaz le mérite d'être lisible facilement, c'est déjà ça !
dans ce cas de figure select case ou if, ça ce vaut non ?
Marsh Posté le 29-10-2017 à 13:58:24
daniel-12 a écrit : ça fonctionne, oui |
Une solution simple en mettant simplement un argument a format :
Code :
|
Marsh Posté le 29-10-2017 à 14:36:19
a vrai dire je pensais qu'on pouvait y arriver en jonglant avec les @ & !
https://msdn.microsoft.com/fr-fr/vb [...] plications
le faire avec 2 reverses, c'est quand même pas ce qu'il y a de mieux pour faciliter la lecture
ta dernière proposition fonctionne en tout cas comme souhaité
merci
Marsh Posté le 29-10-2017 à 15:07:20
daniel-12 a écrit : [...] le faire avec 2 reverses, c'est quand même pas ce qu'il y a de mieux pour faciliter la lecture [...] |
Pour faciliter la lecture, il suffit d'un 3ème reverse :
Code :
|
Marsh Posté le 31-10-2017 à 11:38:11
daniel-12 a écrit : dans ce cas de figure select case ou if, ça ce vaut non ? |
Le résultat est le même mais mieux structuré via Select Case et souvent meilleure lisibilité …
Marsh Posté le 31-10-2017 à 12:30:30
S'il s'agit de convertir plusieurs textes alors ceci a de l'intérêt :
Marc L a écrit : Variante faisant moins usine à gaz : |
Code :
|
Là j'ai fait simple en ne convertissant qu'un texte car tu avais l'air perdu avec mes exemples précédents te semblant trop compliqués …
Marsh Posté le 31-10-2017 à 13:57:41
perdu je ne sais pas,
mais VBA n'en voulait pas tel que c'était écrit
ça par exemple cela ne passait pas
For Each V In [{"D23456789","D234567890","D23456789012345","D2345678","D234567","D234567890123456"}]
tu gagnes quelque lignes dans le code final, c'est vrai
dans mon cas, c'est les longueur de texte de 8 a 13 qui' m’intéresse
dont en 6 lignes c'est joué, et visible comme le nez au milieu de la figure
ça a sont coté pratique !
tes propositions restent néanmoins intéressantes et instructives
Marsh Posté le 31-10-2017 à 15:53:30
daniel-12 a écrit : ça par exemple cela ne passait pas |
C'est pourtant du standard Excel !
Cette boucle servant juste à simuler divers cas, tu peux remplacer l'évaluation de la matrice (voir l'aide VBA d'Evaluate)
par la fonction Split sur une chaine avec un espace comme séparateur des différents textes.
Ou encore ne pas utiliser de boucle et juste tester un texte comme dans ma dernière démonstration …
Marsh Posté le 26-10-2017 à 23:45:24
Bonsoir
afin de faciliter la lecture d'une string, je voudrais la formater lors de l'affichage
j'ai cela D11122222000
je voudrais que le programme m'affiche cela =>D111 22222 000
savez vous comment formuler la fonction format ?
j'ai éssayée ? # $ @, rien de concluant
Message édité par daniel-12 le 29-10-2017 à 12:44:50