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 :

VBA_Supprimer les espaces superflus dans une chaîne de caractères


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Inscrit en
    Avril 2013
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Avril 2013
    Messages : 21
    Points : 8
    Points
    8
    Par défaut VBA_Supprimer les espaces superflus dans une chaîne de caractères
    Bonjour

    Est ce que quelqu'un a une idée comment supprimer les espaces superflus dans ma chaîne de caractères Var1 qui a les caractéristiques suivantes:

    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
     
    Public Type File
        Header As String
        Body As String
    End Type
     
    Public Type Body
        BodyName As String
        Comments As String
    End Type
     
    Dim Var As String
    Dim Var1 As String
     
    Var = Fun1(ByVal filename).Body  ' tel que Fun1 est une fonction définie as File
    Var1 = Fun2(ByVal Var).Comments  ' tel que Fun2 est une fonction définie as File
    J'ai essayé le Trim, Rtrim et Ltrim mais ça n'a pas marché !
    J'espère avoir été claire en posant ma question donc si quelqu'un peut m'aider, qu'il n'hésite pas

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Une solution possible avec une fonction

    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
    Function TexteSansCaracteresBlancs(TexteAVerifier As String)
     
    Dim CtrI As Integer
     
      TexteSansCaracteresBlancs = ""
      For CtrI = 1 To Len(TexteAVerifier)
        Select Case Mid(TexteAVerifier, CtrI, 1)
     
            Case Chr(32), Chr(160)
     
            Case Else
     
                TexteSansCaracteresBlancs = TexteSansCaracteresBlancs & Mid(TexteAVerifier, CtrI, 1)
     
        End Select
     
      Next CtrI
     
    End Function
    Et pour essayer la fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub EssaiTexteSansCaracteresBlancs()
     
            Dim Var1 As String
     
            Var1 = "AAAAA BBBBB CCCCC"
     
            Var1 = TexteSansCaracteresBlancs(Var1)
            MsgBox (Var1)
     
    End Sub
    Cordialement.

  3. #3
    Futur Membre du Club
    Inscrit en
    Avril 2013
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Avril 2013
    Messages : 21
    Points : 8
    Points
    8
    Par défaut
    Merci Eric pour ta solution.

    Toutefois, je suis navrée de te dire qu'elle ne fonctionne pas sur ma variable. En effet, elle ne supprime les espaces ni au milieu ni à la fin de ma chaîne Var1 !!

    Peut être qu'elle a donné le résultat escompté sur la chaîne "AAAAA BBBBB CCCCC" puisque c'est une chaîne simple c'est à dire n'est pas de "type utilisateur" comme est le cas de ma chaîne Var1.

    Donc si tu vois une autre issue à ce problème, n'hésite pas à me la communiquer

  4. #4
    Expert éminent Avatar de garn
    Homme Profil pro
    Conseil en assistance à maîtrise d'ouvrage
    Inscrit en
    Janvier 2006
    Messages
    1 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Conseil en assistance à maîtrise d'ouvrage

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 487
    Points : 6 032
    Points
    6 032
    Par défaut
    Bonjour,

    tu as essayé les deux, trim et replace ?

  5. #5
    Invité
    Invité(e)
    Par défaut
    Peux-tu mettre en ligne un exemple de chaîne ?

    Sinon, tu peux tester ce programme pour repérer les codes Chr posant problème. Une fois trouvés, il suffira de les exclure dans la macro de mon premier message en complétant
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    Sub TesterTesterLesCaracteres()
     
      Dim Var1 As String
     
      Var1 = "AA BB CC"
      Call TesterLesCaracteres(Var1)
     
     
    End Sub
     
    Sub TesterLesCaracteres(TexteAVerifier As String)
     
    Dim CtrI As Integer
    Dim CtrJ As Integer
     
      For CtrI = 1 To Len(TexteAVerifier)
     
         For CtrJ = 0 To 255
     
           Select Case Mid(TexteAVerifier, CtrI, 1)
     
            Case Chr(CtrJ)
              MsgBox (CtrJ)
            End Select
     
         Next CtrJ
     
      Next CtrI
     
     
     
    End Sub

    Sinon, met une chaîne en ligne pour qu'on puisse se faire une idée.

    Cordialement.

  6. #6
    Futur Membre du Club
    Inscrit en
    Avril 2013
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Avril 2013
    Messages : 21
    Points : 8
    Points
    8
    Par défaut
    oui gran, j'ai essayé le trim et le replace mais en vain !!
    en effet, ma chaîne est extraite à partir d'un fichier texte et elle est de la forme suivante:
    var = "personne ( " _
    & "Alain : homme;" & vbLf _
    & "Alex : homme;" & vbLf _
    & "Marie : femme;" & vbLf _
    & "Sophie : femme;" & vbLf _
    & "jeanne : femme;" & vbLf _
    & "paul : homme(0 à 10)" & vbLf _
    & ");" & vbLf _
    & vbLf _
    & vbLf _

    et je désire supprimer les espaces à la fin de la chaine.
    Merci à l'avance

  7. #7
    Invité
    Invité(e)
    Par défaut
    Et si tu ajoutes Chr(10) dans le code ?

    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
    Function TexteSansCaracteresBlancs(TexteAVerifier As String)
     
    Dim CtrI As Integer
     
      TexteSansCaracteresBlancs = ""
      For CtrI = 1 To Len(TexteAVerifier)
        Select Case Mid(TexteAVerifier, CtrI, 1)
     
            Case Chr(32), Chr(160), Chr(10)
     
            Case Else
     
                TexteSansCaracteresBlancs = TexteSansCaracteresBlancs & Mid(TexteAVerifier, CtrI, 1)
     
        End Select
     
      Next CtrI
     
     
    End Function

    -Que donne le résultat de Var1 avec ce programme ?

    -As-tu testé le dernier programme que je t'ai envoyé ?

    - Autre question : que doit contenir Var1 pour toi ? Le résultat que tu as envoyé est-il bien le résultat qui doit être modifié par la suite ?


    Cordialement.

  8. #8
    Invité
    Invité(e)
    Par défaut Bonjour test ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim Var1 As String
    Var1 = Replace("AAAAA BBBBB CCCCC", " ", "")

  9. #9
    Invité
    Invité(e)
    Par défaut
    Je n'avais pas vu le message envoyé à Garn sous cette forme.

    Avec la dernière version envoyée supprimant les retours à la ligne, le programme donne ceci :



    Est-ce bien cela le résultat attendu ?

    Cordialement.

  10. #10
    Futur Membre du Club
    Inscrit en
    Avril 2013
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Avril 2013
    Messages : 21
    Points : 8
    Points
    8
    Par défaut
    Je reformule ma question car j'ai l'impression que j'ai échoué à vous faire comprendre mon problème:
    ma chaine est comme suit:
    var = "personne ( " & vbLf _
    & "Alain : homme;" & vbLf _
    & "Alex : homme;" & vbLf _
    & "Marie : femme;" & vbLf _
    & "Sophie : femme;" & vbLf _
    & "jeanne : femme;" & vbLf _
    & "paul : homme(0 à 10)" & vbLf _
    & ");" & vbLf _
    & vbLf _
    & vbLf _

    je NE désire PAS supprimer les retours à la ligne ni les espaces au milieu de la chaîne (càd ceux qui sont par exemple entre "Sophie", "le point virgule" et "femme", ces espaces sont à garder)
    ce que je veux c'est supprimer les espace en fin de chaîne cad ceux représentés par " & vbLf _
    & vbLf _"
    NB: je ne peux pas tout simplement supprimer les vblf car ce n'est pas moi qui ai défini la chaîne mais je l'ai extraite d'un fichier et les espaces à la fin ont été extraits avec.

    Merci à l'avance

  11. #11
    Invité
    Invité(e)
    Par défaut
    En n'écartant que les Chr(10) cela donne cela



    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
    Function TexteSansCaracteresBlancs(TexteAVerifier As String)
     
    Dim CtrI As Integer
     
      TexteSansCaracteresBlancs = ""
      For CtrI = 1 To Len(TexteAVerifier)
        Select Case Mid(TexteAVerifier, CtrI, 1)
     
           ' Case Chr(32), Chr(160), Chr(10)
            Case Chr(10)
     
            Case Else
     
                TexteSansCaracteresBlancs = TexteSansCaracteresBlancs & Mid(TexteAVerifier, CtrI, 1)
     
        End Select
     
      Next CtrI
     
     
    End Function
    Cordialement.

  12. #12
    Expert éminent Avatar de garn
    Homme Profil pro
    Conseil en assistance à maîtrise d'ouvrage
    Inscrit en
    Janvier 2006
    Messages
    1 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Conseil en assistance à maîtrise d'ouvrage

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 487
    Points : 6 032
    Points
    6 032
    Par défaut
    c'est une chaine extraite d'un fichier mais contenue dans une variable

    Vblf étant le saut de ligne en VBA je suppose que c'est toujours ce mot clé qui reviendra à cet endroit de la chaine ? Enfin si c'est une réponse utilisateur elle a un format définit?

    il faudrait n'identifier au sein de ta variable que les "& vbLf _" et appliquer un RTRIM ou un Replace(& vbLf _, " ", "") dessus.
    Ou découper la chaine à chaque occurence de "& vbLf _"

    si ce n'est pas sur que ce soit tout le temps "& vbLf _" qui contienne les espaces à supprimer, c'est plus chaud... dans tous les cas c'est de la manipulation de chaine de caractère, le but est d'identifier de facon certaine ce que tu dois extraire

  13. #13
    Futur Membre du Club
    Inscrit en
    Avril 2013
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Avril 2013
    Messages : 21
    Points : 8
    Points
    8
    Par défaut
    merci bcp garn.
    mais j'ai toujours l'impression que tu n'as pas saisi mon problème.
    Ma chaîne dans le fichier texte est:
    "personne (
    Alain : homme;
    Alex : homme;
    Marie : femme;

    Sophie : femme;
    jeanne : femme;
    paul : homme(0 à 10)
    );


    "
    Ce qui est demandé est de supprimer les lignes vide s'il en existe, par exemple:
    la ligne vide entre la ligne qui contient Marie et celle qui contient Sophie.
    les ligne vides entre la ligne qui contient ); et celle qui indique la fin de la chaine.
    Pour enfin obtenir une chaîne de la forme:
    "personne (
    Alain : homme;
    Alex : homme;
    Marie : femme;
    Sophie : femme;
    jeanne : femme;
    paul : homme(0 à 10)
    );"

    Allez les gars, dites moi que mon problème est plus clair et que ce que je veux est faisable
    NB: j'ai essayé de transformer ma chaîne en tableau avec SPLIT, cependant je ne suis pas aussi arrivée à supprimer les lignes vides

  14. #14
    Expert éminent
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Points : 6 871
    Points
    6 871
    Par défaut
    Bonjour,

    Essai ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Var = Left(Var, InStrRev(Var, ";"))
    Var = Replace(Var, Chr(10) & Chr(10), Chr(10))
    MsgBox Var
    Hervé.

  15. #15
    Expert éminent Avatar de garn
    Homme Profil pro
    Conseil en assistance à maîtrise d'ouvrage
    Inscrit en
    Janvier 2006
    Messages
    1 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Conseil en assistance à maîtrise d'ouvrage

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 487
    Points : 6 032
    Points
    6 032
    Par défaut
    Ah. On aurait du commencer par la

    Donc si je comprend ce qui est a supprimer ca n'est pas un espace, mais un double saut de lignes... Les simples sauts de lignes sont corrects

    Je le comprend comme une recherche et remplacement des chaines "& vbLf _ & vbLf _" à transformer en "& vbLf _"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Replace(Var1,"& vbLf _ & vbLf _","& vbLf _")
    (en essayant de faire au plus simple)

  16. #16
    Futur Membre du Club
    Inscrit en
    Avril 2013
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Avril 2013
    Messages : 21
    Points : 8
    Points
    8
    Par défaut
    Oui tu as raison garn, j'aurais dû poser mon problème comme je viens juste de le faire

    Mais bizarrement, ta solution n'a pas fonctionné sur ma fameuse chaîne.Merci quand pour l'effort que t'as fourni pour essayer de me comprendre et de me donner des solutions
    Par contre, la solution de Theze fonctionne parfaitement. Donc merci bcp theze

    Juste une dernière remarque, est ce que c'est possible de modifier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Var = Left(Var, InStrRev(Var, ";"))
    Var = Replace(Var, Chr(10) & Chr(10), Chr(10))
    pour l'appliquer sur des chaînes même si on ne connait le nombre de sauts de lignes qu'on veut supprimer (càd un double, triple ... sauts de lignes)

    Merci tout le monde

  17. #17
    Membre expérimenté
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2013
    Messages
    885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 885
    Points : 1 499
    Points
    1 499
    Par défaut VBASupprimer les espaces superflus dans une chaine de caractères
    bonjour,

    le problème est sur "var1". tu nous donnes un exemple de contenu de "var" qui qui deviendra var1 après passage par "fun2".

    il ne serait peut-être pas sans intérêt de voir le code de "fun2" pour comparaison.

    cordialement

  18. #18
    Membre habitué
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juillet 2012
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2012
    Messages : 94
    Points : 173
    Points
    173
    Par défaut
    sans doute pas le plus efficace, mais on peut boucler sur la fonction replace tant qu'il existe des doubles espaces/sauts.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Var = Left(Var, InStrRev(Var, ";"))
    do while InStr(Var, Chr(10) & Chr(10))
        Var = Replace(Var, Chr(10) & Chr(10), Chr(10))
    loop

  19. #19
    Invité
    Invité(e)
    Par défaut
    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
    23
    24
    25
    26
    Sub a()
    Dim Var As String
    Var = "personne ( " & vbCrLf _
    & "Alain : homme;" & vbCrLf _
    & "Alex : homme;" & vbCrLf _ 
    & vbCrLf _
    & "Marie : femme;" & vbCrLf _
    & "Sophie : femme;" & vbCrLf _
    & "jeanne : femme;" & vbCrLf _
    & "paul : homme(0 à 10)" & vbCrLf _
    & ");" & vbCrLf _
    & vbCrLf _
    & vbCrLf
    Var = SupprimerLignesVide(Var)
     
     
    End Sub
    Function SupprimerLignesVide(t As String) As String
    Dim v
    Dim I As Long
    SupprimerLignesVide = ""
    v = Split(t & vbCrLf, vbCrLf)
    For I = 0 To UBound(v)
        If Trim("" & v(I)) <> "" Then SupprimerLignesVide = SupprimerLignesVide & Trim("" & v(I)) & vbCrLf
    Next
    End Function

  20. #20
    Expert éminent
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Points : 6 871
    Points
    6 871
    Par défaut
    Re,

    En admettant qu'il puisse y en avoir 10 à la suite et en plusieurs endroits de la chaine :
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    Sub Test()
     
        Dim Var As String
        Dim Retour As String
        Dim I As Integer
        Dim J As Integer
     
        'pour le test
        Var = "personne ( " _
        & "Alain : homme;" & vbLf & vbLf _
        & "Alex : homme;" & vbLf _
        & "Marie : femme;" & vbLf & vbLf & vbLf & vbLf & vbLf & vbLf & vbLf _
        & "Sophie : femme;" & vbLf _
        & "jeanne : femme;" & vbLf & vbLf & vbLf & vbLf & vbLf _
        & "paul : homme(0 à 10)" & vbLf _
        & ");" & vbLf _
        & vbLf _
        & vbLf
     
        'supprime déjà ceux de fin
        Var = Left(Var, InStrRev(Var, ";"))
     
        'admettons qu'il puisse y en avoir 10 de suite...
        For I = 1 To 10
     
            Retour = Retour & Chr(10)
     
        Next I
     
        J = Len(Retour)
     
        'boucle à la recherche des retours à la ligne
        'en réduisant la variable "Retour"
        For I = J To 1 Step -1
     
            Var = Replace(Var, Retour, Chr(10))
            Retour = Left(Retour, I)
     
        Next I
     
        MsgBox Var
     
    End Sub
    Hervé.

Discussions similaires

  1. [Free Pascal] Programme qui supprime les espaces inutiles dans une chaîne
    Par joreveur dans le forum Free Pascal
    Réponses: 18
    Dernier message: 24/08/2012, 16h51
  2. Réponses: 16
    Dernier message: 19/11/2008, 12h02
  3. Réponses: 5
    Dernier message: 25/02/2008, 14h34
  4. Supprimer les espaces consécutifs dans une chaîne
    Par aymenet1 dans le forum Pascal
    Réponses: 12
    Dernier message: 27/11/2007, 22h21
  5. Effacer les espaces dans une chaîne de caractères
    Par JohnnyWalk dans le forum Débuter avec Java
    Réponses: 16
    Dernier message: 19/07/2007, 14h13

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