Parcourir les caractères d'une cellule et agir dessus

Fermé
Morgan67700 Messages postés 30 Date d'inscription lundi 8 décembre 2014 Statut Membre Dernière intervention 17 avril 2018 - Modifié par Morgan67700 le 17/03/2016 à 20:39
Whismeril Messages postés 19029 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 26 avril 2024 - 25 mars 2016 à 19:40
Bonjour CCM,

Je suis de retour sur le forum après un long moment d'inactivité en VBA. Un nouveau problème se pose: je souhaite parcourir les caractères d'une cellule et agir dessus par VBA. Pour commencer le contenue de cette cellule a un format de type: "0000/0000/0000/0000". Cela représente un processus composé de numéros de poste qui font à chaque fois 4 caractères ainsi que de slash "/" qui les séparent.

Exemple: "0455/0666/0692/0999"

J'ai réussi à décomposer le processus avec les fonctions Len() et Mid() (Voir fichier ci-joint), donc je considère que je suis capable de pouvoir lire chaque groupes de 4 caractères et donc chaque poste mais je n'arrive pas à agir sur ce que je trouve.

Je souhaiterais supprimer "0692" à chaque fois qu'on le trouve pour partir sur une base saine dans mon fichier regroupant près de 600 processus.

Exemple: "0488/0692/0357" -> "0488/0357"

J'ai essayé avec la fonction Replace(Cel,"0692","") mais ça ne marche pas.

Et ensuite je souhaiterais pouvoir ajouter par exemple "0692" après "0555" à chaque fois qu'on trouve ce poste dans le processus contenu dans la cellule.

Exemple: "0457/0555/0369" -> "0457/0555/0692/0369"

En espérant être assez clair dans mes explications, merci à ceux qui pourront m'aider.

Cordialement,

Lien du fichier: http://www.cjoint.com/c/FCrq6PXgIQL

Morgan67700
A voir également:

3 réponses

cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 728
18 mars 2016 à 08:05
Bonjour,

J'ai essayé avec la fonction Replace(Cel,"0692","") mais ça ne marche pas.

FAUX

Range("A1").Value = Replace(Range("A1").Value, "0692/", "")


et ensuite:

Range("A2").Value = Replace(Range("A2").Value, "0555", "0555/0692")



je te laisse faire la boucle sur la colonne concernée


--
@+ Le Pivert
0
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 728
18 mars 2016 à 08:31
Pour les boucles voir ici:

https://www.developpez.net/forums/d605223/logiciels/microsoft-office/excel/contribuez/boucles-parcourir-colonne-ligne-plage-donnees-2-methodes/

Dans l'exemple1 copie tu mets ton code dans la boucle en remplaçant Range("A1").Value par Var

voilà
0
Morgan67700 Messages postés 30 Date d'inscription lundi 8 décembre 2014 Statut Membre Dernière intervention 17 avril 2018 1
Modifié par Morgan67700 le 18/03/2016 à 13:19
Bonjour Le Pivert,

Pour supprimer "0692" j'ai modifié le code et ça marche maintenant:

Sub Supprimer0692()

Application.ScreenUpdating = False

Dim Cel As String
Dim Lg As Integer
Dim Fin As String

With Sheets("Feuil1")

    Cel = .Range("A12").Value
        
        Cel = Replace(Cel, "0692/", "")
        
        .Range("A12").Value = Cel ' Remise en place de la cellule nettoyée en partie
            
            Lg = Len(Cel) 'Longueur du process
                
                Fin = Mid(Cel, Lg - 4, 5)
    
                    If Fin = "/0692" Then
                        
                        Cel = Replace(Cel, "/0692", "")
                    
                    End If

                        .Range("A12").Value = Cel ' Remise en place de la cellule propre

End With

Application.ScreenUpdating = True

End Sub



Par contre pour rajouter "0692" après "0555" ça ne marche pas lorsqu'il se trouve en dernière position dans le process, j'ai mis ce code:

Sub Ajout0692()

Application.ScreenUpdating = False

Dim Cel As String
Dim Lg As Integer
Dim Nbr As Integer
Dim i As Integer
Dim j As Integer
Dim Lvg As String
Dim Lvg0 As String



With Sheets("Feuil1")
            
        Cel = .Range("A16").Value
        Lg = Len(Replace(Cel, "/", ""))
        Nbr = Lg / 4
                    
        j = 1
        
    For i = 1 To Nbr
    
            Lvg0 = Mid(Cel, j, 9)
            Lvg = Mid(Cel, j, 4)
            
            If Lvg = "0555" And Lvg0 <> "0555/0692" Then ' Test pour éviter les doublons
    
                Cel = Replace(Cel, "0555", "0555/0692", j, 1) 
        
            End If
            
            j = j + 5
       
    Next i
            .Range("A16").Value = Cel ' Remise en place de la cellule corrigée

End With

Application.ScreenUpdating = True
  
End Sub


Je ne comprends pas trop pourquoi il ne fait pas les modifications sur les valeurs autres que la première...

Lien du fichier: http://www.cjoint.com/c/FCsmrF3eHWF

Morgan67700
0
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 728
18 mars 2016 à 16:15
Comme ceci:

 If Lvg = "0555" And Lvg0 <> "0555/0692" Then
                Cel = Replace(Cel, "/0692", "")
                Cel = Replace(Cel, "0555", "0555/0692") ' Si au début ou en plein process on remplace ainsi
            End If
0
Morgan67700 Messages postés 30 Date d'inscription lundi 8 décembre 2014 Statut Membre Dernière intervention 17 avril 2018 1
25 mars 2016 à 18:42
Bonjour Le_Pivert,

Je vous remercie pour votre aide mais la fonction Replace ne peut pas répondre à tous les cas dont j'ai besoin de traiter. Si je n'avais qu'un seul cas à traiter elle pourrait être parfaite cette fonction. Dans mon fichier je supprime tout les "0692" au début et ensuite je fait plusieurs procédures différentes qui concernent certaines situations comme par exemple mettre "0692" avant "0510"... Donc je ne peux éviter les doublons ainsi.

Exemple: Replace(Cel,"0555","0555/0692")

0555/0433/0555/0692/0510/0477/0555 -> 0555/0692/0433/0555/0692/0692/0510/0477/0555/0692

Je souhaiterais une fonction qui permet de lire le poste "0000" et ajouter "0692" après ou avant celui-ci en fonction de ce qu'il se trouve avant ou après ce numéro de poste.
La fonction mid permet de lire mais je me demande s'il elle ne permettrait pas de remplacer aussi.

Merci pour votre aide,

Morgan67700
0
Whismeril Messages postés 19029 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 26 avril 2024 931
18 mars 2016 à 08:57
Bonjour,

Tu peux aussi utiliser une regex
https://cafeine.developpez.com/access/tutoriel/regexp/#LIII-A-2
0
Morgan67700 Messages postés 30 Date d'inscription lundi 8 décembre 2014 Statut Membre Dernière intervention 17 avril 2018 1
25 mars 2016 à 18:24
Bonjour,

La fonction regex me parait un peu complexe pour l'utilisation que je veux en faire.

Merci pour le tuyau en tout cas.

Morgan67700
0
Whismeril Messages postés 19029 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 26 avril 2024 931
25 mars 2016 à 19:40
Bonsoir
peux tu décrire toutes les opérations que tu veux faire, parce que s'il manque des conditions difficile pour LePivert ou autre de répondre correctement.

Pour les regex, c'est peut être un peu complexe à appréhender au début, mais cela permet, une fois compris, de gérer énormément de cas de traitements de texte sur une ou deux lignes, au final ça simplifie grandement le code.

Pour exemple (en VB.Net) https://codes-sources.commentcamarche.net/forum/affich-7028208-validite-n-telephone-et-adresse-email#9
blq propose un code avec 5 If, 2 regex 20 lignes, en passant un peu de temps sur la regex, j'ai réduit à une regex, 1 if et 7 lignes (9 avec l'encapsulation dans une fonction)
0