[VBA] formatage string

formatage string [VBA] - VB/VBA/VBS - Programmation

Marsh Posté le 26-10-2017 à 23:45:24    

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
Reply

Marsh Posté le 26-10-2017 à 23:45:24   

Reply

Marsh Posté le 27-10-2017 à 20:56:38    

Bonjour,
 

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



---------------
Cordialement, Patrice
Reply

Marsh Posté le 28-10-2017 à 12:29:04    

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

Reply

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 ?

Reply

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


Message édité par Marc L le 28-10-2017 à 14:51:11
Reply

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
 

Reply

Marsh Posté le 28-10-2017 à 15:46:25    

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

Reply

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


 

Reply

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 !  :sol:  
 

Reply

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

Reply

Marsh Posté le 28-10-2017 à 19:35:22   

Reply

Marsh Posté le 28-10-2017 à 19:50:54    

 
            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 …
 

Reply

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 !

Reply

Marsh Posté le 29-10-2017 à 09:43:40    

Bonjour,
 
Tu peux aussi faire simplement :
 

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


---------------
Cordialement, Patrice
Reply

Marsh Posté le 29-10-2017 à 12:23:44    

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

Reply

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

Reply

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

Reply

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 …
 

Reply

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 ?
 
 
 

Reply

Marsh Posté le 29-10-2017 à 13:58:24    

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
Reply

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

Reply

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


 


---------------
Cordialement, Patrice
Reply

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

Reply

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

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

Reply

Marsh Posté le 31-10-2017 à 15:53:30    

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 …
 

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed