Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2759 connectés 

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  [VBA] formatage string

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[VBA] formatage string

n°2307023
daniel-12
Posté le 26-10-2017 à 23:45:24  profilanswer
 

Code :
  1. Sub formatttt()
  2. Dim resultat As String
  3. resultat = "D11122222000"
  4. Debug.Print Format(resultat, "?### ##### ###";)
  5. End Sub


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
mood
Publicité
Posté le 26-10-2017 à 23:45:24  profilanswer
 

n°2307053
patrice337​40
Avec la réponse, c'est facile.
Posté le 27-10-2017 à 20:56:38  profilanswer
 

Bonjour,
 

Code :
  1. Debug.Print Left(resultat, 1) & Format(Mid(resultat, 2), "#### ##### ###" )



---------------
Cordialement, Patrice
n°2307057
Marc L
Posté le 28-10-2017 à 12:29:04  profilanswer
 

 
            Bonjour, bonjour !
 
            Debug.Print Format("D11122222000", "@@@@ @@@@@ @@@" )
 
            Voilà, voilà !
 

n°2307061
daniel-12
Posté le 28-10-2017 à 14:10:11  profilanswer
 

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 ?

n°2307062
Marc L
Posté le 28-10-2017 à 14:47:02  profilanswer
 

 
            É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, …)


Message édité par Marc L le 28-10-2017 à 14:51:11
n°2307063
daniel-12
Posté le 28-10-2017 à 15:35:46  profilanswer
 

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
 

n°2307065
daniel-12
Posté le 28-10-2017 à 15:46:25  profilanswer
 

Code :
  1. Sub formatt()
  2. resultat = "D53112345123123"
  3. If Len(resultat) = 8 Then Debug.Print Format(resultat, "@@@@ @@@@" )
  4. If Len(resultat) = 9 Then Debug.Print Format(resultat, "@@@@ @@@@@" )
  5. If Len(resultat) = 10 Then Debug.Print Format(resultat, "@@@@ @@@@@ @" )
  6. If Len(resultat) = 11 Then Debug.Print Format(resultat, "@@@@ @@@@@ @@" )
  7. If Len(resultat) = 12 Then Debug.Print Format(resultat, "@@@@ @@@@@ @@@" )
  8. If Len(resultat) = 13 Then Debug.Print Format(resultat, "@@@@ @@@@@ @@@@" )
  9. If Len(resultat) = 14 Then Debug.Print Format(resultat, "@@@@ @@@@@ @@@@@" )
  10. If Len(resultat) = 15 Then Debug.Print Format(resultat, "@@@@ @@@@@ @@@@@@" )
  11. End Sub


cela fonctionne
j'espérai simplement avoir une formulation possible plus simple, en 1 ligne

n°2307077
Marc L
Posté le 28-10-2017 à 19:00:44  profilanswer
 

 
             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 :
  1. Sub Demo1()
  2.    For Each V In [{"D11122222000","D53112345123123","D12313245"}]
  3.        Debug.Print V; Tab(20); "->   "; Format(V, Left("@@@@ @@@@@ @@@@@@", Len(V)))
  4.    Next
  5. End Sub


 

n°2307078
Marc L
Posté le 28-10-2017 à 19:12:55  profilanswer
 

 
          Autre effort à produire :  trouver l'erreur dans mon exemple ci-dessus puis proposer une parade, bon week-end !  :sol:  
 

n°2307079
daniel-12
Posté le 28-10-2017 à 19:35:22  profilanswer
 

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

mood
Publicité
Posté le 28-10-2017 à 19:35:22  profilanswer
 

n°2307081
Marc L
Posté le 28-10-2017 à 19:50:54  profilanswer
 

 
            Pas besoin d'adaptation particulière mais juste poser et appliquer la simple Logique :
 

Code :
  1. Sub Demo2()
  2.         Dim L&, S$
  3.    For Each V In [{"D23456789","D234567890","D23456789012345","D2345678","D234567","D234567890123456"}]
  4.                    L = Len(V)
  5.        Select Case L
  6.               Case 8 To 15:  S = Format$(V, Left$("@@@@ @@@@@ ", L + 1))
  7.               Case Else:     S = Chr$(19)
  8.        End Select
  9.                    Debug.Print V; Tab(20); "->   "; S
  10.    Next
  11. End Sub


            L'effort fait les forts …
 

n°2307086
daniel-12
Posté le 28-10-2017 à 22:37:47  profilanswer
 

ton code fonctionne en effet, mais trop complexe pour moi
merci, car certains détails me sont utiles !

n°2307091
patrice337​40
Avec la réponse, c'est facile.
Posté le 29-10-2017 à 09:43:40  profilanswer
 

Bonjour,
 
Tu peux aussi faire simplement :
 

Code :
  1. Debug.Print Left(resultat, 1) & StrReverse(Format(StrReverse(Mid(resultat, 2)), "# ##### ####" ))


---------------
Cordialement, Patrice
n°2307095
Marc L
Posté le 29-10-2017 à 12:23:44  profilanswer
 

daniel-12 a écrit :

ton code fonctionne en effet, mais trop complexe pour moi
merci, car certains détails me sont utiles !


             Et pourtant concernant le formatage sa « formulation est simple, en 1 ligne » …
 

n°2307098
daniel-12
Posté le 29-10-2017 à 12:42:16  profilanswer
 

ç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

n°2307099
Marc L
Posté le 29-10-2017 à 12:49:04  profilanswer
 

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

n°2307100
Marc L
Posté le 29-10-2017 à 12:52:46  profilanswer
 

 
             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 …
 

n°2307102
daniel-12
Posté le 29-10-2017 à 13:46:01  profilanswer
 

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 ?
 
 
 

n°2307103
patrice337​40
Avec la réponse, c'est facile.
Posté le 29-10-2017 à 13:58:24  profilanswer
 

daniel-12 a écrit :

ç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


 
Une solution simple en mettant simplement un argument a format :

Code :
  1. Sub formatt()
  2.   resultat = "D53112345123123"
  3.   Debug.Print StrReverse(Format(StrReverse(resultat), "@@@@@@@@ @@@@@ @@@@@" ))
  4. End Sub


Message édité par patrice33740 le 29-10-2017 à 13:58:57

---------------
Cordialement, Patrice
n°2307106
daniel-12
Posté le 29-10-2017 à 14:36:19  profilanswer
 

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

n°2307108
patrice337​40
Avec la réponse, c'est facile.
Posté le 29-10-2017 à 15:07:20  profilanswer
 

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 :
  1. Debug.Print StrReverse(Format(StrReverse(resultat), StrReverse("@@@@@ @@@@@ @@@@@@@@@" )))


 


---------------
Cordialement, Patrice
n°2307155
Marc L
Posté le 31-10-2017 à 11:38:11  profilanswer
 

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é …
 

n°2307158
Marc L
Posté le 31-10-2017 à 12:30:30  profilanswer
 

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


Code :
  1. Sub Demo3()
  2.      Dim F$(8 To 15)
  3.    For N% = 8 To 15:  F(N) = Left$("@@@@ @@@@@ ", N + 1):  Next
  4.    
  5.    S$ = "D234567890"
  6.    Debug.Print Format(S, F(Len(S)))
  7. End Sub

            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 …


Message édité par Marc L le 31-10-2017 à 12:34:09
n°2307161
daniel-12
Posté le 31-10-2017 à 13:57:41  profilanswer
 

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

n°2307166
Marc L
Posté le 31-10-2017 à 15:53:30  profilanswer
 

daniel-12 a écrit :

ça par exemple cela ne passait pas
For Each V In [{"D23456789","D234567890","D23456789012345","D2345678","D234567","D234567890123456"}]


            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 …
 

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  [VBA] formatage string

 

Sujets relatifs
comparaison string perlSimplifier une ligne de push_back (string) répétitifs
Convertir binaire en string (noob) [résolu][Python] Replace string tuple
[C++11] fonction renvoyant une reference sur un tableau de 10 stringunrecognized character in %c format string %c
Convertir un string en nom de variable ? (parseJSON)Convertir un String en Date
equivalence mysql_escape_string en PDO[Excel] Generalite formatage d'une cellule en String
Plus de sujets relatifs à : [VBA] formatage string


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR