Macro - placer un caractère à des positions précises et multiple

Bonjour à tous,

Je sollicite votre aide pour le problème suivant :

Je dispose de fichiers excel avec des numéros client sous différents formats.

Je souhaiterai ajouter des tirets à des positions spécifiques, positions variables en fonction du format des numéros clients (que je pense identifier par regex).

Ainsi, si la chaine correspond à la regex 1, alors il faut ajouter un tiret après les 3ème et 11 ème caractères

mais si la chaine correspond à la regex 2, alors il faut ajouter un tiret après le 1er et le 4ème caractères.

De mes recherches, j'ai trouvé sur internet qui adapté donne :

Dim MaChaine As String, Insert as String, i as Long

Machaine = "regex 1"

Insert = " "

i = 3

Machaine = left$(MaChaine,i-1) & Insert & Mid$(MaChaine,i)

mais qui ne marcherait que pour une regex et que pour 1 tiret sur les 2.

Auriez-vous une idée sur le sujet ?

Merci d'avance !

Bonjour,

une proposition, à toi de définir la condition regex1 et regex2

Function inserecar(s, c, p)
    inserecar = Left(s, p) & c & Mid(s, p)
End Function

Sub test()
'Ainsi, si la chaine correspond à la regex 1, alors il faut ajouter un tiret après les 3ème et 11 ème caractères
'mais si la chaine correspond à la regex 2, alors il faut ajouter un tiret après le 1er et le 4ème caractères.
    chaine = "xxxxxxxxxxxxxx"
    If regex1 Then
        chaine = inserecar(chaine, "-", 11)
        chaine = inserecar(chaine, "-", 3)
    ElseIf regex2 Then
        chaine = inserecar(chaine, "-", 4)
        chaine = inserecar(chaine, "-", 1)
    End If
End Sub

pour l'insertion des caractères commencer par introduire les caractères dans les positions les plus à droite.

Bonjour h2so4,

Merci pour ta réponse rapide !

Pour essayer ça, je dois remplacer xxxxxxxxxxxxxx par les cellules concernées (en l'occurence, toute la colonne B du type B2:B) ?

J'ai essayé mais le débogueur m'indique une erreur de syntaxe sur Sub test()

Je suppose que c'est parce que la fonction ne doit pas être "seule" mais être intégrée ?

Merci encore pour ton aide en tout cas

re-bonjour,

mets-nous un fichier exemple, y compris tes regex.

Rebonjour,

D'accord, je mets un fichier d'exemple lundi matin.

En attendant, j'essaie de résumer :

En colonne A :

RF10324265ROBB (qui doit devenir RF-10324265-ROBB)

1BDO038DEGAS99 (qui doit devenir 1-BDO-038DEGAS99)

Les regex :

^([a-zA-Z]){3}+(..............)

=> Si chaine commence par trois lettres et a 15 caractères (c'est variable) alors ajout d'un tiret en 3 et 11

([0-9]){2}$

=> Si chaine termine par deux chiffres, alors ajout d'un tiret en 1 et 4

Il y en aura bien d'autres (j'ai identifié 19 "modèles" de numéros possibles) mais je suis en train d'apprendre donc elles ne sont pas encore au point.

Bonjour,

pour traiter tous les numéros de client en colonne B

Function inserecar(s, c, p)
    inserecar = Left(s, p) & c & Mid(s, p)
End Function

Sub test()
'Ainsi, si la chaine correspond à la regex 1, alors il faut ajouter un tiret après les 3ème et 11 ème caractères
'mais si la chaine correspond à la regex 2, alors il faut ajouter un tiret après le 1er et le 4ème caractères.
    dl = Cells(Rows.Count, "B").End(xlUp).Row
    Set regex = CreateObject("VBScript.RegExp")
    With regex
        For Each cel In Range("B2:B" & dl)
            chaine = cel.Value
            .Pattern = "^([a-zA-Z]){3}+(..............)"
            If .test(chaine) Then
                chaine = inserecar(chaine, "-", 11)
                chaine = inserecar(chaine, "-", 3)
            Else
                .Pattern = "([0-9]){2}$"
                If .test(chaine) Then
                    chaine = inserecar(chaine, "-", 4)
                    chaine = inserecar(chaine, "-", 1)
                End If
            End If
            cel.Value = chaine
        Next
    End With
End Sub

Merci beaucoup !

J'obtiens une erreur d'exécution 5018 mais le problème vient probablement d'une de mes regex qui doit être bancale !

Je vais essayer de creuser ça !

Merci encore pour ton aide précieuse

Bonjour,

J'ai enfin réussi à trouver les bonnes regex (ouf).

Malgré tout se pose encore un petit problème. Si le caractère - est bien placé, le problème vient de la récupération de la chaine qui est décalée.

Exemple :

RF10324265ROBB

donne

RF1-10324265R-ROBB

au lieu de

RF-10324265-ROBB

Est-ce que tu as une idée? Quand je tape sur google inserecar pour essayer de comprendre d'où le problème vient, je ne trouve pas de tuto sur le fonctionnement attendu ?

Merci !

Bonjour,

la fonction insercar insère après la position indiquée (comme tu l'as demandé

alors il faut ajouter un tiret après les 3ème et 11 ème caractère

) et non à la position indiquée.

si tu veux insérer un caractère en position 3, utilise la fonction avec comme paramètre 2 (=après le 2ème caractère)

Bjr Yek, H2SO4,

^([a-zA-Z]){3}+(..............)

=> Si chaine commence par trois lettres et a 15 caractères (c'est variable) alors ajout d'un tiret en 3 et 11

([0-9]){2}$

=> Si chaine termine par deux chiffres, alors ajout d'un tiret en 1 et 4

et si les 2 conditions sont réunies ?

un premier jet à peaufiner (sans passer par la macro), notamment sur la condition du nbre de caractères

25ajout-tiret.xlsm (14.68 Ko)

Merci à tous les deux pour vos réponses,

h2so4, le problème en fait est que lorsque le - est placé, il recopie en double un caractère

Dans l'exemple :

RF10324265ROBB

donne

RF1-10324265R-ROBB

au lieu de

RF-10324265-ROBB

Il place le tiret en 3ème position (parfait) mais recopie le caractère suitvant AVANT ce même tiret provoquant un doublon.

Idem pour le 11 place, le tiret est bien placé mais il rajoute aussi avant l'ancien 11ème caractère (doublon).

Steelson, normalement, sauf erreur de ma part, les regex que j'ai établi répondent à des règles uniques. C'est à dire que deux regex ne peuvent pas se cumuler.

Mais vu mon niveau débutant --, pas à l'abri d'une mauvaise surprise

Bonjour,

en effet, voici une correction

Function inserecar(s, c, p)
    inserecar = Left(s, p) & c & Mid(s, p + 1)
End Function

Mille mercis !

Bravo pour votre efficacité et votre rapidité.

Rechercher des sujets similaires à "macro placer caractere positions precises multiple"