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 :

Macro VBA fonctionne pour un fichier .TXT créé à la main mais pas pour un fichier .TXT créé à partir d'un PDF


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Chef de projet NTIC
    Inscrit en
    Février 2015
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Février 2015
    Messages : 16
    Points : 6
    Points
    6
    Par défaut Macro VBA fonctionne pour un fichier .TXT créé à la main mais pas pour un fichier .TXT créé à partir d'un PDF
    Bonjour à tous (et surtout à ceux qui m'accorderont un bout de leur temps et de leur intelligence )

    J'ai développé une macro EXCEL VBA qui :
    - m'invite à ouvrir un fichier .txt (Je n'ai pas codé cette partie - simplement réutilisée)
    - parcourt le fichier ligne par ligne
    - Affiche les lignes de la forme 23.1.2 ou 22.1.4 (avec des nombres compris entre 0 et 255) SI ET SEULEMENT SI la ligne suivante est égale à "Computer ref: MOD: Var: Date"
    (VOIR fichier test.txt en Pièce Jointe)
    En gros via le fichier test.txt, il doit m'afficher : 22.3.1 PUIS 24. 2. 1 PUIS 22. 3. 1 PUIS 22. 3. 3

    Cette macro fonctionne très bien pour le fichier test.txt mais ne fonctionne pas pour le fichier MS.txt qui semble pourtant à première vue à voir le même contenu.
    La différence entre ces 2 fichiers est la suivante :
    test.txt : Créé via clic droit / nouveau fichier .txt / puis j'y ai écrit les lignes 1 à 1 à la main /Enregistrement du fichier test.tx
    MS.txt : Créé via Adobe Acrobat à partir du fichier MS1.pdf via fichier/Enregistrer sous/ Autres Options/Texte(accessible)/Enregistrement du fichier MS.txt

    J'ai constaté que le problème venait du fait que les test suivants :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If StrComp(Ligne, "Computer ref: MOD: Var: Date") = 0 Then
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If reg.Test(Ligne) Then
    ==> NB : reg est une expression régulière destinée à détecter tout ce qui est de la forme 22.3.1

    fonctionnent avec le fichier test.txt mais sont TOUJOURS faux pour le fichier MS.txt

    Question : Sauriez vous m'expliquer pourquoi ces 2 lignes de test fonctionnent avec fichier .txt créé de toute pièce mais restent toujours à faux lorsque le fichier .txt a été créé à partir de Adobe Acrobat ?

    Hypothèse : Je verrais bien un problème d'encodage lors de la conversion de PDF ==> TXT
    On peut notamment voir que dans le fichier MS.txt créé à partir du PDF il y a un petit signet à la fin qui n'y était pourtant pas dans le fichier PDF d'origine.

    MERCI à tous ceux qui m'apporteront leur aide !! test.txtMS.txtMS1.pdf

  2. #2
    Expert éminent sénior
    Avatar de kiki29
    Homme Profil pro
    ex Observeur CGG / Analyste prog.
    Inscrit en
    Juin 2006
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ex Observeur CGG / Analyste prog.

    Informations forums :
    Inscription : Juin 2006
    Messages : 6 132
    Points : 11 274
    Points
    11 274
    Par défaut
    Salut, voir Copier/Coller le texte des PDFs d'un dossier ( recherche récursive ou non ) dans une feuille Excel via Acrobat Reader, si cela peut t'aider. Il y a un lien vers un téléchargement ( source complet )

  3. #3
    Futur Membre du Club
    Femme Profil pro
    Chef de projet NTIC
    Inscrit en
    Février 2015
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Février 2015
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    Bonjour Kiki29 et merci pour ta réponse.

    Par contre, je ne vois pas trop le lien entre le sujet de discussion que tu m'as indiqué et ma question. En effet, ma question porte plutôt sur la différence qu'il peut exister entre un fichier .TXT créé de manière classique et un fichier .TXT créé via une conversion d'un fichier PDF en .TXT.

  4. #4
    Expert éminent sénior
    Avatar de kiki29
    Homme Profil pro
    ex Observeur CGG / Analyste prog.
    Inscrit en
    Juin 2006
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ex Observeur CGG / Analyste prog.

    Informations forums :
    Inscription : Juin 2006
    Messages : 6 132
    Points : 11 274
    Points
    11 274
    Par défaut
    Re, comme on dit : pas de bras pas de chocolat .....

  5. #5
    Futur Membre du Club
    Femme Profil pro
    Chef de projet NTIC
    Inscrit en
    Février 2015
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Février 2015
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    Encore une fois, je ne vois pas trop le lien entre ta réponse et le sujet de la discussion........

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Retraité
    Inscrit en
    Août 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Août 2007
    Messages : 6
    Points : 8
    Points
    8
    Par défaut VBA txt
    Bonjour,
    à première vue fichiers identiques...
    à deuxième vue le MS.txt a un caractère en plus à la fin de chaque ligne (peut-être un espace, mais cela reste à vérifier, en faisant un pas à pas en vba) .

    en passant: Salut kiki29
    Cordialement

  7. #7
    Membre expérimenté
    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 660
    Points : 1 399
    Points
    1 399
    Par défaut
    Bonjour,

    Il s'agit bien d'espaces en plus.
    Ce pattern fonctionne sur les 2 fichiers:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "^(\d+\. *\d+\. *\d+) *\r\nComputer ref\: MOD\: Var\: Date *$"
    (à supposer que tu aies bien reg.MultiLine = True)

  8. #8
    Futur Membre du Club
    Femme Profil pro
    Chef de projet NTIC
    Inscrit en
    Février 2015
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Février 2015
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    Bonjour Promethee25 et merci beaucoup pour ta réponse !

    Je testerai ta réponse Mardi quand je serai au boulot. Maintenant que tu le dis, ça semble très plausible .

    Je vous tiendrai au courant une fois testé

    PS: Au passage, ton expression régulière est bien plus simple que la mienne...Je dois encore progresser là-dessus c'est certain !

  9. #9
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 904
    Points : 10 168
    Points
    10 168
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    Pour tester des expressions rationnelles:

    Expresso

    http://www.ultrapico.com

    J'ai mis l'adresse de mémoire. Aux dernières nouvelles que j'en ai eu, il était gratuit.
    À ma connaissance, le seul personnage qui a été diagnostiqué comme étant allergique au mot effort. c'est Gaston Lagaffe.

    Ô Saint Excel, Grand Dieu de l'Inutile.

    Excel n'a jamais été, n'est pas et ne sera jamais un SGBD, c'est pour cela que Excel s'appelle Excel et ne s'appelle pas Access junior.

  10. #10
    Futur Membre du Club
    Femme Profil pro
    Chef de projet NTIC
    Inscrit en
    Février 2015
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Février 2015
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    Merci beaucoup clementmarcotte !

    Je me pose une question sur la façon d'utiliser Si j'opte pour cette méthode.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    reg.MultiLine = True
    reg.Pattern = "^(\d+\. *\d+\. *\d+) *\r\nComputer ref\: MOD\: Var\: Date *$"
    Je comprends qu'on recherche dans notre fichier .TXT un schéma du style :
    23.1.2
    Computer ref\: MOD\: Var\: Date

    Du coup, je ne peux plus tester ligne à ligne comme je le faisais avant via le code Comment dois-je procéder pour :
    - appliquer mon pattern
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    reg.Pattern = "^(\d+\. *\d+\. *\d+) *\r\nComputer ref\: MOD\: Var\: Date *$"
    Peut-être quelque chose comme : ??
    Je l'applique à mon fichier directement ?
    - ne récupérer QUE la partie correspondant à (\d+\. *\d+\. *\d+) du pattern pour la copier dans un fichier .TXT


    Voici en substance ce que je faisais jusqu'à présent (désolé je n'ai pas mon code sous les yeux) :
    En gros, je comparais chaque ligne à mon pattern (qui détecte les lignes du style 23.1.2) et à la chaine "Computer ref\: MOD\: Var\: Date "
    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
     
     
    Sub Main()
     
    Dim fichier As String
    Dim numFichier As Integer
    Dim Ligne As String
    Dim reg As New VBScript_RegExp_55.RegExp
     
    reg.Pattern = "(\d+\. *\d+\. *\d+) *"
     
     
    fichier = "CheminVersMonFichierTXT\test.txt"
    numFichier = FreeFile
     
     
    Open fichier For Input As numFichier
     
    While Not EOF(1)
        Line Input #numFichier, Ligne
     
        'Je teste si la ligne courante est de la forme 21.2.3 (par exemple)
        If reg.Test(Ligne) Then
            ligneStockee = ligne
            premiereConditionAValider = True
        End If
     
         'Je teste si la ligne courante est égale à "Computer ref\: MOD\: Var\: Date "
         If (ligne =  "Computer ref\: MOD\: Var\: Date ")
              deuxiemeConditionAValider = True
         End If
     
          'Je teste si les deux conditions sont validées (à savoir si j'ai les deux lignes qui m'intéressent qui se suivent) et si c'est le cas j'écris la ligne stockée dans un autre fichier TXT de sortie
          If premiereConditionAValider == True AND deuxiemeConditionAValider == True
                'Je copie ligneStockée dans un fichier TXT
           End If 
     
    Wend
     
    End Sub

    Merci !

  11. #11
    Membre expérimenté
    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 660
    Points : 1 399
    Points
    1 399
    Par défaut
    Bonjour,

    Il faut te servir des propriétés de l'objet reg:

    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 reg As New VBScript_RegExp_55.RegExp
        Dim matches As VBScript_RegExp_55.MatchCollection
        Dim match As VBScript_RegExp_55.match
        Dim txt As String
     
        txt = ReadTxtFile(ThisWorkbook.Path & "\test.txt")
     
        reg.Global = True
        reg.MultiLine = True
        reg.Pattern = "^(\d+\. *\d+\. *\d+) *\r\nComputer ref\: MOD\: Var\: Date *$"
     
        If reg.test(txt) Then
            Set matches = reg.Execute(txt)
     
            For Each match In matches
                Debug.Print "- Texte récupéré correspondant au pattern complet:" & vbCrLf & match.Value
                Debug.Print "- 1er et unique groupe récupéré (1 groupe = 1 jeu de parenthèses):" & vbCrLf & match.SubMatches(0)
            Next match
        End If
    End Sub
    Multiline à True veut simplement dire que '^' représente un début de ligne et '$' une fin de ligne alors qu'ils représentent le début et la fin du texte quand c'est à False.
    Global à True permet de récupérer toutes les occurrences répondant au pattern, c'est ce qu'il te faut. La méthode Execute permet de récupérer toutes ces occurrences dans une collection de classe MatchCollection.
    En bouclant dessus, tu peux traiter ces dernières en récupérant soit le texte complet correspondant au pattern (match.Value), soit les parties qui t'intéressent vraiment, c'est-à-dire les "groupes" (zones entre parenthèses). Il peut y en avoir plusieurs et tous ces groupes sont stockés dans le tableau match.submatches (1er indice à 0).


    Edit: Dans mon exemple, le fichier texte est lu en 1 fois et stocké dans txt, il n'est pas lu ligne par ligne.
    Derrière, l'objet reg se débrouille.

    Ex de lecture (mais il y a plus rapide avec du "Open for Binary")
    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
    Private Function ReadTxtFile(txtFile As String) As String
        'This function returns the whole content of a text file as one string.
        Dim fso As Object
        Dim f As Object
     
        Const ForReading As Integer = 1
     
        Set fso = CreateObject("Scripting.FileSystemObject")
     
        On Error Resume Next
        Set f = fso.OpenTextFile(txtFile, ForReading)
        On Error GoTo 0
        If f Is Nothing Then Err.Raise vbObjectError + 10001, , "File " & txtFile & " could not be found."
     
        'If empty file, an error is raised; continue
        On Error Resume Next
        ReadTxtFile = f.ReadAll
        f.Close
     
    End Function

  12. #12
    Futur Membre du Club
    Femme Profil pro
    Chef de projet NTIC
    Inscrit en
    Février 2015
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Février 2015
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    Bonjour à tous,

    Je me permets de relancer le fil de discussion car je m'y suis replongé dernièrement et j'ai souhaité utiliser les lignes de code proposées par Promethee25.

    Malheureusement, je n'arrive pas à utiliser cette méthode étant donné que mon EXCEL ne reconnait pas les lignes suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Dim reg As New VBScript_RegExp_55.RegExp
    Dim matches As VBScript_RegExp_55.MatchCollection
    Dim match As VBScript_RegExp_55.match
    Il m'indique le message suivant : Erreur de compilation: Type défini par l'utilisateur non défini

    Pour info, jusqu'à présent je définissais mon expression régulière et ses propriétés comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Dim reg As Object
    Set reg = CreateObject("vbscript.regexp")
    reg.pattern = "...."
    De même, mon EXCEL ne connaît pas ce genre d'instructions...
    Private Results As MatchCollection
    Private Item As Match

    Du coup, ce morceau de code ne fonctionne pas non plus...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
        If reg.test(txt) Then
            Set matches = reg.Execute(txt)
     
            For Each match In matches
                Debug.Print "- Texte récupéré correspondant au pattern complet:" & vbCrLf & match.Value
                Debug.Print "- 1er et unique groupe récupéré (1 groupe = 1 jeu de parenthèses):" & vbCrLf & match.SubMatches(0)
            Next match
        End If
    Question : Dois-je activer une librairie qui n'est pas active par défaut ? Ou carrément installer une librairie non installée par défaut ?
    Je préfèrerais largement trouver une solution qui n'implique pas l'installation de cette (potentielle) librairie non installée par défaut car je ne serai pas le seul utilisateur de cette macro et souhaite la rendre utilisable par le plus grand nombre sans manip particulière.


    Mon objectif : Voici désormais ce que je souhaite réaliser avec ma macro :
    Entrée Macro : fichier inVBA.txt (voir PJ)
    Sortie Macro : 23. 1. 2 v6i4 ; 23. 1. 3 v7i7
    En fait dès que j'ai le schéma suivant ("23. 1. 2" suivi de "Computer ref: MOD: Var: Date"), je souhaite récupérer les infos marquées d'une flèche

    23. 1. 2 <==
    Computer ref: MOD: Var: Date
    Book Chapter Sheet Issue Author
    XXX.XXXXXXXX
    6 <==
    4 <== 15/10/14

    Comment faire pour faire du MultiLine sans passer par
    VBScript_RegExp_55.RegExp
    VBScript_RegExp_55.MatchCollection
    VBScript_RegExp_55.match


    Merci beaucoup pour votre aide !
    Fichiers attachés Fichiers attachés

  13. #13
    Membre expérimenté
    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 660
    Points : 1 399
    Points
    1 399
    Par défaut
    Bonjour,

    Il faut aller dans Outils -> Références et cocher "Microsoft VBScript Regular Expressions 5.5".

  14. #14
    Membre émérite
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Points : 2 684
    Points
    2 684
    Par défaut
    Bonjour..

    Si le problème est l'espace de droite, tu pourrais supprimer les espaces de droite avec RTrim

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
         If StrComp(RTrim(textline), "Computer ref: MOD: Var: Date") = 0 Then
    Cordialement

    Docmarti.

  15. #15
    Futur Membre du Club
    Femme Profil pro
    Chef de projet NTIC
    Inscrit en
    Février 2015
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Février 2015
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    Merci Promethee25 !!! Merci également DocMart pour l'info.

    @+

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

Discussions similaires

  1. mod_rewrite fonctionne pour un vhost mais pas pour l'autre
    Par Romalafrite dans le forum Apache
    Réponses: 3
    Dernier message: 31/12/2014, 11h22
  2. [XL-2010] Importer csv faux fonctionne mais pas pour ce CSV
    Par bastou93 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 05/07/2011, 10h26
  3. Macro VBA fonctionnant a la fois dans Excel 2003 et Excel 2007
    Par sebmetz dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 29/07/2008, 19h40
  4. Réponses: 9
    Dernier message: 25/04/2008, 22h21

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