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 :

Import .txt vers .xls par VB [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 43
    Points : 22
    Points
    22
    Par défaut Import .txt vers .xls par VB
    Bonjour,

    Tout d'abord petite présentation :

    Etudiant en IUT info, je me retrouve plongé dans une formation accès sur le développement alors que je suis issu du milieu "réseau".

    Actuellement en alternance, j'ai un projet à réaliser mais novice que je suis en développement (je n'ai jamais développé) je me trouve bloqué.

    Ce que l'on me demande :

    A partir d'un fichier texte généré une fois par jour, récapitulant la gestion d'un stock (date, reférence produits, quantités, entrée, sortie) je dois importer ces données dans un tableau Excel existant.

    Pour cela je dois passer par du VB, charger le fichier texte en mémoire et le parcourir via des commandes VB, en tout cas il me semble que c'est la procédure à entreprendre...

    Mais je ne vois pas du tout comment faire intéragir un tableau Excel et un fichier texte en passant par du langage VB.

    Je cherche actuellemnt des pistes sur la toile mais les informations que je trouve ne font que m'embrouiller les idées !

    Entrant dans une phase de découragement j'aurais aimé avoir votre avis sur la situation.

    Merci d'avance,

    PS : ci-dessous un extrait du fichier texte à traiter.
    Fichiers attachés Fichiers attachés

  2. #2
    Membre habitué
    Inscrit en
    Septembre 2007
    Messages
    220
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Septembre 2007
    Messages : 220
    Points : 177
    Points
    177
    Par défaut
    Salut!
    Commence par te mettre dans un fichier excel, lance l'enregistreur de macros, et à partir d'excel, va ouvrir ton fichier txt (fichier, ouvrir, modifie le filtre en tous types de fichiers - chez moi c'est All Files - afin de voir ton fichier txt, ouvre le, suis l'assistant selon tes besoins). Une fois ton fichier txt ouvert dans Excel, stoppe l'enregistreur et regarde ce qu'il a enregistré comme code.
    Ca te donnera un bon début.
    Après, si t'as tjs des problème, on pourra plus t'aider.
    A+
    Mél

  3. #3
    Membre émérite Avatar de Fvandermeulen
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    1 869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 869
    Points : 2 662
    Points
    2 662
    Par défaut
    Bonjour Loupire et bienvenue,
    Pour ton info tu as la possibilité de faire des recherches sur le forum, ce qui te permet de trouver d'autres discussions qui peuvent répondre à ton besoin car c'est un sujet qui a souvent été abordé.

    En voici un exemple:
    http://www.developpez.net/forums/d85...te-vers-excel/

    Reste a adapter à ton cas, par exemple pas d'ajout de feuille (d'ailleurs la dernière partie qui renomme les feuilles ne te concerne pas)
    Cet exemple à l'avantage de montrer comment parcourir les lignes du fichier text.

    Je donne cet exemple à titre d'alternative à l'enregistreur de macro, d'autant que tu parles de parcourir le fichier Text, le code obtenu avec l'enregistreur ne le fait pas.

    A+

    A+
    N'oubliez pas le si votre problème est solutionné.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 43
    Points : 22
    Points
    22
    Par défaut
    Citation Envoyé par melouille56 Voir le message
    Salut!
    Commence par te mettre dans un fichier excel, lance l'enregistreur de macros, et à partir d'excel, va ouvrir ton fichier txt (fichier, ouvrir, modifie le filtre en tous types de fichiers - chez moi c'est All Files - afin de voir ton fichier txt, ouvre le, suis l'assistant selon tes besoins). Une fois ton fichier txt ouvert dans Excel, stoppe l'enregistreur et regarde ce qu'il a enregistré comme code.
    Ca te donnera un bon début.
    Après, si t'as tjs des problème, on pourra plus t'aider.
    A+
    Mél

    Merci beaucoup pour cette réponse, c'est un bon début en effet.

    J'ai une petite question :
    Dois-je obligatoirement importer mon fichier texte sous Excel (Cas 1)?
    Ou est-il possible de travailler directement entre Excel et le fichier texte par l'intermédiaire de VB (Cas 2)?

    Cas 1 :
    Fichier Excel <-(VB)- Fichier Texte importé au format Excel <-(Import)- Fichier Texte

    Cas 2 :
    Fichier Excel <-(VB)- Fichier Texte

    J'espère que ce petit schéma est clair...





    D'autre part quand je suis ta procèdure qui à mes yeux correspond au Cas 1 le code obtenu dans VB est le suivant :

    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
    Sub Macro1()
    '
    ' Macro1 Macro
    '
     
    '
        With ActiveSheet.QueryTables.Add(Connection:= _
            "TEXT;D:\Projet EXCEL_VB_TXT\EUROFIT-FR-INVRPT.wri", Destination:=Range( _
            "$A$1"))
            .Name = "EUROFIT-FR-INVRPT"
            .FieldNames = True
            .RowNumbers = False
            .FillAdjacentFormulas = False
            .PreserveFormatting = True
            .RefreshOnFileOpen = False
            .RefreshStyle = xlInsertDeleteCells
            .SavePassword = False
            .SaveData = True
            .AdjustColumnWidth = True
            .RefreshPeriod = 0
            .TextFilePromptOnRefresh = False
            .TextFilePlatform = 437
            .TextFileStartRow = 1
            .TextFileParseType = xlFixedWidth
            .TextFileTextQualifier = xlTextQualifierDoubleQuote
            .TextFileConsecutiveDelimiter = False
            .TextFileTabDelimiter = True
            .TextFileSemicolonDelimiter = False
            .TextFileCommaDelimiter = False
            .TextFileSpaceDelimiter = False
            .TextFileColumnDataTypes = Array(2)
            .TextFileTrailingMinusNumbers = True
            .Refresh BackgroundQuery:=False
        End With
    End Sub

    Citation Envoyé par Fvandermeulen Voir le message
    Bonjour Loupire et bienvenue,
    Pour ton info tu as la possibilité de faire des recherches sur le forum, ce qui te permet de trouver d'autres discussions qui peuvent répondre à ton besoin car c'est un sujet qui a souvent été abordé.

    En voici un exemple:
    http://www.developpez.net/forums/d85...te-vers-excel/

    Reste a adapter à ton cas, par exemple pas d'ajout de feuille (d'ailleurs la dernière partie qui renomme les feuilles ne te concerne pas)
    Cet exemple à l'avantage de montrer comment parcourir les lignes du fichier text.

    Je donne cet exemple à titre d'alternative à l'enregistreur de macro, d'autant que tu parles de parcourir le fichier Text, le code obtenu avec l'enregistreur ne le fait pas.

    A+

    A+

    Merci aussi pour cette réponse !

    Je suis en plein dans mes recherches sur le forum... j'ai déjà quelques pistes mais n'ayant aucune base en développement je rame énormément !
    Je suis entrain d'imprimer les PDF sur le VBA et les scripts VB proposés sur le forum.
    Et j'ai retenu les posts suivants :

    http://www.developpez.net/forums/d84...t-xls-louvrir/

    http://www.developpez.net/forums/d84...-excel-vb-net/

    http://www.developpez.net/forums/d85...re-word-excel/

  5. #5
    Membre émérite Avatar de Fvandermeulen
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    1 869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 869
    Points : 2 662
    Points
    2 662
    Par défaut
    Re,
    Il y a plusieurs manières de faire, le tout est de savoir ce que tu dois "récupérer" pour l'ajouter au tableau existant...

    Toujours les mêmes ligne dans le fichier text?
    Toujours commençant par le mot "Total"?
    ...

    Quoi qu'il en soit ton fichier texte n'étant pas délimité de manière vraiment structurée du vas de toute façon "chipoter".

    Donne un peu plus d'info sur ce que tu dois vraiment extraire et on verra

    A+
    N'oubliez pas le si votre problème est solutionné.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 44
    Points : 73
    Points
    73
    Par défaut
    apparemment, dans le fichier texte les items a recupérer sont organisés de facon identique.
    Bon sinon le truc a faire selon moi:
    1) Charger le fichier texte dans une variable vb
    2) Récupérer les données voulues en suivant l'ordre des items,
    chaque nouvel item commence par: "Line Item No. "
    donc reperer cette chaine de caractere dans le fichier et parcourir le fichier tant qu'on est pas arrivé au bout ("EOF")
    Pour bien reperer les valeurs dans le fichier texte on pourrait aussi voir avec l'utilisation de valeurs par défaut stockées dans des variables type array et/ou utiliser des expressions régulières...
    3) on stock les données voulues dans des variables vb
    4) avant de passer a l'item suivant (a la fin de la boucle): stocker les valeurs dans le tableau excel

    Si quelqu'un peut commenter en donnant le nom des fonctions vb ou des exemples de code faisant ca, ca permettrai d'avancer plus rapidement aussi

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 43
    Points : 22
    Points
    22
    Par défaut
    Citation Envoyé par Fvandermeulen Voir le message
    Donne un peu plus d'info sur ce que tu dois vraiment extraire et on verra
    J'aurais bien aimé illustrer mes dires par des captures d'écran mais l'entreprise pour laquelle je travaille à tout sécurisé.

    Je vais essayer d'être le plus clair possible, le fichier texte est un fichier de gestion de stock je le detail ci-dessous :

    1 - Entête étant toujours présente en début de fichier :
    INVENTORY REPORT OF MOVEMENT QUANTITY
    Message-Date : 18.01.10 Messagenumber : 2169

    Inventory Controller
    Name: 0931342821220USA1

    Warehouse Keeper
    Name: 0002493945232
    Je dois extraire la date d"édition du fichier de l'entête.

    2 - Suite du fichier (exemple de produit n'ayant pas d'impact sur le stock):
    Line Item No. 1
    Customer Article No : 403120106R

    Buyer :
    Supplier : 225/65 R 16
    Goods Receiver :
    Seller :
    Point of Delivery :


    Movement direction Natur stock Movement reason Movement instruction
    -------------------- -------------- -------------------- -----------------------------
    Balance Saleable stock

    Quantity Unit Movement date Delivery date Booking date
    --------- ---- --------------- --------------- ---------------
    1140 PCE 18.01.10 23:15 . . : . . :

    Ref. Order Order Date Ref. Invoice Invoice Date Ref. Despatch advice Despatch Date
    -------------------- ------------- -------------------- ------------- -------------------- -------------
    . . . . . .
    En gras ce que je dois récupérer pour l'Item No. 1:
    - Customer Article No (ref. produit)
    - Movement direction (état du mouvement : Entree, Sortie, Néant=Balance)
    - Quantity (si Entrée ou Sortie, si Néant laisser le stock comme il est)
    - Dans ce cas le stock ne bouge pas car Movement direction = Balance

    3 - Suite du fichier (Exemple de Sortie de Stock)
    Line Item No. 5
    Customer Article No : 8200511156

    Buyer : 09317801299870017
    Supplier : 205/75 R16
    Goods Receiver : 09317801299870017
    Seller : 0931342821220USA1
    Point of Delivery : GRD1


    Movement direction Natur stock Movement reason Movement instruction
    -------------------- -------------- -------------------- -----------------------------
    Returned to Supplier Saleable stock Desptach to customer Movement not to be invoiced

    Quantity Unit Movement date Delivery date Booking date
    --------- ---- --------------- --------------- ---------------
    570 PCE 18.01.10 23:15 18.01.10 07:43 18.01.10 07:43

    Ref. Order Order Date Ref. Invoice Invoice Date Ref. Despatch advice Despatch Date
    -------------------- ------------- -------------------- ------------- -------------------- -------------
    126585 18.01.10 39800 18.01.10 39800 18.01.10



    Buyer :
    Supplier :
    Goods Receiver :
    Seller :
    Point of Delivery :


    Movement direction Natur stock Movement reason Movement instruction
    -------------------- -------------- -------------------- -----------------------------
    Balance Saleable stock

    Quantity Unit Movement date Delivery date Booking date
    --------- ---- --------------- --------------- ---------------
    270 PCE 18.01.10 23:15 . . : . . :

    Ref. Order Order Date Ref. Invoice Invoice Date Ref. Despatch advice Despatch Date
    -------------------- ------------- -------------------- ------------- -------------------- -------------
    . . . . . .
    En gras ce que je dois récupérer pour l'Item No. 5:
    - Customer Article No (ref. produit)
    - Movement direction (état du mouvement : Entree, Sortie, Néant=Balance)
    - Quantity (si Entrée ou Sortie, si Néant laisser le stock comme il est)
    - Dans ce cas c'est une sortie, Movement direction = Return to supplier
    - A chaque Entrée ou Sortie je dois récupérer Ref. Despatch advice qui est le numéro de bon de livraison

    Note : après une Entrée ou sortie je dois refaire une Balance comme dans l'Item No. 1


    Bonne nouvelle je peux vous envoyer des captures !
    Donc voilà la capture d'écran de mon tableau Excel dans lequel les données vont devoir être injectées, on y retrouve les données en gras du fichier texte.


  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 43
    Points : 22
    Points
    22
    Par défaut
    Au niveau de l'algo cela convient-il ?

    Ouverture du fichier .txt
    Parcours des lignes du fichier .txt
    Si « ligne contient Line Item No. »
    | Alors « passer a la ligne suivante »
    | Si « ligne contient Customer Article No. »
    | | Alors « extraire le No. et passer a la ligne suivante »
    | | Si « ligne contient Movement direction »
    | | | Alors « passer 1 ligne »
    | | | Si « ligne contient Returned ou Received » /*Si ligne contient Balance reboucler sur Item suivant*/
    | | | | Alors « passer 1 ligne »
    | | | | Si « ligne contient quantity »
    | | | | | Alors « passer 1 ligne et extraire quantité »
    | | | | | ET « passer 1 ligne »
    | | | | | Si « ligne contient Ref. Despatch »
    | | | | | Alors « passer 1 ligne et extraire Ref. »
    | | | | Fin Si
    | | | Fin Si
    | | Fin Si
    | Fin Si
    Fin Si

    Au fil des lectures de ligne si 1 des Test n’est pas VRAI boucler sur l’Item suivant.

    Au niveau de la vérification je ne pense pas passer par un tableau de valeur mais faire des test avec la recherche de chaîne de caractères dans une autre chaîne (exemple sur le forum) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    pos = InStr(si ... = "...") 'renvoie 24
    pos = InStr(si ... = "...") 'renvoie 0
    Si j'ai un renvoi 0 c'est que les caractères recherchés ne sont pas présent donc je boucle sur l'Item suivant. Si le renvoi est positif continuer...

  9. #9
    Membre émérite Avatar de Fvandermeulen
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    1 869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 869
    Points : 2 662
    Points
    2 662
    Par défaut
    Re,
    C'est bien je vois que tu as bossé , moi pas eu le temps de vraiment regarder, mais a priori c'est un bon début

    As tu pensé au ".find" ? ça pourrait peut-être alléger l'algo si tu le couple avec un select case par exemple
    Je te laisse chercher un peu, poste tes trouvailles, dès que j'ai le temps je m'y met.

    A+
    N'oubliez pas le si votre problème est solutionné.

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 43
    Points : 22
    Points
    22
    Par défaut
    Je recherche des infos sur le .find et sur select case.

    Pour select case c'est une instruction permettant d'éviter les Si imbriqués ?

    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
    Select Case (Expression) 
     
    Case Valeur1: 
    	Liste d'instructions
     
    Case Valeur2: 
    	Liste d'instructions
     
    Case Valeur...: 
    	Liste d'instructions
     
    Case Else 
     
    	Liste d'instructions
     
    End Select
    Et le .find va me permettre de faire une recherche de caractères si j'ai bien suivi...

    ...mais cette fonction s'applique sur des cellule Excel oO ? Pas sur un fichier .txt ?

    Ce qui pourrait donner grossiérement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Select Case (Expression) 
    
    Case Valeur1: 
    	Selection.find ..... /*tester sur la ligne selectionner "....."*/
    
    Case Valeur2: 
    	Selection.find .....
    
    .........
    
    End Select

  11. #11
    Membre émérite Avatar de Fvandermeulen
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    1 869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 869
    Points : 2 662
    Points
    2 662
    Par défaut
    Oui, c'est ça

    Pour le select Case pense à tes Returned/Received/Balance tu verras l'utilité

    Pour le .find, c'est bien une recherche à laquelle tu peux affecter une adresse de cellule, facile alors de trouver la cellule en dessous, toujours à titre d'exemple pour ton cas.

    Voici un post qui en parle
    http://www.developpez.net/forums/d85...lage-colonnes/

    Bonne continuation,
    N'oubliez pas le si votre problème est solutionné.

  12. #12
    Membre émérite Avatar de Fvandermeulen
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    1 869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 869
    Points : 2 662
    Points
    2 662
    Par défaut
    Re,
    J'ai commencé à adapter le code pour ton cas, pour l'instant test sur la ligne du fichier test pour ne pas copier dans excel les lignes clairements inutiles (vide, ., -)

    De là, reste à voir comment détecter les éléments nécessaires, je crois vraiment que le .find ou éventuelment un Match devrait faire l'affaire mais aujourd'hui plus le temps.

    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
    Sub ImportTxtNew()
    Dim ligne As String, strFullName As String
    Dim i As Long
     
        Worksheets.Add 'Ajoute une feuille
        strFullName = Application.GetOpenFilename("Fichiers textes (*.txt),*.txt", , _
        "Sélectionnez un fichier :") 'Boite de dialogue qui permet de sélectionner le fichier Text à importer
     
        Open strFullName For Input As #1 'L'ouvre en tant que 'source' pour le traitement
     
        Do While Not EOF(1) 'Tant que non vide
                Do While (Not EOF(1)) And (i < 65500) 'A faire jusqu'à la ligne 65500
                    Input #1, ligne 'Récupère la ligne du fichier Text
                    If ligne <> "" And Left(ligne, 1) <> "." And Left(ligne, 1) <> "-" Then 'Si vide ou commencant par . ou - alors pas "copié"
                        i = i + 1 'Incrémentation du compteur
                        Cells(i, 1).Value = ligne 'Place la ligne du fichier text dans la 1ère colonne
                    End If
                    Loop
            If i < 65500 Or EOF(1) Then Exit Do 'Après le traitement des 65500 ligne ajout d'une autre feuille pour la suite
                i = 0 'Remet le compteur à zéro
                Worksheets.Add 'ajoute une feuille, qui devient la feuille "active"
        Loop
        Close #1 'Ferme l'instance Text
     
    End Sub
    N'oubliez pas le si votre problème est solutionné.

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 43
    Points : 22
    Points
    22
    Par défaut
    Bonjour, je viens de parcourrir ton code... même si je ne comprends pas tout je vois où il nous conduit (enfin je crois !).

    Petites questions :

    • 2 reprises tu parles de "Worksheets.Add" ajoute une nouvelle feuille et ajoute une feuille qui devient active... peux tu m'en dire plus sur ces ajouts de feuilles ?

      Ca ne concerne pas ma feuille Excel de base (tableau de destination) ?

      Ce sont des feuilles de recupération de données créées pour stocker les données utiles à la réalisation du programme (variables VB) ?

      Vont elles être gardées en mémoire ou supprimées des que le tableau Excel de destination sera rempli ?


    • [Autre point dans ton exemple le test se fait de la première à la 65500 ème ligne, dans le cas de mon traitement le test devra se faire produit par produit, on test un produit, puis le second, etc... jusqu'à ce que le fichier soit vide.


    Je sais du matin ça fait mal de répondre à ça ^^


    Je regarde avec la personne m'ayant demande de realiser le projet ce sur quoi nous allons nous baser... des que je termine mon bout de code je le post pour me dire ce que tu en pense !!!

  14. #14
    Membre émérite Avatar de Fvandermeulen
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    1 869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 869
    Points : 2 662
    Points
    2 662
    Par défaut
    Salut,

    Pour l'instant je me suis dit qu'il était plus simple de nettoyer au mieux le fichier text et de le mettre dans une feuille Excel (provisoire) => Add
    On pourra supprimer cette feuille lorsque toutes les infos auront été placées dans ton tableau final.
    Il y a une autre alternative via les Tablo() mais si tu débute c'est peut-être pas le plus accessible.

    Sur base des données de cettte feuille il me semble assez facile de trouver les mots cléfs qui permettent de "sortir" les données voulues. Via .find ou Match et Offset, mais je regarderai ça un peu plus tard...

    Pour les 65000 lignes, c'est un code récupéré, à la base je l'utilise pour importer des fichiers textes de +/- 165 000 lignes, comme je suis sur Excel2003, je dois créer des feuilles supplémentaire étant limité à 65536 lignes par feuille.

    A+
    N'oubliez pas le si votre problème est solutionné.

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 43
    Points : 22
    Points
    22
    Par défaut
    Voila on a recadre un peu le projet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Open ("h:\....\....\xxxxxxx.txt") For Input As #1         /* ouverture du fichier en lecture */
     
    While Not EOF(1)              				  /* demarrage de la boucle pour lecture du fichier */	
     
        lign$ = ""						  /* initialisation d une variable à ""
     
    	Line Input #1, lign$				  /* lire une ligne du fichier et passage à la ligne suivante (et affactation dans une variable chaine)
     
        	If instr(1,lign$,"Customer Article No.")<> 0 then /* test sur la presence de la chaine de caractère recherchee dans la ligne du fichier lu */
     
    wend    						  /* fin boucle */
     
    close #1						  /* fermeture du fichier */
    Les test seront exerces avec la fonction "instr" si le test est 0 passer a l'article suivant si le test est positif extraire la valeur et l'importer dans le tableau Excel...

    Cela te parrait-il valable ?





    EDIT :

    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
    Sub ImportNewTxt()
     
    Open ("D:\Projet EXCEL_VB_TXT\Test\text.wri") For Input As #1
    'ouverture du fichier en lecture
     
    While Not EOF(1)
    'demarrage de la boucle pour lecture du fichier
     
        lign$ = ""
        'initialisation d une variable à ""
     
        Line Input #1, lign$
        'lire une ligne du fichier et passage à la ligne suivante (et affactation dans une variable chaine)
     
        If InStr(1, lign$, "Customer Article No.") <> 0 Then
        'test NEGATIF sur la presence de la chaine de caractère recherchee dans la ligne du fichier lu
        End If
     
        If InStr(1, lign$, "Customer Article No.") <> 1 Then
        'test POSITIF sur la presence de la chaine de caractère recherchee dans la ligne du fichier lu
     
        '''CODE PERMETTANT DE RECUPERER LA VALEUR DE Customer Article No. ET DE LA PLACER DANS LE TABLEAU FINAL'''
     
        End If
     
        '''TEST SUIVANT ET RECUPERATION'''
     
     
    Wend
    'fin boucle
     
    Close #1
    'fermeture du fichier
     
    End Sub

  16. #16
    Membre émérite Avatar de Fvandermeulen
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    1 869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 869
    Points : 2 662
    Points
    2 662
    Par défaut
    Salut,
    Ca me parait valable, maitenant tu dois aussi prévoir l'extraction sur base de ce test positif mais pour x lignes en dessous et en extraire les caractères nécessaires.
    A+
    N'oubliez pas le si votre problème est solutionné.

  17. #17
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 43
    Points : 22
    Points
    22
    Par défaut
    Bon j'ai essayer d'avancer sur le code (qui doit être termine en fin d'après midi en toute logique ! )

    J'ai commence a traiter les formules de recuperation de caractere mais j'ai des sans doute fait pas mal d'erreur...

    Et il me manque encore quelques formules pour passer un certains nombre de ligne par exemple...

    Ces manques sont les '--> et les ?

    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
    55
    56
    57
    58
    59
    60
    61
    62
    63
    Sub ImportNewTxt()
     
    Open ("D:\Projet EXCEL_VB_TXT\Test\text.wri") For Input As #1
    'ouverture du fichier en lecture
     
    While Not EOF(1)
    'demarrage de la boucle pour lecture du fichier
     
        lign$ = ""
        'initialisation d une variable à ""
     
        Line Input #1, lign$
        'lire une ligne du fichier et passage à la ligne suivante (et affactation dans une variable chaine)
     
        If InStr(1, lign$, "Message-Date :") <> 0 Then
        'test sur la date
        Mid$(lign$, 24, 8) = datemvt
        'extraction de la date
            Range(?).Select
            ActiveCell.Offset(?, ?).Value = Range(datemvt).Value
            '--> formule pour importer datemvt dans le tableau
        End If
     
        If InStr(1, lign$, "Customer Article No") <> 0 Then
        'test POSITIF sur la presence de la chaine de caractère recherchee dans la ligne du fichier lu
        Mid$(lign$, 32, 10) = prodnb
        'extraction du produit
     
        '--> formule la suite se fera donc dans la colonne X correspondant au produit
     
            If InStr(1, lign$, "Movement direction") <> 0 Then
            'test sur le mouvement
     
                 '--> formule sauter 2 lignes et verifier les 3 premiers caracteres
     
                     '--> formule si les 3 premiers caracteres sont Ret les quantites seront en sortie
                     '--> formule sauter 4 lignes
     
            Mid$(lign$, 10, 9) = prodin
            'extraction quantite a placer en sortie
     
                     '--> formule si les 3 premiers caracteres sont Rec les quantites seront en entree
                     '--> formule sauter 4 lignes
     
            Mid$(lign$, 10, 9) = prodout
            'extraction quantite en entree
     
                     If Value <> prodin And prodout Then
                     '--> formule si les 3 premiers caracteres sont differents de prodin ou prodout fin boucle
                     '--> sinon sauter 4 lignes
                     Mid$(lign$, 90, 5) = Refda
                     'extraction reference
                        '--> formule pour importer Refda dans le tableau
     
        End If
     
    Wend
    'fin boucle
     
    Close #1
    'fermeture du fichier
     
    End Sub

  18. #18
    Membre émérite Avatar de Fvandermeulen
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    1 869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 869
    Points : 2 662
    Points
    2 662
    Par défaut
    Salut,
    Tu n'as pas eu de réponse car c'est un post en cours, beaucoup ne regarde que les nouveaux, c'est pour ça que je t'avais dis de créer un nouveau post si tu avancais sur le code...

    Sans quoi j'ai regardé ce que tu as fait, il y a quelques erreurs de syntaxe, pas de dimensionnement des variables, oubli des EndIf et surtout l'affectation des valeurs aux variables sont inversées, exemple, il faut écrire
    et pas
    De plus on a un souci de format, quand tu ouvre le fichier text, la date s'affiche jj.mm.aa mais si tu lis la ligne extraite par VBA on a 0:00:0010.
    Donc Mid ne suffira pas...

    Il semble donc que mon idée de passer par une feuille temporaire soit plus facile. Je reprend mon début de code et l'extraction de la 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
    Sub ImportTxtNew()
    Dim ligne As String, strFullName As String
    Dim i As Long
    Dim datemvt As Date
     
        Worksheets.Add 'Ajoute une feuille
    Open ("D:\Projet EXCEL_VB_TXT\Test\text.wri") For Input As #1
     
     
        Do While Not EOF(1) 'Tant que non vide
                Do While (Not EOF(1)) And (i < 65500) 'A faire jusqu'à la ligne 65500
                    Input #1, ligne 'Récupère la ligne du fichier Text
                    If ligne <> "" And Left(ligne, 1) <> "." And Left(ligne, 1) <> "-" Then 'Si vide ou commencant par . ou - alors pas "copié"
                        i = i + 1 'Incrémentation du compteur
                        Cells(i, 1).Value = ligne 'Place la ligne du fichier text dans la 1ère colonne
                    End If
                    Loop
            If i < 65500 Or EOF(1) Then Exit Do 'Après le traitement des 65500 ligne ajout d'une autre feuille pour la suite
                i = 0 'Remet le compteur à zéro
                Worksheets.Add 'ajoute une feuille, qui devient la feuille "active"
        Loop
        Close #1 'Ferme l'instance Text
     
    datemvt = DateSerial(Mid(Cells(2, 1), 26, 2), Mid(Cells(2, 1), 23, 2), Mid(Cells(2, 1), 20, 2))
     
    End Sub
    Reste à faire le même pour les autres éléments, moi j'ai pas le temps maintenant réunion oblige...

    Une fois que tous les éléments sont récupérer on s'attachera à les mettre dans le tableau final, mais une chôse à la fois...
    Mais en tout cas pose toi déjà la question de savoir si les éléments à récupérer ont toujours le même format, je pense par exemple à la date, si c'était le 1er janvier, serait-ce évrit 01/01/2010 ou 1/01/2010 ?
    C'est important dans le sens ou on utilise 'Mid'

    A+
    N'oubliez pas le si votre problème est solutionné.

  19. #19
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 43
    Points : 22
    Points
    22
    Par défaut
    Citation Envoyé par Fvandermeulen Voir le message
    De plus on a un souci de format, quand tu ouvre le fichier text, la date s'affiche jj.mm.aa mais si tu lis la ligne extraite par VBA on a 0:00:0010.
    Donc Mid ne suffira pas...

    Mais en tout cas pose toi déjà la question de savoir si les éléments à récupérer ont toujours le même format, je pense par exemple à la date, si c'était le 1er janvier, serait-ce évrit 01/01/2010 ou 1/01/2010 ?
    C'est important dans le sens ou on utilise 'Mid'

    A+
    Le format sera toujours le même... 01/10/2010 pas de souci la dessus.

    Je viens de resoudre le probleme que j'avais avec le format de la date :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        datemvt$ = Mid$(lign$, 25, 8)
        'extraction de la date
        date_new_format = Mid$(datemvt$, 1, 2) & "/" & Mid$(datemvt$, 4, 2) & "/20" & Mid$(datemvt$, 7, 2)
        date_new_format_date = CDate(date_new_format)
        'changement du format d'import de la date
    Me permettant de retranscrire une date 18.01.10 en 18/01/2010.

    Maintenant je dois me focaliser sur "comment importer les valeurs extraites au bon endroit dans mon tableau Excel"...

    J'ai ouvert un nouveau post pour ne pas trop surcharger celui la...

    Merci encore pour ton aide sur ce sujet Fvandermeulen je te laisse regarder le nouveau sujet pour le souci d'importation !

  20. #20
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 43
    Points : 22
    Points
    22
    Par défaut
    Voila le code avance, il ne me reste plus qu'a gerer l'importation de mes variables extraites dans le fichier .xls

    Encore un peu de patience et j'aurais realise mon premier code VB !

    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
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    Sub ImportNewTxt()
    Dim datemvt As String
    Dim prodnb As String
    Close #1
    Open ("D:\Projet EXCEL_VB_TXT\Test\text.wri") For Input As #1 '-------------------------------------------------> ouverture du fichier en lecture
    While Not EOF(1) '----------------------------------------------------------------------------------------------> demarrage de la boucle pour lecture du fichier
        lign$ = "" '------------------------------------------------------------------------------------------------> initialisation d une variable à ""
        Line Input #1, lign$ '--------------------------------------------------------------------------------------> lire une ligne du fichier et passage à la ligne suivante (et affactation dans une variable chaine)
            If InStr(1, lign$, "Message-Date :") <> 0 Then '--------------------------------------------------------> test sur la date
                datemvt$ = Mid$(lign$, 25, 8) '---------------------------------------------------------------------> extraction de la date
                MsgBox (Mid$(lign$, 25, 8))
                date_new_format = Mid$(datemvt$, 1, 2) & "/" & Mid$(datemvt$, 4, 2) & "/20" & Mid$(datemvt$, 7, 2) '> changement du format d'import de la date
                date_new_format_date = CDate(date_new_format)
                Columns("B:B").Select '-----------------------------------------------------------------------------> formule pour selectionner la bonne ligne dans la colonne date en fonction de la date du fichier .txt
                With Selection.Find(date_new_format_date).Activate
                End With
                ad_date = ActiveCell.Address
                MsgBox (ad_date)
            End If
            If InStr(1, lign$, "Customer Article No") <> 0 Then '---------------------------------------------------> test POSITIF sur la presence de la chaine de caractère recherchee dans la ligne du fichier lu
                prodnb$ = Mid$(lign$, 32, 10) '---------------------------------------------------------------------> extraction du produit
                MsgBox (Mid$(lign$, 32, 10))
                Rows("1:1").Select '--------------------------------------------------------------------------------> formule pour selectionner la bonne ligne dans la colonne date en fonction de la date du fichier .txt
                With Selection.Find(Mid$(lign$, 33, 10)).Activate
                End With
                ad_prod = ActiveCell.Address
                MsgBox (ad_prod)
            End If
            If InStr(1, lign$, "Movement direction") <> 0 Then '----------------------------------------------------> test sur le mouvement
                lign$ = lign$ & vbCrLf '----------------------------------------------------------------------------> formule sauter 2 lignes
                Line Input #1, lign$
                lign$ = lign$ & vbCrLf
                Line Input #1, lign$
                prodmvt$ = Mid$(lign$, 11, 3) '---------------------------------------------------------------------> extraction du mouvement
                MsgBox (Mid$(lign$, 11, 3))
                If prodmvt$ <> "Rec" And prodmvt$ <> "Bal" Then '---------------------------------------------------> verifier les 3 premiers caracteres
                    lign$ = lign$ & vbCrLf '------------------------------------------------------------------------> formule sauter 4 lignes
                    Line Input #1, lign$
                    lign$ = lign$ & vbCrLf
                    Line Input #1, lign$
                    lign$ = lign$ & vbCrLf
                    Line Input #1, lign$
                    lign$ = lign$ & vbCrLf
                    Line Input #1, lign$
                    ret$ = Mid$(lign$, 11, 9) '---------------------------------------------------------------------> extraction sortie
                    MsgBox (Mid$(lign$, 11, 9))
                    '---> formule pour importer la quantite en sortie
                    lign$ = lign$ & vbCrLf '------------------------------------------------------------------------> formule sauter 4 lignes
                    Line Input #1, lign$
                    lign$ = lign$ & vbCrLf
                    Line Input #1, lign$
                    lign$ = lign$ & vbCrLf
                    Line Input #1, lign$
                    lign$ = lign$ & vbCrLf
                    Line Input #1, lign$
                    ref_d_a$ = Mid$(lign$, 91, 10) '----------------------------------------------------------------> extraction reference
                    MsgBox (Mid$(lign$, 91, 10))
                    '---> formule pour importer Ref_d_a dans le tableau
                Else
                If prodmvt$ <> "Ret" And prodmvt$ <> "Bal" Then '---------------------------------------------------> verifier les 3 premiers caracteres
                    lign$ = lign$ & vbCrLf '------------------------------------------------------------------------> formule sauter 4 lignes
                    Line Input #1, lign$
                    lign$ = lign$ & vbCrLf
                    Line Input #1, lign$
                    lign$ = lign$ & vbCrLf
                    Line Input #1, lign$
                    lign$ = lign$ & vbCrLf
                    Line Input #1, lign$
                    rec$ = Mid$(lign$, 11, 9) '---------------------------------------------------------------------> extraction entree
                    MsgBox (Mid$(lign$, 11, 9))
                    '---> formule pour importer la quantite en entree
                    lign$ = lign$ & vbCrLf '------------------------------------------------------------------------> formule sauter 4 lignes
                    Line Input #1, lign$
                    lign$ = lign$ & vbCrLf
                    Line Input #1, lign$
                    lign$ = lign$ & vbCrLf
                    Line Input #1, lign$
                    lign$ = lign$ & vbCrLf
                    Line Input #1, lign$
                    ref_d_a$ = Mid$(lign$, 91, 10) '-----------------------------------------------------------------> extraction reference
                    MsgBox (Mid$(lign$, 91, 10))
                    '---> formule pour importer Ref_d_a dans le tableau
                End If
            End If
         End If
    Wend '-----------------------------------------------------------------------------------------------------------> fin boucle
    Close #1 '-------------------------------------------------------------------------------------------------------> fermeture du fichier
    End Sub

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [XL-2007] Importation valeurs .txt vers .xls
    Par Loupire dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 25/01/2010, 17h00
  2. Importer données txt vers xls
    Par kikim78 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 13/12/2009, 13h22
  3. extraction txt vers xls
    Par doudou1 dans le forum VBScript
    Réponses: 10
    Dernier message: 10/07/2006, 14h37
  4. [VBA-E].txt vers .xls
    Par Empty_body dans le forum Macros et VBA Excel
    Réponses: 14
    Dernier message: 08/02/2006, 14h46

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