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

Morgan67700 Messages postés 30 Statut Membre -  
 Utilisateur anonyme -
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

3 réponses

  1. cs_Le Pivert Messages postés 8437 Statut Contributeur 730
     
    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
    1. Morgan67700 Messages postés 30 Statut Membre 1
       
      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
    2. cs_Le Pivert Messages postés 8437 Statut Contributeur 730
       
      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
    3. Morgan67700 Messages postés 30 Statut Membre 1
       
      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
  2. Utilisateur anonyme
     
    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