Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

pb, manipulation sur string

  • Initiateur de la discussion bellenger florian
  • Date de début
B

bellenger florian

Guest
bonjour à tous,


un de mes collègue a un petit problème sous excel.


Voici de quoi il retourne:


Il voudrait tranformer des valeurs de cellules sous excel, en insérant un caractère ':' entre chaque couple de caractère de la chaîne de caractère représentée par la valeur de la cellule.


Par exemple, il voudrait qu'une cellule contenant "211187" contienne "21:11:87"


Et il voudrait effectuer cette tranformation, qu'il aura sans doute à refaire plusieurs fois, sur un ensemble de cellule.

Connaitriez-vous une solution sous excel?


Sinon, dans l'optique de créer une macro sous vba, je me demandais s'il etait possible d'écrire une fonction string toto (string) qui ferait la transformation correspondante

toto(4578)= 45:78
toto(46565165)=46:56:51:65

etc.

A mon avis, la solution était de pouvoir manipuler individuellement chaque caractère de la chaîne à partir de son indice-place dans la chaîne, mais je n'ai pas réussi à trouver une fonction coreespondante.


auriez-vous plus de chance que moi?

Je vous remercie par avance de votre aide.

Florian
 
J

Jean-Marie

Guest
Bonjour, Florian

Voici deux formules :
pour un cadrage à gauche
=TEXTE(A1;"##"&REPT(CAR(34)&":"&CAR(34)&"##";ENT(NBCAR(A1)/2)-1))

pour un cadrage à droite
=TEXTE(A1;"##"&REPT(CAR(34)&":"&CAR(34)&"##";ENT((NBCAR(A1)+1)/2)-1))

La fonction TEXTE transforme une valeur numérique en texte alphanumérique, suivant le format (2ème argument).

La fonction REPT renvoie une chaîne de caractères, qui correspond à X fois le 1er argument

La fonction NBCAR(A1), retourne le nombre de caractères contenu dans la cellule A1.

Le CAR(34) correspond au symbole " . (REPT("&":"&"&"##";....)

Si tu veux d'autres explications, n'hésite pas

Bonne fin de journée

@+Jean-Marie
 
B

bellenger florian

Guest
Bonjour,


je voulais te remercier pour ton aide et poser une dernière petite question.

Voilà, comme je veux mettre la formule transformée à la place de A1, j'ai un problème de référence circulaire


De plus, comme je devrais me servir plusieurs fois de la dite formule , j'ai essayé de l'incorporer dans une macro (avec l'outils enregistreur de macro), puis en remplaçant A1 par R[0]C[0] pour avoir une macro plus générale

[ActiveCell = "=TEXT(R[0]C[0],""##""&REPT(CHAR(34)&"":""&CHAR(34)&""##"",INT(LEN(R[0]C[0])/2)-1))"]




donc, pour éliminer le problème de la référence circulaire, je me suis dit qu'il fallait introduire non pas la formule(Activecell ) dans Activecell mais directement le résultat de son exécution.

D'où la question qui (enfin) finit par arriver:

Existe-t-il une moyen de forcer l'éxécution d'une formule sous vba excel?

je vous remercie encore de l'aide que vous m'apportez et j'espère ne pas abuser de votre patience.


Florian
 
J

Jean-Marie

Guest
Bonjour, Florian

Ouvre le fichier transmis, ouvre ton fichier des données, sélectionne les cellules ou plages de cellules, retourne dans le fichier transmis, et clique sur le rectangle, la macro-commande fera le reste.

@+Jean-Marie
 

Pièces jointes

  • formatparticulier.zip
    3 KB · Affichages: 28
B

bellenger florian

Guest
Bonjour,


merci pour ton fichier, je n'en attendais pas temps.



J'ai encore quelques petits problèmes au moment de l'exécution, je vais essayer de regarder ça plus en détail et je te tiens au courant.



Florian
 
B

bellenger florian

Guest
Bonjour,

je n'ai pas (pour l'instant) résolu tous les problèmes d'exécution de ta macro-commande,


en revanche,en travaillant sur autre chose, j'ai trouvé un autre moyen d'aborder le problème:


Function tt(s As String) 'transforme la valeur de s en insérant ":" tous les 2 caractères

Dim p(2) As String
Dim temp As String

If Strings.Len(s) = 1 Or Strings.Len(s) = 0 Then
tt = s

Else

p(0) = Strings.Left$(s, 2)
p(1) = tt(Strings.Right$(s, Strings.Len(s) - 2))



tt = Strings.Join(p, ":")
tt = Strings.Left$(tt, Strings.Len(tt) - 1)

If p(1) = "" Then
tt = Strings.Left$(tt, Strings.Len(tt) - 1)
End If

End If

End Function


Sub tt_main() 'parcours toutes les cellules sélectionnées
Attribute tt_main.VB_ProcData.VB_Invoke_Func = "h\n14"

Dim cas As Range
Dim feuille As Worksheet


For Each feuille In ActiveWorkbook.Sheets 'parcours toutes les feuilles du classeur

feuille.Activate


For Each cas In Selection.Cells 'parcours toutes les cellules sélectionner
cas.Value = tt(cas.Value)'modifie contenu cellule
Next

Next


End Sub

Amicalement,

florian
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…