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 :

Automatisation ouverture de fichiers d'un même répertoire et copie dans un autre fichier


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2019
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2019
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Automatisation ouverture de fichiers d'un même répertoire et copie dans un autre fichier
    Bonjour a tous,

    Je débute en langage VBA et je cherche à créer une macro me permettant d'ouvrir les fichiers Excel contenus dans un répertoire les uns après les autres et dans chacun de ces fichiers, à copier 3 colonnes spécifiques se trouvant toujours à la même position pour les coller dans un autre fichier Excel qui contiendra la synthèse de toutes ces colonnes.

    J'ai réussi à créer un programme me permettant de le faire pour un fichier, néanmoins, je cherche à réaliser une boucle qui ouvrirait les fichiers les uns après les autres et copierait les informations pour les coller sur la feuille de synthèse en décalant de trois colonnes à chaque fois (coller sur la plage A:C) pour le premier fichier, (D:F) pour le second etc...

    Voici le code que j'ai écrit et qui fonctionne pour un fichier:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub M1()
     
    Workbooks.Open "C:\Users\t2000107\Desktop\Bureau\Experiment data\20190712_002_xf16.2m_Z10mm\711017.csv"
    Workbooks("711017.csv").Activate
    Sheets("711017").Select
    Sheets("711017").Range("A52:C10014").Copy
    ActiveWorkbook.Close
    Workbooks.Open "C:\Users\t2000107\Desktop\Datas.xlsx"
    Workbooks("Datas.xlsx").Activate
    Sheets("Datas").Select
    Sheets("Datas").Range("A1").PasteSpecial xlPasteAll
     
    End Sub
    Pourriez-vous m'aider à le mettre sous forme de boucle pour faire de même pour les fichiers allant de 711017 a 711042 et collant les informations dans le fichier Datas?

    Je vous remercie par avance pour votre aide.

  2. #2
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 661
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 661
    Points : 5 785
    Points
    5 785
    Par défaut
    Bonjour,

    Penses a mettre ton code entre balise (bouton #) c'est bien plus lisible

    Lien vers un tuto sur les boucles: https://silkyroad.developpez.com/vba/boucles/#LIII

    pour les fichier allant de 711017 a 711042
    On va donc faire une boucle for de 711017 a 711042 en remplaçant dans ton code tout les 711017 par ta variable de boucle
    Pour insérer une variable dans du texte on utilise l'opérateur de concaténation &

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    dim i as long
    for i =711017 to 711042
      Workbooks.Open "C:\Users\t2000107\Desktop\Bureau\Experiment data\20190712_002_xf16.2m_Z10mm\" & i & ".csv"
      'reste de ton code
    next i
    (coller sur la plage A:C) pour le premier fichier, (D:F) pour le second etc...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets("Datas").Range("A1").PasteSpecial xlPasteAll
    Il vaut mieux utiliser l'écriture avec cells que range pour décaler ta colonne plus facilement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets("Datas").cells(1,1+3*(i-711017)).PasteSpecial xlPasteAll
    J'aimerais bien aller vivre en Théorie, car en Théorie tout se passe bien.

  3. #3
    Membre expert
    Avatar de Igloobel
    Homme Profil pro
    Développeur ERP - VBA et Formateur bureautique
    Inscrit en
    Septembre 2005
    Messages
    1 869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur ERP - VBA et Formateur bureautique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 869
    Points : 3 442
    Points
    3 442
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Perso j'utiliserai les FileDialogs

    Voici un exemple tiré de l'aide d'Excel (F1)

    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
    Sub UseFileDialogOpen()
     
        Dim lngCount As Long
     
        ' Open the file dialog
        With Application.FileDialog(msoFileDialogOpen)
            .AllowMultiSelect = True
            .Show
     
            ' Display paths of each file selected
            For lngCount = 1 To .SelectedItems.Count
                MsgBox .SelectedItems(lngCount)
            Next lngCount
     
        End With
     
    End Sub

    Je te conseille vraiment, même si tu débute, de d'interesser aux "FileDialogs" car c'est vraiment très pratique et très propre


    Pense au actionné par le bouton (#)
    Ils ne savaient pas que c'était impossible ... du coup ils l'ont fait (Mark Twain)

    n'oubliez pas de si les messages vous aide ou sont pertinents et de mettre quand cela est !

  4. #4
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2019
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2019
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Bonjour,

    Merci beaucoup pour votre aide, cela m a permis d aller au bout de mon petit programme VBA me permettant de calculer les moyennes des valeurs obtenues et de tracer un graph (a deux parametres) a partir de ces valeurs.

    Neanmoins, je souhaite maintenant modifier ce code de maniere a ce qu il puisse s adapter au nombre de fichiers presents dans un dossier sans avoir a remodifier le code a chaque fois en fonction du nombre de fichiers presents et des noms de ces derniers.

    Voici la forme de mon programme pour un dossier contenant 16 fichiers

    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
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    Sub M2()
     
    Workbooks.Add
     
    ActiveWorkbook.SaveAs Filename:="C:\Users\t2000107\Desktop\Datas2.xlsx"
     
    Workbooks.Open "C:\Users\t2000107\Desktop\Datas2.xlsx"
    Workbooks("Datas2.xlsx").Worksheets("Sheet1").Name = "Datas"
     
    Dim I As Long
     
    For I = 716001 To 716016
     
     Workbooks.Open "C:\Users\t2000107\Desktop\Bureau\Experiment data\20190716_001_xf16.2m_Z100mm\" & I & ".csv"
     
     Sheets("" & I&).Range("A52:C10014").Copy
     
     
      Workbooks("Datas2.xlsx").Activate
      Sheets("Datas").Select
     
      Sheets("Datas").Cells(1, 1 + 4 * (I - 716001)).PasteSpecial xlPasteAll
     
      Next I
     
    Workbooks("Datas2.xlsx").Save
     
    Dim Wbk As Workbook
     
      For Each Wbk In Workbooks
        If Wbk.Name <> ThisWorkbook.Name Then
          Wbk.Close
        End If
      Next Wbk
     
    Workbooks.Open "C:\Users\t2000107\Desktop\Datas2.xlsx"
     
    ActiveWorkbook.Sheets.Add After:=Worksheets(1)
     
     
    Workbooks("Datas2.xlsx").Worksheets("Sheet1").Name = "Time&AV"
     
    Sheets("Time&AV").Range("A1") = "Time (s)"
    Sheets("Time&AV").Range("B1") = "Average Velocity (m/s)"
     
     
    Sheets("Time&AV").Range("A2") = 360
    Sheets("Time&AV").Range("A3") = 380
    Sheets("Time&AV").Range("A4") = 400
    Sheets("Time&AV").Range("A5") = 420
    Sheets("Time&AV").Range("A6") = 440
    Sheets("Time&AV").Range("A7") = 460
    Sheets("Time&AV").Range("A8") = 480
    Sheets("Time&AV").Range("A9") = 500
    Sheets("Time&AV").Range("A10") = 520
    Sheets("Time&AV").Range("A11") = 540
    Sheets("Time&AV").Range("A12") = 560
    Sheets("Time&AV").Range("A13") = 580
    Sheets("Time&AV").Range("A14") = 600
    Sheets("Time&AV").Range("A15") = 620
    Sheets("Time&AV").Range("A16") = 640
    Sheets("Time&AV").Range("A17") = 660
     
    Sheets("Datas").Select
     
    Dim A, B, C, D, E, F, G, H, HH, J, K, L, M, N, O, P As Single
     
    Dim ws As Worksheet
     
    Set ws = Sheets("Datas")
     
    A = Application.WorksheetFunction.Average(ws.Range("C2:C9963"))
    Worksheets("Time&AV").Range("B2").Value = A
     
    B = Application.WorksheetFunction.Average(ws.Range("G2:G9963"))
    Worksheets("Time&AV").Range("B3").Value = B
     
    C = Application.WorksheetFunction.Average(ws.Range("K2:K9963"))
    Worksheets("Time&AV").Range("B4").Value = C
     
    D = Application.WorksheetFunction.Average(ws.Range("O2:O9963"))
    Worksheets("Time&AV").Range("B5").Value = D
     
    E = Application.WorksheetFunction.Average(ws.Range("S2:S9963"))
    Worksheets("Time&AV").Range("B6").Value = E
     
    F = Application.WorksheetFunction.Average(ws.Range("W2:W9963"))
    Worksheets("Time&AV").Range("B7").Value = F
     
    G = Application.WorksheetFunction.Average(ws.Range("AA2:AA9963"))
    Worksheets("Time&AV").Range("B8").Value = G
     
    H = Application.WorksheetFunction.Average(ws.Range("AE2:AE9963"))
    Worksheets("Time&AV").Range("B9").Value = H
     
    HH = Application.WorksheetFunction.Average(ws.Range("AI2:AI9963"))
    Worksheets("Time&AV").Range("B10").Value = HH
     
    J = Application.WorksheetFunction.Average(ws.Range("AM2:AM9963"))
    Worksheets("Time&AV").Range("B11").Value = J
     
    K = Application.WorksheetFunction.Average(ws.Range("AQ2:AQ9963"))
    Worksheets("Time&AV").Range("B12").Value = K
     
    L = Application.WorksheetFunction.Average(ws.Range("AU2:AU9963"))
    Worksheets("Time&AV").Range("B13").Value = L
     
    M = Application.WorksheetFunction.Average(ws.Range("AY2:AY9963"))
    Worksheets("Time&AV").Range("B14").Value = M
     
    N = Application.WorksheetFunction.Average(ws.Range("BC2:BC9963"))
    Worksheets("Time&AV").Range("B15").Value = N
     
    O = Application.WorksheetFunction.Average(ws.Range("BG2:BG9963"))
    Worksheets("Time&AV").Range("B16").Value = O
     
    P = Application.WorksheetFunction.Average(ws.Range("BK2:BK9963"))
    Worksheets("Time&AV").Range("B17").Value = P
     
    Sheets("Time&AV").Select
        ActiveSheet.Shapes.AddChart2(240, xlXYScatter).Select
     
        ActiveChart.SetElement (msoElementPrimaryCategoryAxisTitleAdjacentToAxis)
        ActiveChart.Axes(xlCategory, xlPrimary).AxisTitle.Text = "Time(s)"
        ActiveChart.Axes(xlCategory).MinimumScale = 360
     
         With ActiveChart
            .HasTitle = True
            .ChartTitle.Characters.Text = "16/07 Average Velocity (m/s)"
        End With
     
     
     
     
     
     
     
     
     
    End Sub
    L ecriture est tres longue et sans doute tres basique, je m en excuse.
    Auriez vous une idee pour adapter ce code sans avoir a le remodifier a chaque fois si les noms des fichiers ainsi que leur nombre changent?

    En vous remerciant par avance.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 21/06/2012, 16h10
  2. Ouverture d'un JPanel à partir d'un bouton présent dans un autre JPanel
    Par Requiem11 dans le forum Agents de placement/Fenêtres
    Réponses: 1
    Dernier message: 05/01/2010, 19h09
  3. Automatiser ouverture fichier Excel
    Par jerem7w dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 19/02/2009, 18h10
  4. Réponses: 5
    Dernier message: 30/04/2007, 18h03
  5. Copie de fichiers dans un meme repertoire
    Par pezihale_84 dans le forum Access
    Réponses: 4
    Dernier message: 30/06/2006, 10h24

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