Exécuter même macro excel sur plusieurs fichiers excel

j'ai un dossier où je reçois plus de 1000 fichiers excel sur des bases quotidiennes ils sont tous le même format et la même structure. Ce que je veux faire est d'exécuter une macro sur tous les 100+ fichiers sur des bases quotidiennes ?

il y a moyen d'automatiser cela ? Donc je peux continuer à exécuter cette même macro Sur 1000+ fichiers tous les jours.

13
demandé sur Siddharth Rout 2013-02-08 09:24:15

6 réponses

en supposant que vous mettiez vos fichiers dans le répertoire" Files " relatif à votre classeur Maître, votre code pourrait ressembler à ceci:

Sub ProcessFiles()
    Dim Filename, Pathname As String
    Dim wb As Workbook

    Pathname = ActiveWorkbook.Path & "\Files\"
    Filename = Dir(Pathname & "*.xls")
    Do While Filename <> ""
        Set wb = Workbooks.Open(Pathname & Filename)
        DoWork wb
        wb.Close SaveChanges:=True
        Filename = Dir()
    Loop
End Sub

Sub DoWork(wb As Workbook)
    With wb
        'Do your work here
        .Worksheets(1).Range("A1").Value = "Hello World!"
    End With
End Sub

Dans cet exemple,DoWork() est votre macro que vous appliquez à tous de vos fichiers. Assurez-vous que vous faites tout votre traitement dans votre macro est toujours dans le contexte de l' wb (cahier ouvert actuellement).

Disclaimer: Toutes les possibilités de manipulation des erreurs ont été négligées par souci de brièveté.

15
répondu peterm 2015-03-17 01:54:34

une partie de la question pourrait être Comment puis-je exécuter ceci Sur 1000 fichiers?... Dois-je ajouter cette macro à tous les 1000 classeurs?

une façon de faire ceci est d'ajouter votre macro au fichier PERSONAL.XLSB (parfois, l'extension peut être différent). Ce fichier sera chargé en arrière-plan chaque fois que vous démarrez Excel et rend votre macro disponible à tout moment.

D'abord le personnel.Le fichier XLSB ne sera pas là. Pour créer automatiquement ce fichier, il suffit de commencer enregistrer une macro" factice "(avec le bouton" Enregistrer "en bas à gauche d'une feuille de calcul) et sélectionner" Personal Macro Workbook " pour la stocker.

après avoir enregistré votre macro, vous pouvez ouvrir L'éditeur VBA avec Alt+ F11 et vous verrez le personnel.Fichier XLSB avec la macro" dummy " enregistrée.

j'utilise ce fichier pour stocker des charges de macro générales qui sont toujours disponibles, indépendamment de laquelle .xlsx fichier que j'ai ouvert. J'ai ajouté ces macro à mon propre menu.

un inconvénient de ce fichier macro commun est que si vous lancez plus d'une instance D'Excel, vous obtiendrez un message d'erreur que le personnel.Le fichier XLSB est déjà utilisé par Excel instance Nr.1. Ce n'est pas un problème tant que vous n'ajoutez pas de nouvelles macros en ce moment.

2
répondu Robert Ilbrink 2013-02-08 11:04:56

je vous Remercie beaucoup pour ce

Sub ProcessFiles()
    Dim Filename, Pathname As String
    Dim wb As Workbook

    Pathname = ActiveWorkbook.Path & "C:\Users\jkatanan\Desktop170206Glidepath\V37\"
    Filename = Dir(Pathname & "*.xls")
    Do While Filename <> ""
        Set wb = Workbooks.Open(Pathname & Filename)
        BSAQmacro wb

        wb.Close SaveChanges:=True
        Filename = Dir()
    Loop
End Sub
Sub DoWork(wb As Workbook)
    With wb
        'Do your work here
        .Worksheets(1).Range("A1").Value = "Hello World!"
    End With
End Sub
2
répondu Jazia Katanani 2017-02-08 16:16:42
Sub ProcessFiles()
    Dim Filename, Pathname As String
    Dim wb As Workbook

    Pathname = ActiveWorkbook.Path & "\C:\Users098323\Desktop\EXCL\"
    Filename = Dir(Pathname & "*.xlsx")
    Do While Filename <> ""
        Set wb = Workbooks.Open(Pathname & Filename)
        DoWork wb
        wb.Close SaveChanges:=True
        Filename = Dir()
    Loop
End Sub

Sub DoWork(wb As Workbook)
    With wb
        'Do your work here
        .Worksheets(1).Range("A1").Value = "Hello World!"
    End With
End Sub

pendant l'exécution de ce code son montrant le nom ou le numéro de dossier mauvais. j'ai stocké tout mon fichier dans ("\C:\Users\20098323\Desktop\EXCL\") EXCL folder

0
répondu Bhavik Modi 2016-06-02 06:39:47

au lieu de passer les valeurs à DoWork on peut aussi exécuter les travaux dans Processfiles().

Sub ProcessFiles()

    Dim Filename, Pathname As String
    Dim wb1 As Workbook
    Dim wb2 As Workbook

    Dim Sheet As Worksheet
    Dim PasteStart As Range
    Dim Counter As Integer

    Set wb1 = ActiveWorkbook
    Set PasteStart = [RRimport!A1]

    Pathname = ActiveWorkbook.Path & "\For Macro to run\"
    Filename = Dir(Pathname & "*.xls")
    Do While Filename <> ""
        Set wb2 = Workbooks.Open(Pathname & Filename)
        For Each Sheet In wb2.Sheets
                With Sheet.UsedRange
                .Copy PasteStart
                Set PasteStart = PasteStart.Offset(.Rows.Count)
            End With
        Next Sheet
        wb2.Close
        Filename = Dir()
    Loop
End Sub
0
répondu Thavachelvan Kesavan 2017-08-31 07:09:13

Merci Peterm!!

en fait, j'ai fait ma macro en utilisant exactement le même code que vous avez posté (process_fiels et dowork).

Il a travaillé génial!! (avant ma question)

chacun de mes 1000 cahiers A 84 feuilles de travail. Mon propre macro (qui fonctionne enfin!) divise chaque classeur en 85 fichiers différents (l'original + une version abrégée de chaque feuille de travail sauvegardée sous forme de fichier individuel).

cela me laisse avec 1000 fichiers + 1000x85 dans le même dossier, et ce serait vraiment difficile à trier.

Ce que j'ai vraiment besoin, c'est pour Process_Files de prendre le premier fichier, créer un dossier avec le nom du premier fichier, déplacez le premier fichier dans le dossier avec ist nom, puis exécutez ma macro (dans le dossier nommé d'après le premier fichier dans le dossier nouvellement créé...), revenir en arrière et prendre la deuxième fichier, créer un dossier avec le nom du second fichier, déplacez le fichier vers le dossier avec ist nom, puis exécutez ma macro (dans le dossier nommé après le deuxième fichier dans le dossier nouvellement créé...), etc...

à la fin, j'aurais dû déplacer tous les fichiers dans des dossiers avec le même nom que les fichiers, et le contenu du dossier \Files\ original serait de 1000 dossiers avec le nom des fichiers originaux, containgin les fichiers originaux + 84 fichiers ce que ma propre macro fait déjà.

Peut-être que c'est plus facile avec le code:

Sous-Fichiers De Processus() Dim Nom De Fichier, Chemin As String Dim WB As Classeur

Pathname = ActiveWorkbook.Path & "\Files\"
Filename = Dir(Pathname & "*.xls")
Do While Filename <> ""

(ici, il doit lire le nom du fichier, Créer un dossier avec le nom du fichier, déplacer le fichier dans ce dossier nouvellement créé)

    Set wb = Workbooks.Open(Pathname & Filename)  <- open file, just as is.
    DoWork wb   <- do my macro,just as is
    wb.Close SaveChanges:=False      <- not save, to keep the original file

(retournez dans le dossier \Files\ original)

    Filename = Dir()   <-   Next file, just as is
Loop

End Sub

Sous-travail(wb comme cahier D'exercices) Avec wb Mamacro Fin Avec End Sub

merci Beaucoup, ce site est génial!

__________________edit, la macro fonctionne maintenant _________________________

comme vous pouvez le voir, Je ne suis pas un expert en VBA, mais la macro fonctionne enfin. Le code n'est pas soigné du tout, Je ne suis pas programmeur SW.

voilà, ça pourrait aider un jour.

Sous-ProcessFiles_All() Dim Nom De Fichier, Chemin D'Accès, NewPath, FileSource, FileDestination Comme Une Chaîne De Caractères Dim wb Comme Classeur

    Pathname = ActiveWorkbook.Path & "\Files\"
    Filename = Dir(Pathname & "*.csv")

 Do While Filename <> ""

     NewPath = Pathname & Left(Filename, 34) & "\"

 On Error Resume Next
     MkDir (NewPath)
 On Error GoTo 0

 Set wb = Workbooks.Open(Pathname & Filename)

    DoWorkPlease wb   '  <------------   It is important to say please!!

Sur La Reprise D'Erreur Suivant wb.Fermer SaveChanges: = False if Err.Nombre < > 0 alors ‘Gestionnaire d'erreur nécessaire ici Fin si

    Filename = Dir()

 Loop

End Sub

sous-Dowworkplease(wb comme classeur) Avec wb

' étant donné que mon application compte plus de 1800 cellules pour chaque colonne et qu'elle prend beaucoup de temps ‘ J'utilise un "mode test" où je ne joue qu'avec 18 valeurs.

 Dim TestingMode As Integer
 Dim ThisRange(1 To 4) As Variant

 TestingMode = 0

If TestingMode = 1 Then
   ThisRange(1) = "B2:CG18"
   ThisRange(2) = "CT2:CT18"
   ThisRange(3) = "CH2:CN18"
   ThisRange(4) = "CN2:CS18"
   Rows("19:18201").Select
   Selection.Delete Shift:=xlUp
End If

If TestingMode = 0 Then
   ThisRange(1) = "B2:CG18201"
   ThisRange(2) = "CT2:CT18201"
   ThisRange(3) = "CH2:CN18201"
   ThisRange(4) = "CN2:CS18201"
End If

‘ accélérer la macro, désactiver la mise à jour et les alertes

Application.ScreenUpdating = False Application.DisplayAlerts = False

‘ Voici mon code qui manipule les valeurs des cellules à partir des chiffres (les valeurs lues par les capteurs doivent être "traduites" en valeurs réelles. Code pas ici en fait.

' ensuite je copie tout le truc en nombres, il n'y a plus de formules, plus faciles à travailler de cette façon.

'_____________________________________ 'Obtenir des valeurs plus les formules

 Sheets.Add After:=Sheets(Sheets.Count)
 Sheets("Sheet1").Select
 Columns("A:CT").Select
 Selection.Copy
 Sheets("Sheet2").Select
 Columns("A:A").Select
 Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
     :=False, Transpose:=False
 Application.CutCopyMode = False
 Selection.NumberFormat = "0"
 With Selection
     .HorizontalAlignment = xlCenter
     .VerticalAlignment = xlBottom
     .WrapText = False
     .Orientation = 0
     .AddIndent = False
     .IndentLevel = 0
     .ShrinkToFit = False
     .ReadingOrder = xlContext
     .MergeCells = False
 End With

' ensuite je sauve ce nouveau classeur dans un dossier avec son propre nom (et sous le dossier \FICHIERS\

'_____________________________________ "Enregistrer le travail en vertu de son propre dossier

Dim CleanName, CleanPath, CleanNewName As Variant CleanPath = ActiveWorkbook.Chemin CleanName = ActiveWorkbook.Nom CleanName = Gauche(CleanName, 34) " je de prendre de l'extension CleanPath = CleanPath + " \ " + CleanName CleanNewName = CleanPath + " \ " + CleanName CleanNewName = CleanNewName + " _clean.csv" et j'ajoute "propre" pour avoir une autre nom maintenant.

Sur La Reprise D'Erreur Suivant ActiveWorkbook.SaveAs Filename: = CleanNewName, FileFormat:= xlCSV, CreateBackup: = False

' S'il y a une erreur, je crée un dossier vide avec le nom du fichier pour savoir quel fichier doit être retravaillé.

If Err.Number <> 0 Then
    MkDir (CleanPath + "_error_" + CleanName)
End If    

' Resume Next

ActiveSheet.Déplacer _ Après: = ActiveWorkbook.Les feuilles(1)

' ensuite j'ai divisé le classeur en fichiers individuels avec les données dont j'ai besoin pour capteur.

‘ Voici les plages individuelles dont j'ai besoin pour chaque fichier. Comme j'ai plus de 1000 fichiers, cela en vaut la peine.

'_______________ le Split!!______________________________

Dim Col(1 À 98) Comme Variante Col (1) = " A: A, B: B, CH:CH, CN, CT: CT" Col (2) = " A: A, C:C, CH:CH, CN: CN, CT: CT" Col (3) = " A: A, D:D, CH:CH, CN, CT: CT" Col (4) = " A: A, E:E, CH:CH, CN, CT: CT" Col (5) = " A: A, F: F, CH:CH, CN: CN, CT: CT" Col (6) = "A:A,G:G,CH:CH,CN: CN, CT: CT" Col (7) = " A: A,H: H, CH:CH, CN, CT: CT" Col (8) = " A: A, I: I, CH:CH, CN, CT: CT" Col (9) = " A: A, J: J, CH:CH, CN, CT: CT" Col (10) = " A: A, K:K, CH:CH, CN, CT: CT" Col (11) = " A: A, L:L, CH:CH, CN, CT: CT" Col (12) = " A: A, M:M, CH:CH, CN, CT: CT" Col (13) = " A: A, N:N, CH:CH, CN: CN, CT: CT" Col (14) = " A: A, O:O, CH:CH, CN, CT: CT" Col(15) = ": P:P,IC:IC,CO:CO,CT:CT" Col (16) = " A:a, Q:Q, CI: CI, CO: CO, CT: CT" Col (17) = " A:A, R:R, CI: CI, CO: CO, CT: CT" Col (18) = "A: A, S:S, CI: CI, CO: CO, CT: CT" Col (19) = " A:A, T:T, CI: CI, CO: CO, CT: CT" Col (20) = " A:A, U: U, CI: CI, CO: CO, CT: CT" Col (21) = " A: A, V:V, CI: CI, CO: CO, CT: CT" Col (22) = " A:A, W:W, CI: CI, CO: CO, CT: CT" Col (23) = " A: A, X:X, CI: CI, CO: CO, CT: CT" Col (24) = " A:A, Y:Y, CI: CI, CO: CO, CT: CT" Col (25) = " A: A, Z:Z, CI: CI, CO: CO, CT: CT" Col (26) = " A:A, AA: AA, CI: CI, CO: CO, CT: CT" Col (27) = " A:A, AB: AB, CI: CI, CO: CO, CT: CT" Col (28) = " A:A, AC: AC, CI: CI, CO: CO, CT: CT" Col (29) = "A:A,AD:AD,CJ:CJ,CP: CP, CT: CT" Col (30) = " A:A,AE: AE, CJ: CJ, CP: CP, CT: CT" Col (31) = " A:A, AF: AF,CJ:CJ, CP: CP, CT: CT" Col (32) = " A:A, AG: AG, CJ:CJ, CP: CP, CT: CT" Col (33) = " A:A, AH: AH, CJ:CJ, CP: CP, CT: CT" Col (34) = " A: A,AI: AI,CJ: CJ, CP: CP, CT: CT" Col (35) = " A: A, AJ:AJ,CJ: CJ, CP: CP, CT: CT" Col (36) = " A: a,AK: AK,CJ: CJ, CP: CP, CT: CT" Col (37) = " A:A, AL: AL,CJ:CJ, CP: CP, CT: CT" Col (38) = " A:A, AM: AM,CJ:CJ, CP: CP, CT: CT" Col (39) = " A: A, AN:AN, CJ: CJ, CP: CP, CT: CT" Col (40) = "A:A,AO:AO,CJ:CJ,CP: CP, CT: CT" Col (41) = " A: A, AP: AP,CJ:CJ, CP: CP, CT: CT" Col (42) = " A: A, AQ:AQ, CJ: CJ, CP: CP, CT: CT" Col (43) = " A: A, AR: AR,CK: CK,CQ: CQ, CT:CT" Col (44) = " A:A, AS: AS, CK: CK,CQ: CQ, CT:CT" Col (45) = " A: A, AT: AT, CK: CK,CQ:CQ, CT:CT" Col (46) = " A: A, AU: AU,CK: CK,CQ: CQ, CT:CT" Col (47) = " A:A, AV: AV,CK: CK,CQ: CQ, CT:CT" Col (48) = " A:A,AW: AW,CK: CK,CQ:CQ, CT:CT" Col (49) = " A: A,AX: AX,CK: CK,CQ: CQ, CT:CT" Col (50) = " A: A, AY: AY, CK: CK,CQ: CQ, CT:CT" Col (51) = "A: A,AZ: AZ,CK: CK,CQ:CQ, CT: CT" Col (52) = " A: A, BA: BA,CK: CK,CQ: CQ, CT:CT" Col (53) = " A: A, BB: BB,CK: CK,CQ:CQ, CT:CT" Col (54) = " A: A, BC: BC,CK: CK,CQ: CQ, CT:CT" Col (55) = " A: A,BD: BD,CK: CK,CQ: CQ, CT:CT" Col (56) = " A:A, BE: BE,CK: CK,CQ: CQ, CT:CT" Col (57) = " A: A, BF: BF,CL:CL, CR:CR, CT: CT" Col (58) = " A: A, BG: BG,CL:CL, CR: CR, CT: CT" Col (59) = " A: A, BH:BH, CL:CL, CR:CR, CT: CT" Col (60) = " A:A, BI: BI, CL:CL, CR: CR, CT: CT" Col (61) = " A: A, BJ:BJ, CL:CL, CR:CR, CT: CT" Col (62) = "A: A, BK:BK, CL:CL, CR: CR, CT: CT" Col (63) = " A:A,BL: BL, CL:CL, CR: CR, CT: CT" Col (64) = " A: A, BM:BM, CL:CL, CR:CR, CT: CT" Col (65) = " A: A, BN: BN,CL:CL, CR:CR, CT: CT" Col (66) = " A: A, BO: BO,CL:CL, CR:CR, CT: CT" Col (67) = " A: A,BP: BP, CL: CL, CR: CR, CT: CT" Col (68) = " A: A, BQ:BQ, CL:CL, CR:CR, CT: CT" Col (69) = " A: A, BR: BR, CL:CL, CR:CR, CT: CT" Col (70) = " A: A, BS: BS,CL:CL, CR:CR, CT: CT" Col (71) = " A: A, BT: BT, CM: CM, CS: CS, CT: CT" Col (72) = " A: A, BU: BU, CM: CM, CS: CS, CT: CT" Col (73) = "A:A,BV:BV,CM: CM, CS: CS, CT: CT" Col (74) = " A:A, BW: BW, CM: CM, CS: CS, CT: CT" Col (75) = " A: A, BX:BX, CM: CM, CS: CS, CT: CT" Col (76) = " A: A,BY: BY,CM: CM, CS: CS, CT: CT" Col (77) = " A: A, BZ: BZ, CM: CM, CS, CT: CT" Col (78) = " A: A, CA: CA, CM: CM, CS: CS, CT: CT" Col (79) = " A: A, CB: CB, CM: CM, CS: CS, CT: CT" Col (80) = " A: A, CC: CC, CM: CM, CS: CS, CT: CT" Col (81) = " A: A, CD: CD, CM: CM, CS: CS, CT: CT" Col (82) = " A:A, CE: CE, CM: CM, CS: CS, CT: CT" Col (83) = " A: A, CF: CF, CM: CM, CS: CS, CT: CT" Col (84) = "A:A,CG: CG, CM: CM, CS: CS, CT: CT" 'Je veux partager 84 nouveaux fichiers, donc pour les tests j'utilise seulement 1, et pour la vraie chose je vais avec 84

Dim CounterMode As Integer

Si TestingMode = 1 Alors CounterMode = 1 Autre CounterMode = 84

For i = 1 To CounterMode

‘ ce code prend les colonnes nécessaires, et les coller dans un nouveau classeur.

 Sheets("Sheet1").Select
 Cells.Select
 Selection.ClearContents
 Range("A1").Activate
 Sheets(2).Select
 Range(Col(i)).Select
 Selection.Copy
 Sheets("Sheet1").Select
 ActiveSheet.Paste
 Application.CutCopyMode = False
 With Selection
     .HorizontalAlignment = xlCenter
     .VerticalAlignment = xlBottom
     .WrapText = False
     .Orientation = 0
     .AddIndent = False
     .IndentLevel = 0
     .ShrinkToFit = False
     .ReadingOrder = xlContext
     .MergeCells = False
 End With
 Columns("A:E").EntireColumn.AutoFit

" Enregistrer le fichier individuel

'_____________save the work________________

Dim ThePath, TheName, TheSwitch As String ThePath = ActiveWorkbook.Chemin+ "\" TheName = Left (ActiveWorkbook.Nom, 34 ‘ " retirez l'extension du nom ThePath = ThePath + TheName TheSwitch = Cells(3, 2) ‘ Dans la Cellule (3,2) j'ai le nom de la personne nom, j'ai donc ajouté au nom de fichier. TheName = ThePath + " _ " + TheSwitch +".xls"

Range("A1").Select
Sheets("Sheet1").Select
Sheets("Sheet1").Copy

Dim SheetName As Variant

" j'nom de Feuilles(1) dans la feuille Sheet1, depuis la feuille d'origine a le nom et la date de l'épreuve. ‘ Je faire pour avoir le même nom sur tous les fichiers afin de faire un tracé, puis je renommer la feuille avec le ‘ nom original

SheetName = ActiveSheet.Nom ActiveWorkbook.Feuilles (1).Name = "Sheet1"

" voici l'intrigue

Columns("A:E").EntireColumn.AutoFit
Columns("B:E").Select
ActiveSheet.Shapes.AddChart.Select
ActiveChart.SetSourceData Source:=Range("'Sheet1'!$B:$E")
ActiveChart.ChartType = xlXYScatterLinesNoMarkers

ActiveWorkbook.Sheets(1).Name = SheetName

" enregistrer On Error Resume Next ActiveWorkbook.SaveAs Filename: = TheName, FileFormat: = 56, CreateBackup:=False

If Err.Number <> 0 Then
    MkDir (ThePath + "_error_" + TheName)
End If

ActiveWorkbook.Close

Ensuite, j'ai '____________________C'était le Split__________________________________ "Activez le screenupdating: Application.ScreenUpdating = True Application.DisplayAlerts = True Portée ("A1").Sélectionnez

 End With

End Sub

-2
répondu user9903 2015-03-19 07:27:47