Insérer un tiret tous les 3 caractères

Fermé
Carol - 1 sept. 2011 à 13:28
ccm81 Messages postés 10905 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 27 décembre 2024 - 1 sept. 2011 à 17:05
Bonjour,

Je travaille dans un fichier excel et je cherche à insérer automatiquement (via macro ou autre) un tiret - tous les 3 caractères dans des suites de caractères de nombre variable.

AAAYYYFFFGGGRRR doit devenir AAA-YYY-FFF-GGG-RRR

Merci d'avance pour vos conseils,

Carol
A voir également:

4 réponses

Voilà à condition que AAAYYYFFFGGGRRR soit en C6 !!!

=GAUCHE(C6;3) & "-" &GAUCHE(DROITE(C6;12);3) & "-" &GAUCHE(DROITE(C6;9);3) & "-" &GAUCHE(DROITE(C6;6);3) & "-" &DROITE(C6;3)
0
cousinhub29 Messages postés 982 Date d'inscription mardi 10 août 2010 Statut Membre Dernière intervention 7 janvier 2025 348
1 sept. 2011 à 14:17
Bonjour,

Par code macro :

(Plage à adapter)

Sub tirets()
Dim Cel As Range
Dim I As Byte, J As Byte
Dim Tblo As Object
Set Tblo = CreateObject("Scripting.Dictionary")
For Each Cel In Range("A1:A" & Cells(Rows.Count, 1).End(xlUp).Row)
    J = 1
    For I = 1 To Application.RoundUp(Len(Cel) / 3, 0)
        Tblo(I) = Mid(Cel, J, 3)
        J = J + 3
    Next I
    Cel.Offset(, 1) = Join(Tblo.Items, "-")
    Tblo.RemoveAll
Next Cel
End Sub


Bonne journée
0
Heremion Messages postés 538 Date d'inscription vendredi 20 mai 2011 Statut Membre Dernière intervention 1 juin 2022 102
1 sept. 2011 à 14:21
Bonjour Carol.

Vite fait, j'ai essayé le code suivant dans une macro. Sur un évènement de bouton, ou sur un évènement de la feuille :
Dim imax
Dim i, j
Dim ilongueur_cellule
Dim stexte_cellule
Dim stexte_resultat

    imax = Range("A65536").End(xlUp).Row
    For i = 1 To imax
        stexte_cellule = Range("A" & i).Value
        ilongueur_cellule = Len(stexte_cellule)
        j = 1
        If Len(stexte_cellule) < 3 Then
            stexte_resultat = stexte_cellule
        Else
            stexte_resultat = Mid(stexte_cellule, j, 3)
            Do While j <= ilongueur_cellule
                If j > 1 Then
                    stexte_resultat = stexte_resultat & "-" & Mid(stexte_cellule, j, 3)
                End If
                j = j + 3
            Loop
            stexte_resultat = stexte_resultat & "-" & Mid(stexte_cellule, j, j - ilongueur_cellule)
        End If
        Range("B" & i).Value = stexte_resultat
    Next i


Il y a surement quelques trucs à corriger mais l'idée est là. En espérant que cela t'apporte un peu d'aide...
0
ccm81 Messages postés 10905 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 27 décembre 2024 2 429
Modifié par ccm81 le 1/09/2011 à 17:13
bonjour

une autre version avec une fonction à mettre dans un module

Option Explicit     

' ch    = chaine a traiter     
' car   = caractere de separation     
' saut  = nb de caracteres entre deux car     
' dir   = "d" ou "g" on commence par la droite ou la gauche     

Public Function InsereCar(ByVal ch As String, car As String, saut As Long, dir As String) As String     
 If Len(ch) <= saut Then     
   InsereCar = ch     
 Else     
   If dir = "g" Then     
     InsereCar = Left(ch, saut) & car & InsereCar(Right(ch, Len(ch) - saut), car, saut, dir)     
   Else     
     InsereCar = InsereCar(Left(ch, Len(ch) - saut), car, saut, dir) & car & Right(ch, saut)     
   End If     
 End If     
End Function 

Utilisation dans la feuille
si A1 = azertyuiop
B1 =inserecar($A1;"-";3;"g") donne aze-rty-uio-p
C1 =inserecar($A1;"-";3;"d") donne a-zer-tyu-iop

Utilisation via une procedure VBA sur une plage selectionnée
Dim c As Range 
For Each c In Selection 
  c.Value = InsereCar(c.Value, "-", 3, "g") 
Next c

bonne suite
0