IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Ajout d'un string sur chaînes de caractères différentes


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 10
    Par défaut Ajout d'un string sur chaînes de caractères différentes
    Bonjour tout le monde !

    Ça fait plusieurs heures que je sèche sur un problème, pourtant j'ai l'impression d'avoir tous les outils en mains pour réussir.

    Il s'agit d'ajouter le caractère "|" à la place du caractère "-" dans chaque cellule d'une colonne mais seulement :

    -lorsque "-" est suivi d'un nombre à 2 chiffres.

    Exemple : "toto-sur-mer - 64" -> "toto-sur-mer |64"

    Contraintes :
    -Il n'y a jamais écrit la même chose dans les cellules
    -Les "-" peuvent être à des endroits différents.


    Voici quelques pistes que j'ai exploré mais qui n'ont pas abouti :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
          If Cells(i, 1).Value Like "*- ##*" Then
            If Cells(i, 1).Value Like "-[!a-z]" Then
              Cells(i, 1).Value = Replace(Cells(i, 1).Value, "- ", "|")
            End If
          End If
    J'ai aussi tenté de passer par InStr pour récupèrer la position où il faudrait insérer le "|", mais je n'ai pas réussi à lui faire accepter les "##".

    Pareil avec Mid, left et right.

    Je n'ai pas non plus réussi à faire un Replace seulement sous certaines conditions, mis à part de le faire à l'intérieur d'un If mais ça n'a rien donné (cf Code)

    Bref, je fais appel aux experts...

    Merci d'avance!

    Stan

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 173
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Voici un exemple de fonction personnalisée qui fonctionne
    Attention seulement si les 2 caractères qui suivent sont un nombre > 0
    cad "toto-sur-mer -64" et pas "toto-sur-mer - 64" sauf avec une adaptation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Function Change(texte As String, Optional OldText As String = "-", Optional NewText As String = "|") As String
     Dim c As Integer
     For c = 1 To Len(texte)
      If Mid(texte, c, 1) = OldText Then
      Debug.Print Val(Mid(texte, c + 1, 2))
       If Val(Mid(texte, c + 1, 2)) > 0 Then Mid(texte, c, 1) = NewText
      End If
     Next
     Change = texte
    End Function
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 10
    Par défaut
    Bonjour !

    Merci beaucoup d'avoir répondu si vite.

    Alors, je ne suis pas bien familier avec toutes les fonctions que tu utilises mais si j'ai bien compris :

    1) Tu parcours chaque string de chaque cellule

    2) Lorsque tu tombes sur le string "-" tu testes si il y a 2 chiffres qui forment un nombre positif à 1 pas d'écart de "-".

    3) Si c'est le cas, tu changes "-" en "|"

    J'ai plus de 3000 pages excel à traiter, mais il me semble sont toujours sous la forme ""toto-sur-mer - 64".

    J'ai donc changer "c+1" dans ton code par "c+2" et ajouter dans mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Change (Cells(i, 2).Value)
    mais ça ne fonctionne pas.

    Par ailleurs, pour éviter le problème avec les nombres positifs, il ne serait pas plus simple d'utiliser

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If IsNumeric(Mid(texte, c + 2, 2)) = True Then Mid(texte, c, 1) = NewText

    Merci encore pour ton aide,

    Stan

  4. #4
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 173
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Ton analyse est correcte
    Je parcours chaque caractère de la chaîne et ensuite dès que je trouve le caractère = à l'argument OldText, je vérifie si les 2 caractères suivants sont supérieurs à 0. Si c'est le cas, je le remplace par l'argument NewText
    Voilà ce que j'ai testé.
    Colonne A............................Colonne B
    toto-sur-mer- 50...................... toto-sur-mer| 50
    tutu sur-eau-20....................... tutu sur-eau|20
    toto hello- 200 -....................... toto hello| 200 -
    salut- 50luna........................... salut| 50luna
    Hello- 450-marine-bateau....... Hello| 450-marine-bateau

    Cependant après vérification, je constate que j'ai toute de même fait une petite erreur. Je n'ai pas le temps pour l'instant de m'y pencher mais je pense que c'est une bonne piste pour toi si tu n'as pas la patience d'attendre une autre réponse plus tardive.

    Cette fonction personnalisée peut-être utilisée comme une fonction d'excel ou avec une procédure SUB dans VBA
    Exemple avec Excel :
    Si le texte est en A2:A3000 tu places cette formule dans une colonne à côté par exemple en B2
    ET ensuite tu la recopies vers le bas.
    Ou bien en VBA
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub t()
    Sub test()
     Dim r As Long
     For r = 2 To 3000
      ' 4 représente la colonne D
      Cells(r, 4) = Change(Cells(r, 2))
     Next
    End Sub
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  5. #5
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Bonjour
    Une autre proposition utilisant les expressions régulières (ci joint lien intéressant de cafeine)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    Function Change(ByVal Str As String) As String
    Dim Rg As Object
     
    Set Rg = CreateObject("VBScript.RegExp")
    With Rg
        .Pattern = "(.*)(\-)(.*\d?\d)"
        .Global = True
        Change = .Replace(Str, "$1|$3")
    End With
    Set Rg = Nothing
    End Function
     
     
    Sub Test()
    Dim c As Range
     
    Application.ScreenUpdating = False
    'on traite la plage A1:A100 de la feuille Feuil1, à adapter
    For Each c In Worksheets("Feuil1").Range("A1:A100")
        c.Value = Change(c.Value)
    Next c
    End Sub

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 10
    Par défaut
    Merci à tous pour votre aide,

    Je savais qu'il était possible de passer par les RegExp pour faire ce genre de modifications, mais n'étant pas très à l'aise avec j'avais essayé de contourner le problème. La prochaine fois je me lancerai peut-être!

    Finnalement, j'ai opté pour une version un peu "modifié" de la fonction de corona :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Function Merci_corona(texte As String, Optional OldText As String = "-", Optional NewText As String = "|") As String
     Dim c As Integer
     For c = 1 To Len(texte)
      If Mid(texte, c, 1) = OldText Then
      Debug.Print Val(Mid(texte, c + 1, 2))
       If IsNumeric(Mid(texte, c + 1, 2)) Then Mid(texte, c, 1) = NewText
      End If
     Next
     Change = texte
    End Function
    ->Seuls changements en gras.

    Ça a l'air de fonctionner, donc problème résolu :-)


    Merci encore!

    Stan

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Filtre sur chaîne de caractères capricieux
    Par MisterFa dans le forum VBA Access
    Réponses: 1
    Dernier message: 08/05/2008, 20h57
  2. [Requête] Recherche sur chaîne de caractères
    Par kryss_63 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 13/07/2007, 19h48
  3. [Requêtes] opérations sur chaînes de caractères
    Par guyom_ dans le forum Requêtes et SQL.
    Réponses: 14
    Dernier message: 18/12/2006, 11h47
  4. [Tableaux] Opération sur chaîne de caractères
    Par kespy13 dans le forum Langage
    Réponses: 3
    Dernier message: 19/04/2006, 14h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo