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

Excel Discussion :

Remplacer un caractère dans un fichier texte


Sujet :

Excel

  1. #1
    Membre à l'essai
    Inscrit en
    Janvier 2008
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 57
    Points : 16
    Points
    16
    Par défaut Remplacer un caractère dans un fichier texte
    Bonjour,

    Je souhaiterais remplacer certains caractère d'un fichier texte via VBA Excel.
    J'arrive a écrire dans un fichier texte mais pas à remplacer un caractère.

    Il faudrait par exemple:

    Si caractère <> de "a" ou "b" ou "c" ou "d"....
    Alors caractère = " "

    Merci.

  2. #2
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Développeur VBA/C#/VB.Net/Power Platform
    Inscrit en
    Juillet 2007
    Messages
    14 595
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur VBA/C#/VB.Net/Power Platform
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 595
    Points : 34 271
    Points
    34 271
    Par défaut
    un petit effort avec la fonction rechercher du forum :
    http://www.developpez.net/forums/sho...+texte+fichier
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  3. #3
    Membre à l'essai
    Inscrit en
    Janvier 2008
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 57
    Points : 16
    Points
    16
    Par défaut
    Oui merci...pour la fonction recherche....Mais c'est plus une aide que je cherche que des remarques....

  4. #4
    Expert éminent sénior

    Homme Profil pro
    Inscrit en
    Août 2005
    Messages
    3 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2005
    Messages : 3 317
    Points : 20 144
    Points
    20 144
    Par défaut
    bonsoir


    Oui merci...pour la fonction recherche....Mais c'est plus une aide que je cherche que des remarques....
    Est ce que tu as au moins consulté le lien proposé ?


    bonne soirée
    michel

  5. #5
    Membre à l'essai
    Inscrit en
    Janvier 2008
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 57
    Points : 16
    Points
    16
    Par défaut
    Mais bien sur!!!! Bref...

    Sinon re-parlons de mon projet...car je n'avance plus.

    Effectivement j'arrivais à remplacer "machin" par "chose" mais ca va plus loin que ca...

    En fait il faut qu'après lecture du fichier texte, les caracteres differents de l'alphabet et des chiffres soient effacés.


    Voici un extrait du fichier:

    ; s0‚o0‚W*0
     *†H†÷
     0c1#0!U Child PKI CA10
    U(none)10
    U 
    0 U
    1 0 UFR0
    071030073100Z
    091030073100Z0¸1'0%U, )10UAUD10U*V10
    U(none)10
    U BUS1
    ‚ ˆõÍaØOÔq¤×Î*(=§Sz_ûmøU¥Ê£Z“{I‘´éÅNFBƕÇ…»P’v³G

  6. #6
    Membre à l'essai
    Inscrit en
    Janvier 2008
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 57
    Points : 16
    Points
    16
    Par défaut
    Bonjour,

    personne pour m'aider, peut etre avec la fonction keyascii?

    Merci.

  7. #7
    Membre éprouvé
    Avatar de ouisansdoute
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    931
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 931
    Points : 1 079
    Points
    1 079
    Par défaut caractères carrés
    Bonjour, il faut d'abord que tu repères quels sont les codes qui génèrent des carrés et ensuite remplacer chacun de ces codes pas rien ou par un espace.

    Pour la première partie voici une macro qui peut t'aider. Pour la suite ce ne devrait pas être trop difficile.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub code_carres()
    For i = 1 To 255
    Range("a" & i) = Chr(i)
    Next
    End Sub
    Cette macro insère sur chaque ligne Excel le caractère produit par le code

  8. #8
    Membre à l'essai
    Inscrit en
    Janvier 2008
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 57
    Points : 16
    Points
    16
    Par défaut
    La structure du fichier texte est vraiment bizarre car arrivé a la 110 eme ligne, le programme sort de la boucle et termine.

    J'ai testé avec un fichier clean et la ca fonctionne correctement jusqu'au nombre max de ligne d'excel (65536).

    On m'a parlé de keyAscii mais je n'arrive pas a me dépatouiller:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    If (KeyAscii > 96) And (KeyAscii < 123) Then
     
          KeyAscii =32
     
        End If

  9. #9
    Membre habitué
    Avatar de dj_benz
    Homme Profil pro
    Inscrit en
    Octobre 2002
    Messages
    178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Octobre 2002
    Messages : 178
    Points : 135
    Points
    135
    Par défaut
    Salut,

    Je n'ai pas de réponse, mais j'ai un conseil à te donner, pour être tombé dans un piège bête avec ce genre de chose.

    Tu parles d'un fichier texte, mais tu nous montre un fichier qui a l'air d'un binaire. Alors, fais très attention: ils ne se lisent pas de la même façon. Je ne sais pas pour le VB, mais en C, c'est très différent et inverser pose des problèmes (surtout faire passer un binaire pour un texte, l'inverse fonctionne).

    J'espère que ça t'aidera.

    Benz
    Benz
    ______________________________________________________________
    Software is like sex, it's better when it's free - Linus Torvalds

  10. #10
    Membre à l'essai
    Inscrit en
    Janvier 2008
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 57
    Points : 16
    Points
    16
    Par défaut
    Le fichier source n'est effectivement pas du texte mais un fichier .oab (Offline Adress Book) généré par Outlook.
    Il a donc à l'intérieur plein de contacts (adresses mail, tel, adresse ...) etc... qui apparaissent quand je l'ouvre avec notepad.

    Donc avant de ranger tous ces contacts par Nom, prénom, adresse mail dans une feuille excel via VBA, il me faut traiter le fichier texte de facon a retirer tous les caractères non souhaités.

    Outook est capable de générer un tel fichier, mais dans mon cas, comme les infos viennent d'un serveur exchange, toutes les infos resortent sauf l'adresse mail qui apparait dans ce style la "Durand, François" qui est en fait le display name utilisé par outlook.

  11. #11
    Membre habitué
    Avatar de dj_benz
    Homme Profil pro
    Inscrit en
    Octobre 2002
    Messages
    178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Octobre 2002
    Messages : 178
    Points : 135
    Points
    135
    Par défaut
    Quand tu exécutes le code que tu as donné, il se passe quoi? Tu as des erreurs d'exécution/compilation? Des modifications inattendues se passent? Le fichier résultant ressemble à quoi?

    Au fait, peux-tu donner un morceau de ton fichier d'entrée, où on voit apparaitre une adresse mail? Histoire de voir comment elles sont stockées et comment on peut les extraire.

    Benz
    Benz
    ______________________________________________________________
    Software is like sex, it's better when it's free - Linus Torvalds

  12. #12
    Membre à l'essai
    Inscrit en
    Janvier 2008
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 57
    Points : 16
    Points
    16
    Par défaut
    Salut,

    Non je n'ai pas essayé le code.... je ne sais pas le mettre en oeuvre.

    le fichier texte se presente comme ca:

    U 
    0 U
    1 0 UFR0
    071030073100Z
    091030073100smtp:jacques.dupond@bouzouc.com Z0¸1'0%smtp:jacques.durand@bouzouc.com U, )10UAUD10U*V10
    Usmtp:jacques.untel@bouzouc.com (none)10
    U BUS1
    ‚ ˆõÍaØOÔq¤×Î*(=§Sz_ûmøU¥Ê£Z“{I‘´éÅNFBƕÇ…»P’v³G

    Les adresses mail sont toujours encadrées par un smtp: et un espace à la fin...

    Le programme que j'ai réalisé s'execute bien mais il doit y avoir des caractères ou des chaines de caractères qui le font sortir d'une boucle et il s'arrete a la 110eme ligne. Si je supprime les caractères entre la 110 eme et la 111eme, il me parcours 150 lignes....etc

    Donc mon but est de faire un POST traitement du fichier texte et est de supprimer tous les caractères indésirables .

    Merci.

  13. #13
    Expert éminent Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 754
    Points : 9 396
    Points
    9 396
    Par défaut
    Cette procedure devrait t'aider a faire le menage.
    A toi de completer le select case pour completer le nettoyage

    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
     
    Dim i As Integer
    Dim Ligne As Long
     
    Dim strChaine As String
    Dim strChaineSortie As String
    Dim strCar As String
     
    Ligne = 1
     
    Do While Range("a" & Ligne).Value <> ""
        strChaineSortie =""
        strChaine = Range("A" & Ligne).Value
     
        For i = 1 To Len(strChaine)
            strCar = Mid(strChaine, i, 1)
     
            Select Case Asc(strCar)
                Case Is < 31
                    strCar = ""
                Case Else
     
            End Select
     
            strChaineSortie = strChaineSortie & strCar
        Next i
     
     
        Range("A" & Ligne).Value = strChaineSortie
     
        Ligne = Ligne + 1
    Loop
    Jérôme

  14. #14
    Membre habitué
    Avatar de dj_benz
    Homme Profil pro
    Inscrit en
    Octobre 2002
    Messages
    178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Octobre 2002
    Messages : 178
    Points : 135
    Points
    135
    Par défaut
    Je ne suis pas super calé en VB, mais je pense que ton programme s'arrête sur un octet qu'il reconnait comme une fin de fichier (puisqu'il croit avoir à faire à du texte simple, et prend donc cet octet pour la fin du fichier). Essaies donc de voir comment tu pourrais ouvrir le fichier en mode "binaire".

    Ensuite, je te conseille de ne pas remplacer tous les caractères non désirés, mais plutôt de relever uniquement ce dont tu as besoin. Par exemple, tu parcours ton fichier caractère par caractère, et dés que tu tombes sur "smtp:", alors là, tu mémorises l'adresse (tout jusqu'au prochain espace, tu vérifies au passage que tu as bien le @), et tu continues le parcours.

    J'espère que ça t'aidera.
    Benz
    Benz
    ______________________________________________________________
    Software is like sex, it's better when it's free - Linus Torvalds

  15. #15
    Expert éminent Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 754
    Points : 9 396
    Points
    9 396
    Par défaut
    Cette version de code ne te laisse que le mail

    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
     
     
    Dim i As Integer
    Dim Ligne As Long
     
    Dim strChaine As String
    Dim strChaineSortie As String
    Dim strCar As String
    Dim bol As Boolean
     
    Ligne = 1
     
    Do While Range("a" & Ligne).Value <> ""
        strChaineSortie = ""
        strChaine = Range("A" & Ligne).Value
     
        For i = 1 To Len(strChaine)
     
            strCar = Mid(strChaine, i, 1)
     
            If Asc(strCar) = 37 Then bol = True
     
            Select Case Asc(strCar)
                Case Is < 31
                    strCar = ""
                Case Is > 127
                    strCar = ""
                Case 32
                    If bol = True Then bol = False
                Case Else
     
     
            End Select
     
        If bol = True Then strChaineSortie = strChaineSortie & strCar
     
        Next i
     
     
        Range("A" & Ligne).Value = Replace(strChaineSortie, "%smtp:", "")
     
        Ligne = Ligne + 1
    Loop
    Jérôme

  16. #16
    Membre habitué
    Avatar de dj_benz
    Homme Profil pro
    Inscrit en
    Octobre 2002
    Messages
    178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Octobre 2002
    Messages : 178
    Points : 135
    Points
    135
    Par défaut
    jfontaine:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Asc(strCar) = 37 Then bol = True
    Pourquoi 37? Ca correspond au caractère '%', pourtant, rien ne dit que toutes les adresses seront placées après ce caractère.
    De plus, ton algo ne fonctionne correctement que s'il n'y a qu'une seule adresse par ligne: dans le cas de 2 adresses, il va les concaténer: jacques.dupond@bouzouc.comjacques.durand@bouzouc.com
    Benz
    ______________________________________________________________
    Software is like sex, it's better when it's free - Linus Torvalds

  17. #17
    Expert éminent Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 754
    Points : 9 396
    Points
    9 396
    Par défaut
    il y a de forte chance qu'une adresse outlook soit sur plusieurs lignes du fichier.
    sans autres informations, je suis partie avce l'hypothèse que % était le caractère pouvant précéder toute les adresses, steelk nous dira si cela correspond a son besoin en testant sur le fichier complet.

    Sinon il me faudra un exemple plus conséquent pour améliorer le code
    Jérôme

  18. #18
    Membre habitué
    Avatar de dj_benz
    Homme Profil pro
    Inscrit en
    Octobre 2002
    Messages
    178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Octobre 2002
    Messages : 178
    Points : 135
    Points
    135
    Par défaut
    Les adresses mail sont toujours encadrées par un smtp: et un espace à la fin...
    Malheureusement, ce n'est pas un caractère de début, mais un "mot" qui annonce une adresse. Il faut donc mettre en place un système détactant la suite "smtp:" et relevant tout ce qui suit, jusqu'à l'espace. Sans tenir compte des fins de lignes, ce qui est plus généraliste.

    Pour ne pas faire d'erreurs de VB (où je suis quasiment débutant), je vais le faire en algo:
    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
    string chaine_out = ""
    string chaine_in = (la totalité du fichier)
    entier etat=0 (0: smtp pas rencontré, 1234: 'smtp:' rencontré, 5:lecture de l'adresse)
     
    tant_que pas_la_fin_de chaine_in
    faire
       char c = lire chaine_in
       si (etat=0)
       alors
          si(c="s")
          alors etat = etat+1, continuer
          sinon etat = 0
       fin si
     
       si (etat=1)
       alors
          si(c="m")
          alors etat = etat+1, continuer
          sinon etat = 0
       fin si
     
       si (etat=2)
       alors
          si(c="t")
          alors etat = etat+1, continuer
          sinon etat = 0
       fin si
     
       si (etat=3)
       alors
          si(c="p")
          alors etat = etat+1, continuer
          sinon etat = 0
       fin si
     
       si (etat=4)
       alors
          si(c=":")
          alors etat = etat+1, continuer
          sinon etat = 0
       fin si
     
       si (etat=5)
       alors 
          si (c=" ")
          alors
             etat=0
             chaine_out = chaine_out + RETOUR_A_LA_LIGNE
          sinon
             chaine_out = chaine_out + c
          fin si
       fin si
    fin tant_que
    Benz
    ______________________________________________________________
    Software is like sex, it's better when it's free - Linus Torvalds

  19. #19
    Expert éminent Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 754
    Points : 9 396
    Points
    9 396
    Par défaut
    C'est une solution, mais vu le fichier, avec cette méthode, chaque adresse sortira plusieurs fois.
    Jérôme

  20. #20
    Membre habitué
    Avatar de dj_benz
    Homme Profil pro
    Inscrit en
    Octobre 2002
    Messages
    178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Octobre 2002
    Messages : 178
    Points : 135
    Points
    135
    Par défaut
    C'est vrai. Celà dit, pour qu'elles n'apparaissent qu'une seule fois, il n'y a qu'une solution: un tri et une suppression des doublons. Avec du VBA et Excel, ça doit se faire en moins de 5 lignes, non?
    Benz
    ______________________________________________________________
    Software is like sex, it's better when it's free - Linus Torvalds

Discussions similaires

  1. Remplacer un caractère dans un fichier texte
    Par jujel dans le forum VBScript
    Réponses: 0
    Dernier message: 19/06/2013, 14h28
  2. [Batch] Code pour remplacer un caractère dans un fichier texte
    Par amerex dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 27/09/2012, 16h20
  3. [Batch] Remplacer des caractères dans un fichier texte
    Par Benoit Labbey dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 09/06/2009, 16h43
  4. Réponses: 3
    Dernier message: 27/06/2005, 16h24
  5. Réponses: 5
    Dernier message: 25/01/2005, 14h26

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