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 :

creation d'une macro excel modifiant des caracteres


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 9
    Par défaut creation d'une macro excel modifiant des caracteres
    Bonjour,

    Je dois créer une macro-commande sur Excel permettant de modifier des caractères automatiquement mais je ne sais pas comment.

    Par exemple j'ai ce document:

    PMO|29||33937998401008|3|060930255001|déversoir en tète de stat|A2||||||||||||
    PMO|31||33937998401008|3|060930255001|Entrée Station |A3||||||||||||
    PMO|32||33937998401008|3|060930255001|sortie station |A4||||||||||||
    PMO|41||33937998401008|3|060930255001|boues produites avant tra|A6||||||||||||
    PMO| 5||33937998401008|3|060930255001|Graisses évacuées sans tr|A9||||||||||||
    PMO|6||33937998401008|3|060930255001|Sable produit évacué|A10||||||||||||
    PMO|7||33937998401008|3|060930255001|Refus dégrillage produit |A11||||||||||||

    Il faut que je change A2 en S2, A3 en S3 et ca pour plusieurs documents.
    Ces caractères sont toujours placer au même endroit.

    Par exemple :


    PMO|29||33937998401008|3|060930255001|déversoir en tète de stat|S2||||||||||||
    PMO|31||33937998401008|3|060930255001|Entrée Station |S3||||||||||||
    PMO|32||33937998401008|3|060930255001|sortie station |S4||||||||||||
    PMO|41||33937998401008|3|060930255001|boues produites avant tra|S6||||||||||||
    PMO|5||33937998401008|3|060930255001|Graisses évacuées sans tr|S9||||||||||||
    PMO|6||33937998401008|3|060930255001|Sable produit évacué|S10||||||||||||
    PMO|7||33937998401008|3|060930255001|Refus dégrillage produit |S11||||||||||||

    Ce sont des fichiers texte (.txt) au format Sandre, ils s'ouvrent avec un logiciel de traitement de texte.

    Merci de votre aide.

  2. #2
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        Columns("H:H").Replace What:="A", Replacement:="S", LookAt:=xlPart, _

  3. #3
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Mon ami fring me pose une question qui me fait poser une question : Tu les ouvres dans Excel, tes fichiers texte ?
    Parce que sinon, tu as la solution longue qui consiste à ouvrir tes fichiers avec Open, à lire chaque ligne, à faire un split sur la ligne avec "|", à remplacer S par A pour chaque 8 ième mot de ta ligne
    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
    Sub Test()
    Dim Ligne As String, NewLigne, tablo as variant
    Open "C:\NewFich.txt" For Output As #1
        Open "C:\OldFich.txt" For Input As #2
            While Not EOF(2)
                Input #2, Ligne
                Tablo = Split(Ligne,"|")
                Tablo(7) = Replace(Tablo(7),"S", "A")
                For i = 0 to Ubound(Tablo) - 1
                     NewLigne = NewLigne & Tablo(i) & "|"
                Next
                Print #1, NewLigne
                NewLigne = ""
            Wend
        Close #2
    Close #1
    'Et pour donner au nouveau fichierle nom de l'ancien
    Name "C:\OldFich.txt" As "C:\OldFich.txt_sav.txt"
    Name "C:\NewFich.txt" As "C:\OldFich.txt"
    'Kill "C:\OldFich.txt_sav.txt" ça je le ferai après vérif 
    End Sub

  4. #4
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 9
    Par défaut
    Non en faite ce sont des fichiers textes, qu'on ouvre avec le bloc note ou word, mais on ma di de creer une macro pour rentre le changement de caracteres automatiquement qui au préalable se fesait a la main.

    Le code que tu ma donner consiste a quoi, car je comprend pas?

  5. #5
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Le dernier code ouvre ton fichier texte -> Tu remplaces OldFich par le nom de ton fichier et tu adaptes le chemin.

    Successivement,
    - Il crée un nouveau fichier pour pouvoir coller le texte modifié (NewFich)
    - Il lit OldFich ligne par ligne,
    - Il crée un tableau des données de la ligne avec split, le séparateur de données étant "|"
    Dans le tableau
    - Il remplace S par A dans la donnée qui va bien (Tablo(7))
    - Il recrée la ligne
    - ligne qu'il enregistre dans le nouveau fichier.
    Quand toutes les lignes du fichier OldFich ont été traitée,
    - Il ferme Oldfich et NewFich.

    Enfin, les trois dernières lignes servent à redonner au fichier créé (NewFich) son ancien nom (OldFich)
    Kill détruit la copie de OldFich mais je te conseille, pour tester, de ne pas la valider.
    Ainsi, tu gardes une sauvegarde de ton ancien fichier tel qu'il était sous un nouveau nom.
    Si tu as un problème, tu supprimes le fichier créé (qui porte le nom d'origine) et tu rebaptises la copie de l'original, en lui rendant son ancien nom. (C:\OldFich.txt_sav.txt -> C:\OldFich.txt) dans mon exemple
    Bon après-midi

    Mais si je reprends la première solution proposée, tu peux ouvrir ton fichier texte sous Excel et travailler dans la feuille de calculs ainsi créée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub test()
        Workbooks.OpenText Filename:="D:\Ton répertoire\TonFichier.txt", Origin:= _
            xlWindows, StartRow:=1, DataType:=xlDelimited, TextQualifier:=xlNone, _
            ConsecutiveDelimiter:=False, Tab:=False, Semicolon:=False, Comma:=False _
            , Space:=False, Other:=True, OtherChar:="|"
         Columns("H:H").Replace What:="A", Replacement:="S", LookAt:=xlPart
    End sub
    Par contre, pour l'enregistrer, comme les séparateurs sont des "|", tu devras enregistrer les données cellule par cellule. Je pense donc que le tps d'exécution sera plus grand (?)
    C'est toi qui vois
    A+

    (si le code pour écrire les données d'une feuille de calculs dans un txt, t'intéresse, mais je ne vois pas l'intérêt ici...)

  6. #6
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 9
    Par défaut
    Désolé je suis un peu blonde, mais je comprend pas!
    Le code que tu ma donné:

    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
    Sub Test()
    Dim Ligne As String, NewLigne, tablo as variant
    Open "C:\NewFich.txt" For Output As #1
        Open "C:\OldFich.txt" For Input As #2
            While Not EOF(2)
                Input #2, Ligne
                Tablo = Split(Ligne,"|")
                Tablo(7) = Replace(Tablo(7),"S", "A")
                For i = 0 to Ubound(Tablo) - 1
                     NewLigne = NewLigne & Tablo(i) & "|"
                Next
                Print #1, NewLigne
                NewLigne = ""
            Wend
        Close #2
    Close #1
    'Et pour donner au nouveau fichierle nom de l'ancien
    Name "C:\OldFich.txt" As "C:\OldFich.txt_sav.txt"
    Name "C:\NewFich.txt" As "C:\OldFich.txt"
    'Kill "C:\OldFich.txt_sav.txt" ça je le ferai après vérif 
    End Sub
    Je le met ou? j'ouvre une feuille excel et je le met dans une macro?

    Desolé

  7. #7
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 9
    Par défaut
    En faite je me suis mal expliquer les caracteres a modifier sont:
    A3=S1
    A4=S2
    A2=S16
    A6=S4
    A5=S3

    Donc ca doit pas etre le meme code

  8. #8
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Si ! "Les" codes fournis font la même chose et remplace le A par un S dans la 8ième colonne de ton txt.
    Avant "d'estimer" que des codes ne font pas l'affaire, teste-les. Sinon, il sert à rien "con" se décarcasse !

    Où placer le code ?
    Dans un module d'un classeur tout neuf.
    Dans Excel -> Menu Outils -> Macros -> VB Editor
    Dans VB Editor -> Insertion -> Module
    Et dans la feuille qui s'ouvre, tu colles le code. Puis tu remplaces OldFich par le chemin qui conduit à ton fichier et le nom de ton fichier.
    Pour NewFich, tu ajoutes le chemin et .txt à la fin
    Ex :
    Chemin = "C:\Documents and Settings\TonNom\Mes documents\"
    Pour OldFich => "C:\Documents and Settings\TonNom\Mes documents\TonFichier.txt"
    Pour NewFich => "C:\Documents and Settings\TonNom\Mes documents\NewName.txt"
    S'il sont là, remplace "TonNom" par ton nom
    Tu dis

    Si tu ne parviens pas à faire ça, je ne vois pas comment t'aider plus.
    Bon après-midi

  9. #9
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 9
    Par défaut
    J'te remercie pour ton aide, mais ca me fait rien. C'est pas grave jvais essayer de me debrouiller. merci bonne apres midi

  10. #10
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    As-tu tenté d'ouvrir ton txt avec Notepad après avoir lancé la macro ?
    Montre le code tel que tu l'a utilisé, avec les chemins et les noms de fichiers

    A tout hasard : Tu as bien exécuté la macro, une fois placée dans le module
    Tu fais un clic n'importe où dans la macro et un clic sur la flèche bleue
    ou bien, tape la touche F5
    Les deux exécutent la macro
    A te lire

  11. #11
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 9
    Par défaut
    Alors on m'a fourni un code qui marche tres bien:

    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
    Sub recherche()
        Dim valeur, vt, rep
        Dim Msg1, Style, Title, Response1
        rep = Array("A2", "A3", "A4", "A5", "A6")
        For i = 0 To 4
            valeur = rep(i)
            Title = "RECHERCHE de " & valeur
            Range("H1").Select
            On Error Resume Next
            ActiveSheet.Cells.Find(What:=valeur, After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _
                                   xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:=False) _
                                   .Activate
            If rep(i) = "A2" Then ActiveCell = "S16"
            If rep(i) = "A3" Then ActiveCell = "S1"
            If rep(i) = "A4" Then ActiveCell = "S2"
            If rep(i) = "A5" Then ActiveCell = "S3"
            If rep(i) = "A6" Then ActiveCell = "S4"
            Response1 = vbYes    'MsgBox(Msg1, Style, Title)
            Do While Response1 = vbYes
                Cells.FindNext(After:=ActiveCell).Activate    '
                If rep(i) = "A2" Then ActiveCell = "S16"
                If rep(i) = "A3" Then ActiveCell = "S1"
                If rep(i) = "A4" Then ActiveCell = "S2"
                If rep(i) = "A5" Then ActiveCell = "S3"
                If rep(i) = "A6" Then ActiveCell = "S4"
                If ActiveCell.Column <> 8 Then Range("H1").End(xlDown).Select
                vt = Application.Find(valeur, ActiveCell)
                If vt = 2015 Then GoTo pass
            Loop
    pass:
        Next
        MsgBox "Fin : les valeurs sont changées"
        Exit Sub
    End Sub
    Mais le probleme c'est qu'il faut que mes données soient par colonne, donc les données a modifier doivent etre dans la colonne H, il faut creer une macro pour ca?

  12. #12
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Par défaut
    Je te trouve gonflée et, apparemment, je ne suis pas le seul.
    Juste pour être certain que le code d'ouskel'n'or était valable, je l'ai modifié pour tenir compte de ta dernière modification de contrainte:
    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
    Sub Test()
      Dim Ligne As String, NewLigne As String, tablo As Variant
      Open "D:\TestReplaceNew.txt" For Output As #1
      Open "D:\TestReplace.txt" For Input As #2
      While Not EOF(2)
        Input #2, Ligne
        tablo = Split(Ligne, "|")
        tablo(7) = Replace(tablo(7), "A3", "S1")
        tablo(7) = Replace(tablo(7), "A4", "S2")
        tablo(7) = Replace(tablo(7), "A2", "S16")
        tablo(7) = Replace(tablo(7), "A6", "S4")
        tablo(7) = Replace(tablo(7), "A5", "S3")
        For i = 0 To UBound(tablo) - 1
             NewLigne = NewLigne & tablo(i) & "|"
        Next
        Print #1, NewLigne
        NewLigne = ""
      Wend
      Close #2
      Close #1
      'Et pour donner au nouveau fichierle nom de l'ancien '  Name "C:\OldFich.txt" As "C:\OldFich.txt_sav.txt"
    '  Name "C:\NewFich.txt" As "C:\OldFich.txt"
      'Kill "C:\OldFich.txt_sav.txt" ça je le ferai après vérif End Sub
    End Sub
    Ce code fait exactement ce que tu demandes, sans création de feuille dans Excel ni d'importation.

    Alors, soit tu tiens compte des conseils qui te sont donnés ici, soit tu prends le code qui t'a été proposé ailleurs et tu demandes à cet ailleurs de débugguer ce même code.
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

  13. #13
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 9
    Par défaut
    Non mais le probleme c'est que je voi pas a quoi ca sert ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Open "D:\TestReplaceNew.txt" For Output As #1
    Open "D:\TestReplace.txt" For Input As #2
    Moi j'ai plusieur document a modifier, donc je ratacheré la macro a un bouton et voila.

  14. #14
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Relis les explications qu'on t'a mises, tu as toutes les données. Déjà on a écrit le code pour toi et, à part prendre ta place, je ne vois pas ce qu'on pourrait faire de plus.

  15. #15
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 9
    Par défaut
    ok merci.

Discussions similaires

  1. [OL-2010] Comment modifier un Rendez vous dans Outlook avec une macro Excel
    Par Paritec dans le forum VBA Outlook
    Réponses: 5
    Dernier message: 13/06/2014, 17h27
  2. Réponses: 6
    Dernier message: 17/07/2013, 14h43
  3. Réponses: 26
    Dernier message: 13/10/2011, 16h25
  4. [AC-2003] Exécuter une macro Excel en passant des arguments
    Par tarnx dans le forum VBA Access
    Réponses: 2
    Dernier message: 29/12/2009, 09h40
  5. Réponses: 4
    Dernier message: 28/11/2007, 23h07

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