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 :

Boucle FOR, alimentation TAB


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 43
    Par défaut Boucle FOR, alimentation TAB
    Bonjour,

    Novice en VB je me lance dans une petite programmation consistant à récupérer des données issues d'un fichier .txt pour les envoyer dans un fichier .xls un tableau virtuel intermèdiaire stockant certaines données.

    Je dois récupérer 3 chaînes de caractère sur une ligne de mon fichier .txt et chacunes de ces valeurs dans un tableau (virtuel) à 3 colonnes.

    Cette ligne peut être répétée dans le fichier .txt donc je dois incrémenter mon tableau (virtuel) selon le nombre de lignes.

    Exemple avec une ligne :

    REF.FABRIQUANT EUROMASTER LIBELLE QTE TOTALE
    ********************************************************************************
    0352119 8161967 ENV. 205/55R16 CONT C.PREM.C.SSR*TL91V 4
    Exemple avec plusieurs lignes :

    REF.FABRIQUANT EUROMASTER LIBELLE QTE TOTALE
    ********************************************************************************
    0522008 8195461 ENV. 315/70R22.5 CONT HDR2 TL 154/150L 4
    0512011 8194431 ENV. 315/80R22.5 CONT HSR2 TL 154/150M 1
    0542001 8180745 ENV. 385/65R22.5 CONT HTR2 TL 160K 1
    NB : Les valeurs que je dois récupérer sont en couleur.

    Pour le moment le squelette de mon code ressemble à ce qui suit :

    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
    Sub Import_Euromaster()
    Dim numcmd As String
    Dim ref As String
    Dim qte As String
    Dim cust_mat As String
    Dim i As Integer
    Dim mon_tableau() As String
     
    Close #1
     
        Application.ScreenUpdating = True
        Workbooks.OpenText Filename:="D:\8 - Projet VB_CMD\test.doc", Origin:=437, _
        StartRow:=1, DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, _
        ConsecutiveDelimiter:=False, Tab:=True, Semicolon:=False, Comma:=False _
        , Space:=False, Other:=False, FieldInfo:=Array(1, 2), _
        TrailingMinusNumbers:=True
        Columns("A:A").EntireColumn.AutoFit
        ActiveWorkbook.SaveAs Filename:="D:\8 - Projet VB_CMD\test.txt", FileFormat:= _
        xlText, CreateBackup:=False
        ActiveWorkbook.Save
        ActiveWindow.Close
        Range("A2").Select
     
    Open ("D:\8 - Projet VB_CMD\test.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)
     
        toto = 0
     
            While InStr(1, lign$, "NUMERO DE COMMANDE A RAPPELER :") <> 0 '---------------> test sur le numero de commande
                numcmd$ = Mid$(lign$, 34, 7) '----------------------------------------------> extraction du numero de commande
     
                If InStr(1, lign$, "REF.FABRIQUANT") <> 0 Then '----------------------------> test sur la ref,cust mat et qte
                    lign$ = lign$ & vbCrLf '------------------------------------------------> formule sauter 2 lignes
                    Line Input #1, lign$
                    lign$ = lign$ & vbCrLf
                    Line Input #1, lign$
                    ref$ = Mid$(lign$, 1, 7) '----------------------------------------------> extraction de la ref
                    ref_new_format = Mid$(ref$, 1, 7) & "0000"
                    qte$ = Mid$(lign$, 76, 1) '---------------------------------------------> extraction de la qte
                    cust_mat$ = Mid$(lign$, 20, 7) '----------------------------------------> extraction du cust mat
     
                toto = toto + 1
     
                End If
     
                For i = 1 To toto
     
                ReDim Preserve mon_tableau(i)
                mon_tableau(1) = numcmd$
                ReDim mon_tableau(2)
                mon_tableau(2) = ref$
                ReDim mon_tableau(3)
                mon_tableau(3) = qte$
                ReDim mon_tableau(4)
                mon_tableau(4) = cust_mat$
     
                Next i
     
            Wend
     
    Wend '--------------------------------------------------------------------------------------> fin boucle
    Close #1 '-----------------------------------------------------------------------------> fermeture du fichier
    End Sub
    Je bloque sur la mise en place de la boucle FOR (For i = 1 to n).

  2. #2
    Membre Expert 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 : 49
    Localisation : Belgique

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 869
    Par défaut
    Salut,
    Pas évident de plonger dans un code comme celui-ci...mais voici mes remarques:
    1° L'incrémentation de ton Tablo doit se faire dans la boucle qui "lit" les lignes de ton fichier Text.
    2° tu dois ajouter des "colonnes" à ton Tablo (bien que l'utilisation d'un tablo ne soit pas obligatoire mais je l'ai gardé pour l'exemple)

    Voici un petit exemple qui utlise l'exploreur pour sélectionner le fichier, car, et ça c'est une autre remarque, pourquoi sauver le Word en txt, la méthode fonctionne aussi sur Word (change les .txt par .doc pour tester, je l'ai pas fait):

    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
    Dim ligne As String, strFullName, i As Long
    Dim tablo() As String
     
        strFullName = Application.GetOpenFilename("Fichiers textes (*.txt),*.txt", , _
        "Sélectionnez un fichier :")
     
        Open strFullName For Input As #1
     
        Do While Not EOF(1)
           i = i + 1
           Input #1, ligne
           ReDim tablo(i, 3)
     
                tablo(i, 1) = Left(ligne, 7) 'On peut se passer du Tablo en faisant Cells(i, 1).Value=Left(ligne, 7)
                tablo(i, 2) = Mid(ligne, 9, 7)
                tablo(i, 3) = Right(ligne, 1)
     
                Cells(i, 1).Value = tablo(i, 1)
                Cells(i, 2).Value = tablo(i, 2)
                Cells(i, 3).Value = tablo(i, 3)
        Loop
        Close #1
    A+

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 43
    Par défaut
    Je viens de modifier mon code en fonction de tes conseils :

    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
    Sub Import_Euromaster()
    Dim numcmd As String
    Dim ref As String
    Dim qte As String
    Dim cust_mat As String
    Dim i As Long
    Dim mon_tableau() As String
     
    Close #1
     
        Application.ScreenUpdating = True
        Workbooks.OpenText Filename:="D:\8 - Projet VB_CMD\test.doc", Origin:=437, _
        StartRow:=1, DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, _
        ConsecutiveDelimiter:=False, Tab:=True, Semicolon:=False, Comma:=False _
        , Space:=False, Other:=False, FieldInfo:=Array(1, 2), _
        TrailingMinusNumbers:=True
        Columns("A:A").EntireColumn.AutoFit
        ActiveWorkbook.SaveAs Filename:="D:\8 - Projet VB_CMD\test.txt", FileFormat:= _
        xlText, CreateBackup:=False
        ActiveWorkbook.Save
        ActiveWindow.Close
        Range("A2").Select
     
    Open ("D:\8 - Projet VB_CMD\test.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 à ""
        i = i + 1
        Line Input #1, lign$ '--------------------------------------------------------------> lire une ligne du fichier et passage à la ligne suivante (et affactation dans une variable chaine)
     
            While InStr(1, lign$, "NUMERO DE COMMANDE A RAPPELER :") <> 0 '---------------> test sur le numero de commande
            numcmd$ = Mid$(lign$, 34, 7) '----------------------------------------------> extraction du numero de commande
     
                    If InStr(1, lign$, "REF.FABRIQUANT") <> 0 Then '----------------------------> test sur la ref,cust mat et qte
                        lign$ = lign$ & vbCrLf '------------------------------------------------> formule sauter 2 lignes
                        Line Input #1, lign$
                        lign$ = lign$ & vbCrLf
                        Line Input #1, lign$
                        ref$ = Mid$(lign$, 1, 7) '----------------------------------------------> extraction de la ref
                        ref_new_format = Mid$(ref$, 1, 7) & "0000"
                        qte$ = Mid$(lign$, 76, 1) '---------------------------------------------> extraction de la qte
                        cust_mat$ = Mid$(lign$, 20, 7) '----------------------------------------> extraction du cust mat
                    End If
     
                    ReDim mon_tableau(i, 4)
     
                    mon_tableau(i, 1) = numcmd$ 'On peut se passer du Tablo en faisant Cells(i, 1).Value=Left(ligne, 7)
                    mon_tableau(i, 2) = ref$
                    mon_tableau(i, 3) = qte$
                    mon_tableau(i, 4) = cust_mat$
     
                    Cells(i, 1).Value = mon_tableau(i, 1)
                    Cells(i, 2).Value = mon_tableau(i, 2)
                    Cells(i, 3).Value = mon_tableau(i, 3)
                    Cells(i, 4).Value = mon_tableau(i, 4)
     
                    Loop
     
            Wend
    Wend
     
    Close #1 '-----------------------------------------------------------------------------> fermeture du fichier
    End Sub
    J'ai un petit message "Boucle sans Do".

  4. #4
    Membre Expert 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 : 49
    Localisation : Belgique

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 869
    Par défaut
    Pour commencer enlève le loop ou un wend (utilise bien l'indentation ça aide à déterminer les problèmes du genre) et dis nous ce qui ce passe...

    A+

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 43
    Par défaut
    Je viens d'enlever le loop, l'execution fonctionne sans message d'erreur, mais j'ai l'impression que ça boucle indéfiniment, je suis obligé d'utiliser le gestionnaire de tâche pour stopper le processus.

  6. #6
    Membre Expert 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 : 49
    Localisation : Belgique

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 869
    Par défaut
    Désolé, j'ai pas été attentif...

    Remplace les Wend par des Loop et adapte la ligne
    Par
    J'ai pas testé mais je suis quasiment certain...

Discussions similaires

  1. Boucle for dans un script cmd
    Par nicolas.ganache dans le forum Développement
    Réponses: 4
    Dernier message: 19/07/2004, 16h07
  2. Réponses: 3
    Dernier message: 06/07/2004, 10h21
  3. [Debutant] Batch et Boucle for
    Par ludovic.fernandez dans le forum Scripts/Batch
    Réponses: 8
    Dernier message: 06/05/2004, 19h21
  4. [Swing][boucles] for, do, if .....comment faire simple?
    Par chastel dans le forum AWT/Swing
    Réponses: 7
    Dernier message: 02/05/2004, 22h49
  5. [langage] boucle "for" modification du pas
    Par K-ZimiR dans le forum Langage
    Réponses: 4
    Dernier message: 29/04/2004, 11h54

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