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 :

Problème de boucle et mise en forme durant importation


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2013
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 86
    Par défaut Problème de boucle et mise en forme durant importation
    Bonjour, je suis nouveau sur le forum, et je me tire les cheveux depuis 15/16h à voyager sur des forums pour résoudre ma mission. J'avance, à grand pas pour moi mais à petit pas pour des experts comme vous je pense . Voilà le souci: Je dois récupérer des fichiers CSV (de plusieurs colonnes fixes, mais plusieurs lignes aléatoires entre 10 et 370) dans un dossier fixe et les ramener sur une feuille excel. Ca ok. Mais premier problème, j'aimerai qu'ils s'accumulent en changeant de colonne et non en s'accumulant en ligne comme actuellement. Second problème, dans la boucle j'ai une fonction qui traite la colonne qui m'interesse de chaque csv en rendant les cellules (qui se transforment à la base en fichier texte dans excel) en format nombre. Ca marche, mais que sur le premier CSV importé, alors que la fonction est dans la boucle. voici le code:

    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
    Sub csvImport4()
    Dim Wbcsv As Workbook
    Dim Fichier As String, Chemin As String
    Dim LastLig As Long, NewLig As Long
    Dim c As Range
    Dim Tablo
    Const Sep As String = ";"
     
    Application.ScreenUpdating = False                                   'Inhibe la mise à jour affichage
    With Application.FileDialog(msoFileDialogFolderPicker)
        .Show
        If .SelectedItems.Count = 1 Then Chemin = .SelectedItems(1)
    End With
     
    If Chemin <> "" Then
        Chemin = Chemin & "\"
        Fichier = Dir(Chemin & "*.csv")                                  'Le premier fichier csv trouvé
        Do While Fichier <> ""                                           'on fait une boucle jusqu'à ce qu'on ne trouve plus de fichier csv
            Name Chemin & Fichier As Replace(Chemin & Fichier, ".csv", ".txt")
            Fichier = Replace(Fichier, ".csv", ".txt")
            Set Wbcsv = Workbooks.Open(Chemin & Fichier)                 'On ouvre le fichier csv qu'on affecte à la variable Wbcsv
            With Wbcsv.Sheets(1)
                LastLig = .Cells(.Rows.Count, 1).End(xlUp).Row           'LastLig est la dernière ligne remplie du fichier csv ouvert
            End With
            With ThisWorkbook.Worksheets("fichier")
                For Each c In Wbcsv.Sheets(1).Range("A2:A" & LastLig)    'Pour chaque cellule de A2:Axxx
                    NewLig = .Cells(.Rows.Count, 1).End(xlUp).Row + 1    'la première cellule vide de la colonne 1 de Feuil1 de ce classeur
                    Tablo = Split(c.Value, Sep)                          'On sépare les données par rapport au séparateur (ici le point virgule)
                    .Range(.Cells(NewLig, 1), .Cells(NewLig, UBound(Tablo) + 1)).Value = Tablo    'on copie
                Next c
            End With
            Wbcsv.Close                                                  'On ferme le fichier csv
            Set Wbcsv = Nothing
            Name Chemin & Fichier As Replace(Chemin & Fichier, ".txt", ".csv")
            Dim cellule As Range
     
      For Each cellule In Range("D11:D370")
     
        cellule.Value = CDbl(cellule.Value)
     
      Next
            Fichier = Dir()                                              'on cherche le fichir csv suivant
        Loop
    End If
    End Sub

  2. #2
    Membre émérite Avatar de issoram
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2009
    Messages
    665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 665
    Par défaut
    Bonjour,

    Essaie ceci (je n'ai pas testé)
    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
    Sub csvImport4()
     
        Const NB_COL_CSV As Integer = 20    '** définir ici le nombre (fixe) de colonnes de tes csv
        Dim j As Integer                    '** compteur colonne
     
        Dim Wbcsv As Workbook
        Dim Fichier As String, Chemin As String
        Dim LastLig As Long, NewLig As Long
        Dim c As Range
        Dim Tablo
        Const Sep As String = ";"
     
        Application.ScreenUpdating = False                                   'Inhibe la mise à jour affichage
        With Application.FileDialog(msoFileDialogFolderPicker)
            .Show
            If .SelectedItems.Count = 1 Then Chemin = .SelectedItems(1)
        End With
     
        If Chemin <> "" Then
            Chemin = Chemin & "\"
            Fichier = Dir(Chemin & "*.csv")                                  'Le premier fichier csv trouvé
            j = 1
            Do While Fichier <> ""                                           'on fait une boucle jusqu'à ce qu'on ne trouve plus de fichier csv
                Name Chemin & Fichier As Replace(Chemin & Fichier, ".csv", ".txt")
                Fichier = Replace(Fichier, ".csv", ".txt")
                Set Wbcsv = Workbooks.Open(Chemin & Fichier)                 'On ouvre le fichier csv qu'on affecte à la variable Wbcsv
                With Wbcsv.Sheets(1)
                    LastLig = .Cells(.Rows.Count, 1).End(xlUp).Row           'LastLig est la dernière ligne remplie du fichier csv ouvert
                End With
                With ThisWorkbook.Worksheets("fichier")
                    For Each c In Wbcsv.Sheets(1).Range("A2:A" & LastLig)    'Pour chaque cellule de A2:Axxx
                        NewLig = .Cells(.Rows.Count, j).End(xlUp).Row + 1    '** la première cellule vide de la colonne j de Feuil1 de ce classeur
                        Tablo = Split(c.Value, Sep)                          'On sépare les données par rapport au séparateur (ici le point virgule)
                        .Range(.Cells(NewLig, j), .Cells(NewLig, j + UBound(Tablo))).Value = Tablo  'on copie
                        .Cells(NewLig, j + 3).Value = CDbl(.Cells(NewLig, j + 3).Value)    '** Pour éviter ta boucle de fin sur la colonne D
                    Next c
                End With
     
                Wbcsv.Close                                                  'On ferme le fichier csv
                Set Wbcsv = Nothing
                j = j + NB_COL_CSV                                           '** Incrément compteur colonne
     
                Name Chemin & Fichier As Replace(Chemin & Fichier, ".txt", ".csv")
                Fichier = Dir()                                              'on cherche le fichir csv suivant
            Loop
        End If
    End Sub
    Par contre il y'a des optimisations possibles au niveau du code. Par exemple tu charges chaque fichier ligne à ligne... Pour moi il faudrait charger chaque fichier d'un bloc. Mais bon après tout dépend de tes traitements...

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2013
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 86
    Par défaut
    Merci. Je pense que le fait d'ouvrir par bloc pourrait être intéressant, mais je sais pas faire.
    Ton code me donne une erreur à ce niveau:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    For Each c In Wbcsv.Sheets(1).Range("A2:A" & LastLig)    'Pour chaque cellule de A2:Axxx
                        NewLig = .Cells(.Rows.Count, j).End(xlUp).Row + 1    '** la première cellule vide de la colonne j de Feuil1 de ce classeur
                        Tablo = Split(c.Value, Sep)                          'On sépare les données par rapport au séparateur (ici le point virgule)
                        .Range(.Cells(NewLig, j), .Cells(NewLig, j + UBound(Tablo))).Value = Tablo  'on copie
                        .Cells(NewLig, j + 3).Value = CDbl(cellule.Value)    '** Pour éviter ta boucle de fin sur la colonne D
                    Next c
    En supprimant ce qui est en rouge, j'arrive à avoir mes fichiers en colonne, donc déjà un grand merci pour ca Juste que ma colonne D qui m’intéresse reste en format texte du coup.

  4. #4
    Membre émérite Avatar de issoram
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2009
    Messages
    665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 665
    Par défaut
    Oui effectivement une copie malheureuse.....
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Cells(NewLig, j + 3).Value = CDbl(.Cells(NewLig, j + 3).Value)
    Pour ce qui est du chargement de fichier texte, il y 'a de multiples méthodes. Tu peux par exemple lire ceci et t'en inspirer ou regarder du côté de la méthode QueryTables (dans l'aide Excel)

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2013
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 86
    Par défaut
    Toujours une erreur au debogage au même endroit, malgré ta correction

    Oui je vais lire ton lien aussi merci.

  6. #6
    Membre émérite Avatar de issoram
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2009
    Messages
    665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 665
    Par défaut
    Quel est le message d'erreur?
    Qu'affiche (dans la fenêtre d’exécution):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Debug.print NewLig, j+3, .Cells(NewLig, j + 3).Value
    .Cells(NewLig, j + 3).Value = CDbl(.Cells(NewLig, j + 3).Value)
    ?

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

Discussions similaires

  1. [XL-2007] Problème sur ajout de mise en forme conditionnelle
    Par excellium dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 06/06/2011, 16h16
  2. [FTP] Boucles pour mise en forme horizontale
    Par Idleman dans le forum Langage
    Réponses: 4
    Dernier message: 10/12/2007, 11h50
  3. boucle avec mise en forme plante
    Par sash6 dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 22/11/2007, 13h42
  4. [FPDF] Problème de balise de mise en forme
    Par legrec dans le forum Bibliothèques et frameworks
    Réponses: 7
    Dernier message: 25/07/2007, 14h57

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