XL 2013 Plusieurs macros, plusieurs fichiers, même répertoire

JBond13600

XLDnaute Junior
Bonjour le Forum,

Alors voilà, j'ai 3 macros qui fonctionnent et 25 fichiers qui ont la même structure. Le tout dans un même répertoire.

J'applique ces 3 macros successivement à ces 25 fichiers et ceci de manière régulière.

Le code vba qu'il me faudrait aurait l'objectif suivant :

1/-Dans le répertoire en cours,
2/- Ouvre la macro 1 "Nom de la macro 1"
3/- Ouvre le fichier 1 "Nom du fichier 1"
4/- Applique la macro 1 au fichier 1
5/- Ferme le fichier 1
6/- Ouvre le fichier "Nom du fichier 2"
7/- Applique la macro 1 au fichier 2
8/- Ferme le fichier 2... jusqu'au 25me fichier.
9/- Ferme la macro 1

10/- Ouvre la macro 2 "Nom de la macro 2"
11/- Ouvre le fichier 1 "Nom du fichier 1"...

Merci de votre aide.
 

ChTi160

XLDnaute Barbatruc
Bonjour
Voila ce que j'ai mis dans un Module Standard du Fichier ""
VB:
Option Explicit
Option Base 1
Public Tab_Recup As Variant
Public Tab_Recap() As Variant
Public Tab_Ws() As Variant
Public i As Long
Public DerLgn As Integer
Public Lgn As Integer
Public L As Integer
Public C As Byte
Public Col As Byte
Public DerCol As Byte
Public Ws_Source As Worksheet
Public Ws_Cible As Worksheet
Public Ws As Worksheet
Public Ws_Base As Worksheet
Public WkB_Source  As Workbook
Public Str_Sht As String
Public Str_Text As String
Sub Ouvrirfichiers()
    Dim Fichier As String, Chemin As String, Wb As Workbook
    Application.ScreenUpdating = False
    Chemin = ThisWorkbook.Path & "\Test Fichiers à Traiter\" 'adapter chemin
    Fichier = Dir(Chemin & "Combis *.xls*")
    Do While Fichier <> ""
        Set WkB_Source = Workbooks.Open(Chemin & Fichier)   
        'suite de la procedure
'**********************************
       CopieDonnéesBaseDansFeuilles WkB_Source 'appel de tes macros
'**********************************
        Application.DisplayAlerts = False       
        Application.DisplayAlerts = True
        Set WkB_Source = Nothing
        Fichier = Dir
    Loop
    Application.ScreenUpdating = True
End Sub
'*******************
Sub CopieDonnéesBaseDansFeuilles(ByVal WkB_Source As Workbook)
Application.ScreenUpdating = False
Dim ShtName As String
Dim ShtCompare As String
Dim Idx As Long
'On Error Resume Next
With WkB_Source 'avec le Classeur
 Set Ws_Base = .Worksheets("Base")
    With Ws_Base
     DerLgn = .Cells(.Rows.Count, 1).End(xlUp).Row
     If DerLgn = 1 Then GoTo suite
       With .Range(.Cells(1, 1), .Cells(DerLgn, 9))
            .Sort key1:=.Cells(1, 1), Order1:=xlAscending, key2:=.Cells(1, 2), Order2:=xlAscending, Header:=xlNo
        Tab_Recup = .Value
       End With
    End With
For L = 1 To UBound(Tab_Recup, 1)
      ShtName = Tab_Recup(L, 1)
      Idx = Mid(ShtName, 2)
  For Each Ws In .Worksheets
             ShtCompare = Ws.Name
        If InStr(2, ShtCompare, Idx) <> 0 Then
          With .Worksheets(ShtCompare)
             DerLgn = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
                  For C = 1 To UBound(Tab_Recup, 2)
                      .Cells(DerLgn, C) = Tab_Recup(L, C)
                  Next C
                      .Cells.EntireColumn.AutoFit
          End With
        End If
  Next Ws
Next L
suite:
            .Close True
End With
Erase Tab_Recup
Set Ws = Nothing
Application.ScreenUpdating = True
End Sub
Questions :
Lors du transfert des données de la feuille "Base" vers les Feuilles "C#*" doit on effacer les données de la feuille "Base" après transfert?
ou faut il effacer les données des Feuilles "C#*" avant transfert ?
De plus , je n'ai pas tout compris Lol ,mais bon avec des explications on devrait avancer lol
dans l'attente
Bonne fin de Journée
Amicalement
Jean marie
 

JBond13600

XLDnaute Junior
Bonjour et joyeux noël à tous,
BonjourChTi160 et merci pour la persévérance dans ton aide

Après les modification que tu m'as demandé d'effectuer et que j'espère avoir fait au mieux, il m'envoie le message suivant :
Erreur d'exeécution 52
Sur la ligne suivante de la macro "ouvrir fichiers" :
Fichier = Dir(Chemin & "Combis *.xls*")

Ci-Dessous et en rouge, ce que j'ai copié et mofidié dans un module de base :

Option Explicit
Option Base 1
Public Tab_Recup As Variant
Public Tab_Recap() As Variant
Public Tab_Ws() As Variant
Public i As Long
Public DerLgn As Integer
Public Lgn As Integer
Public L As Integer
Public C As Byte
Public col As Byte
Public DerCol As Byte
Public Ws_Source As Worksheet
Public Ws_Cible As Worksheet
Public Ws As Worksheet
Public Ws_Base As Worksheet
Public WkB_Source As Workbook
Public Str_Sht As String
Public Str_Text As String

Sub Ouvrirfichiers()
Dim Fichier As String, Chemin As String, Wb As Workbook
Application.ScreenUpdating = False
Chemin = ThisWorkbook.Path & "C:\Users\Thierry\Desktop\Courses Galop 2018\" 'adapter chemin
Fichier = Dir(Chemin & "Combis *.xls*")
Do While Fichier <> ""
Set WkB_Source = Workbooks.Open(Chemin & Fichier)
'suite de la procedure
'**********************************
CopieDonnéesBaseDansFeuilles WkB_Source 'appel de tes macros
CompterEcarts
Effacer
RécupérerEcartsMax

'**********************************
Application.DisplayAlerts = False
Application.DisplayAlerts = True
Set WkB_Source = Nothing
Fichier = Dir
Loop
Application.ScreenUpdating = True
End Sub
'*******************
Sub CopieDonnéesBaseDansFeuilles(ByVal WkB_Source As Workbook)
Application.ScreenUpdating = False
Dim ShtName As String
Dim ShtCompare As String
Dim Idx As Long
'On Error Resume Next
With WkB_Source 'avec le Classeur
Set Ws_Base = .Worksheets("Base")
With Ws_Base
DerLgn = .Cells(.Rows.Count, 1).End(xlUp).Row
If DerLgn = 1 Then GoTo suite
With .Range(.Cells(1, 1), .Cells(DerLgn, 9))
.Sort key1:=.Cells(1, 1), order1:=xlAscending, key2:=.Cells(1, 2), Order2:=xlAscending, Header:=xlNo
Tab_Recup = .Value
End With
End With
For L = 1 To UBound(Tab_Recup, 1)
ShtName = Tab_Recup(L, 1)
Idx = Mid(ShtName, 2)
For Each Ws In .Worksheets
ShtCompare = Ws.Name
If InStr(2, ShtCompare, Idx) <> 0 Then
With .Worksheets(ShtCompare)
DerLgn = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
For C = 1 To UBound(Tab_Recup, 2)
.Cells(DerLgn, C) = Tab_Recup(L, C)
Next C
.Cells.EntireColumn.AutoFit
End With
End If
Next Ws
Next L
suite:
.Close True
End With
Erase Tab_Recup
Set Ws = Nothing
Application.ScreenUpdating = True
End Sub

Sub CompterEcarts()
Dim Ws As Worksheet, ec%, i%
Application.ScreenUpdating = False
For Each Ws In Worksheets
With Ws.Columns("I")
If .Cells(1, 1) <> "" Then i = 1 Else i = 2
Do While .Cells(i, 1) <> ""
If .Cells(i, 1) = "*" Then
ec = ec + 1
ElseIf .Cells(i, 1) = 0 Then
.Cells(i, 2) = ec: ec = 0
End If
i = i + 1
Loop
If ec > 0 Then .Cells(i - 1, 3) = ec: ec = 0
End With
Next Ws
End Sub

Sub Effacer()
Dim Ws As Worksheet
For Each Ws In Worksheets
Ws.Columns("J:K").ClearContents
Next Ws
End Sub

Option Explicit

Dim f As Worksheet, col&

Sub RécupérerEcartsMax()

Application.ScreenUpdating = False
Cells.ClearContents
For Each f In Worksheets
If f.Name <> ActiveSheet.Name Then
f.Range("J1:J" & f.Range("J" & Rows.Count).End(xlUp).Row).Copy
col = Cells(1, Columns.Count).End(xlToLeft).Column + 1
Cells(1, col).Value = f.Name
Cells(2, col).PasteSpecial xlPasteAll
Range(Cells(2, col), Cells(Cells(Rows.Count, col).End(xlUp).Row, col)).Select
Range(Cells(2, col), Cells(Cells(Rows.Count, col).End(xlUp).Row, col)).Sort _
key1:=Cells(2, col), order1:=xlDescending, Header:=xlNo
End If
Next f
Range("A1").Select
End Sub
 

ChTi160

XLDnaute Barbatruc
Re
déjà je constate que le Cheimn d'acces au fichiers n 'est pas Bon
Tu écris :
Chemin = ThisWorkbook.Path & "C:\Users\Thierry\Desktop\Courses Galop 2018\"
ThisWorkbook.Path correspond au chemin d’accès au Fichier d'ou tu lances la macro :
Ouvrirfichiers() et Test Fichiers à Traiter et le Dossier où se trouvent les Fichier "Combis *" que l'on doit traiter.
si tu veux mettre le chemin d'accès Complet tu mets :

Code:
Chemin ="C:\Users\Thierry\Desktop\Courses Galop 2018\"

a voir si cela règle ton problème
Sinon expliques nous ce que tu cherches a faire lol
Bonne fin de Soirée
Amicalement
Jean Marie
 

JBond13600

XLDnaute Junior
Oupsssssss,

Dsl mais à force de faire des tests...

Après l'explication très développée que j'ai fourni dans mon avant dernier post

J'ai recréé un nouveau répertoire pour tout reprendre à zéro et me suis planté sur le chemin d'accès :

Le chemin d'accès complet et nouveau est :
"C:\Users\Thierry\Desktop\Courses Galop 2018\Dossier Test au 25 12 2017\"
Ce dossier contient 4 fichiers tests nouveaux appelés successivement "Combis de C 1", "Combis de C 2", Combis de C 3" et "Combis de C 4". Ceux-ci ont tous la même structure.

Ce dossier contient le fichier macro contenant le code modifié en conséquence ci-dessous à lancer en cliquant successivement sur macro/afficher/ourirfichier/éxécuter.

Le message d'erreur reste pourtant le même !!!
Erreur d'exeécution 52
Sur la ligne suivante de la macro "ouvrir fichiers" :
Fichier = Dir(Chemin & "Combis *.xls*")


Option Explicit
Option Base 1
Public Tab_Recup As Variant
Public Tab_Recap() As Variant
Public Tab_Ws() As Variant
Public i As Long
Public DerLgn As Integer
Public Lgn As Integer
Public L As Integer
Public C As Byte
Public col As Byte
Public DerCol As Byte
Public Ws_Source As Worksheet
Public Ws_Cible As Worksheet
Public Ws As Worksheet
Public Ws_Base As Worksheet
Public WkB_Source As Workbook
Public Str_Sht As String
Public Str_Text As String

Sub Ouvrirfichiers()
Dim Fichier As String, Chemin As String, Wb As Workbook
Application.ScreenUpdating = False
Chemin = ThisWorkbook.Path & "C:\Users\Thierry\Desktop\Courses Galop 2018\Dossier Test au 25 12 2017\" 'adapter chemin
Fichier = Dir(Chemin & "Combis *.xls*")
Do While Fichier <> ""
Set WkB_Source = Workbooks.Open(Chemin & Fichier)
'suite de la procedure
'**********************************
CopieDonnéesBaseDansFeuilles WkB_Source 'appel de tes macros
CompterEcarts
Effacer
RécupérerEcartsMax
'**********************************
Application.DisplayAlerts = False
Application.DisplayAlerts = True
Set WkB_Source = Nothing
Fichier = Dir
Loop
Application.ScreenUpdating = True
End Sub
'*******************
Sub CopieDonnéesBaseDansFeuilles(ByVal WkB_Source As Workbook)
Application.ScreenUpdating = False
Dim ShtName As String
Dim ShtCompare As String
Dim Idx As Long
'On Error Resume Next
With WkB_Source 'avec le Classeur
Set Ws_Base = .Worksheets("Base")
With Ws_Base
DerLgn = .Cells(.Rows.Count, 1).End(xlUp).Row
If DerLgn = 1 Then GoTo suite
With .Range(.Cells(1, 1), .Cells(DerLgn, 9))
.Sort key1:=.Cells(1, 1), order1:=xlAscending, key2:=.Cells(1, 2), Order2:=xlAscending, Header:=xlNo
Tab_Recup = .Value
End With
End With
For L = 1 To UBound(Tab_Recup, 1)
ShtName = Tab_Recup(L, 1)
Idx = Mid(ShtName, 2)
For Each Ws In .Worksheets
ShtCompare = Ws.Name
If InStr(2, ShtCompare, Idx) <> 0 Then
With .Worksheets(ShtCompare)
DerLgn = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
For C = 1 To UBound(Tab_Recup, 2)
.Cells(DerLgn, C) = Tab_Recup(L, C)
Next C
.Cells.EntireColumn.AutoFit
End With
End If
Next Ws
Next L
suite:
.Close True
End With
Erase Tab_Recup
Set Ws = Nothing
Application.ScreenUpdating = True
End Sub

Sub CompterEcarts()
Dim Ws As Worksheet, ec%, i%
Application.ScreenUpdating = False
For Each Ws In Worksheets
With Ws.Columns("I")
If .Cells(1, 1) <> "" Then i = 1 Else i = 2
Do While .Cells(i, 1) <> ""
If .Cells(i, 1) = "*" Then
ec = ec + 1
ElseIf .Cells(i, 1) = 0 Then
.Cells(i, 2) = ec: ec = 0
End If
i = i + 1
Loop
If ec > 0 Then .Cells(i - 1, 3) = ec: ec = 0
End With
Next Ws
End Sub

Sub Effacer()
Dim Ws As Worksheet
For Each Ws In Worksheets
Ws.Columns("J:K").ClearContents
Next Ws
End Sub

Option Explicit

Dim f As Worksheet, col&

Sub RécupérerEcartsMax()

Application.ScreenUpdating = False
Cells.ClearContents
For Each f In Worksheets
If f.Name <> ActiveSheet.Name Then
f.Range("J1:J" & f.Range("J" & Rows.Count).End(xlUp).Row).Copy
col = Cells(1, Columns.Count).End(xlToLeft).Column + 1
Cells(1, col).Value = f.Name
Cells(2, col).PasteSpecial xlPasteAll
Range(Cells(2, col), Cells(Cells(Rows.Count, col).End(xlUp).Row, col)).Select
Range(Cells(2, col), Cells(Cells(Rows.Count, col).End(xlUp).Row, col)).Sort _
key1:=Cells(2, col), order1:=xlDescending, Header:=xlNo
End If
Next f
Range("A1").Select
End Sub
 

cp4

XLDnaute Barbatruc
Bonsoir,
Est-ce que le fichier contenant les macros est dans le même dossier (répertoire) que les fichiers "Combis...
si c'est le cas, je t'avais donné le code.

Pour l'édition de ton code, utilise l'outil prévu pour (voir image)
1.jpg

2.jpg
 

cp4

XLDnaute Barbatruc
si le fichier Macro Action Tous Fichiers.xlsm est dans le même dossier que les fichiers Combis... voici le code
VB:
Dim Fichier As String, Chemin As String, Wb As Workbook 'variables globales
Sub ouvrirfichiers()
  
    Chemin = ThisWorkbook.Path 'donne le chemin de ton fichier principal
    Fichier = Dir(Chemin & "\*.xls*") 'on se met dans répertoire du fichier

    Do While Fichier <> "Macro Action Tous Fichiers.xlsm" 'nom du fichier où se trouve les macros
        Set Wb = Workbooks.Open(Chemin & "\" & Fichier)
        'suite de la procedure
        Call CopieDonnéesBaseDansFeuilles    'appel de tes macros
        Call CompterEcarts
        Call Effacer
        Call Récupérer
        Application.DisplayAlerts = False
        Wb.Close True
        Application.DisplayAlerts = True
        Set Wb = Nothing

        Fichier = Dir
    Loop
    MsgBox "TRAITEMENT DE TOUTES LES MACROS TERMINE!" 'message pour avertir fin procédure
End Sub
 

JBond13600

XLDnaute Junior
Bonsoir CP4 et joyeux noël à toi,

mais ce que tu me demandes de faire n'est pas, ou pas encore, accessible pour moi.

Je dois faire cela avant ou après avoir lancer la macro générale fourni par ChTi60 qui se trouve dans le répertoire où se trouvent tous les fichiers à traiter ainsi que la macro générale et les macros intégrées dans la macro générale ?

On m'a demandé des explications très précises que j'ai fourni en y passant énormément de temps pour être le plus précis possible.

Je ne peux rien faire de plus en terme d'explication.

J'ai des macros qui marchent toutes individuellement sur chaque fichier à traiter. Et elles ne fonctionnent plus lorsqu'elles sont intégrées dans une macro générale malgré tous les codes qu'on a bien voulu m'écrire.

C'est à n'y rien comprendre...

Dans la première macro générale que tu m'as proposé, ça a bugger sur la première macro intégrée à la tienne. Par suite ça a bugger sur l'autre. J'avais l'impression d'avancer au fil des petits détails à régler au fur et à mesure...

L'outil que tu me proposes gentiment ce soir n'est pas à ma portée à ce jour et j'en suis parfaitement désolé.
 

cp4

XLDnaute Barbatruc
Bonjour,
L'outil que tu me proposes gentiment ce soir n'est pas à ma portée à ce jour et j'en suis parfaitement désolé.
c'est à ta portée plus que tu rédiges des commentaires. Les outils auxquels je fais allusion sont sur la barre (entête) de la fenêtre dans laquelle on rédige nos commentaires.

Tu dis que ça bug, sans nous dire sur quelle ligne de code ça bug. Alors mets le curseur de la souris dans la macro principale et utilise la touche F8 (mode débogage=exécution du code ligne par ligne).

Tu dis aussi que tes macros quand elles sont exécutées individuellement fonctionnent parfaitement. Alors que tu ne nous donnes pas les conditions (comment fais-tu pour les exécuter individuellement? depuis où?).

Il n'y a pas de raison que ça ne fonctionne pas à partir de ma macro qui ne fait qu'ouvrir tous les fichiers (un à un) qui se trouvent dans le même dossier que le fichier où se trouve la macro et appelle tes macros l'une après l'autre. Il doit manquer quelque chose.

On patauge parce que tu ne réponds pas exactement et ne te limites pas aux questions posées.
 
Dernière édition:

JBond13600

XLDnaute Junior
Bonjour le fil, Bonjour CP4,

Je viens d'essayer ton dernier code.

Il m'annonce une erreur d'exécution 52 pour la ligne :
Fichier = Dir(Chemin & "\*.xls*") 'on se met dans répertoire du fichier

Tout a été respecté à la lettre avec le code suivant que tu m'as donné :
Dim Fichier As String, Chemin As String, Wb As Workbook 'variables globales
Sub ouvrirfichiers()
Chemin = ThisWorkbook.Path & "C:\Users\Thierry\Desktop\Courses Galop 2018\Dossier Test au 25 12 2017\" 'donne le chemin de ton fichier principal
Fichier = Dir(Chemin & "\*.xls*") 'on se met dans répertoire du fichier

Do While Fichier <> "Macro Action Tous Fichiers.xlsm" 'nom du fichier où se trouve les macros
Set Wb = Workbooks.Open(Chemin & "\" & Fichier)
'suite de la procedure
Call CopieDonnéesBaseDansFeuilles 'appel de tes macros
Call CompterEcarts
Call Effacer
Call RécupérerEcartsMax
Application.DisplayAlerts = False
Wb.Close True
Application.DisplayAlerts = True
Set Wb = Nothing

Fichier = Dir
Loop
MsgBox "TRAITEMENT DE TOUTES LES MACROS TERMINE!" 'message pour avertir fin procédure
End Sub
 

cp4

XLDnaute Barbatruc
non ce n'est pas respecté à la lettre. la ligne ci-dessous n'est pas identique à ce que j'avais écrit
VB:
Chemin = ThisWorkbook.Path 'donne le chemin de ton fichier principal
ce n'est du tout la même chose avec la même ligne présente dans ton code (ci-dessous)
edit
VB:
Chemin = ThisWorkbook.Path & "C:\Users\Thierry\Desktop\Courses Galop 2018\Dossier Test au 25 12 2017\" 'donne le chemin de ton fichier principal
 

ChTi160

XLDnaute Barbatruc
Bonjour JBond13600
Bonjour Le Fil ,Le Forum
Tu n'as pas regardé ce que je t'ai dit
ceci ne peut pas fonctionner
ThisWorkbook.Path est le Chemin du Fichier Principal .
et ceci est le chemin de "Dossier Test " soit
"C:\Users\Thierry\Desktop\Courses Galop 2018\Dossier Test"
ce qui fait par exemple si ThisWorkbook.Path ="C:\Users\Thierry\Desktop"

Chemin= "C:\Users\Thierry\Desktop & "C:\Users\Thierry\Desktop\Courses Galop 2018\Dossier Test

et c'est pas bon Lol ça ne définit pas le chemin du Dossier principal , qui est par exemple toujours
"C:\Users\Thierry\Desktop"
Soit Chemin ="C:\Users\Thierry\Desktop ou
Chemin = Thisworkbook.path & "\"
cette dénomination est prise en compte lorsque tu ouvres le Fichier principal !
si tu ouvres un fichier quel qu’il soit si tu mets dans un module Standart ,une procédure du genre
VB:
Sub Test()
Msgbox Thisworkbook.path
'tu obtiendras le Chemin d’accès à ce Fichier
'exemple Toujours
'"C:\Users\Thierry\Desktop"
End Sub
dans l'attente
Bonne Journée
Amicalement
Jean marie
 
Dernière édition:

ChTi160

XLDnaute Barbatruc
Re
lorsqu'au post#32
je mets
VB:
 Chemin = ThisWorkbook.Path & "\Test Fichiers à Traiter\" 'adapter chemin
Cela veut dire que dans le Dossier ou se trouve ton fichier Principal , tu as un Dossier Nommé
"Test Fichiers à Traiter" dans lequel se trouvent les Fichiers Source "Combis *"
si ces fichiers Source se trouvent dans le Même Dossier que le Fichier Principal (Ensemble) tu mets
Chemin = ThisWorkbook.Path & "\"
Dans l'attente
Bonne journée
Amicalement
Jean marie
 

cp4

XLDnaute Barbatruc
Bah, tu as bien écrit : 'donne le chemin de ton fichier principal !
C'est ce que j'ai fais...
En te donnant le chemin qu'est-ce que tu en fais? Mais bon!

Chti160:);):), t'as bien fait un code dans lequel il y avait une petite erreur de nom de variable.

Je n'ai aucune idée du résultat escompté, mais toute les macros sont passées, sauf pour CompterEcarts car il n'y a pas de la feuille "base".

je te joins le fichier corrigé à toi de voir pour le résultat.

pour RécupérerEcartsMax j'en doute, car il y a une feuille en plus avant base.

si tu as ce message "TRAITEMENT DE TOUTES LES MACROS TERMINE!"
cela veut dire que toutes les macros ont été exécutées.
 

Pièces jointes

  • Macro Action Tous Fichiers.xlsm
    115.5 KB · Affichages: 25

Discussions similaires

Statistiques des forums

Discussions
312 177
Messages
2 085 972
Membres
103 073
dernier inscrit
MSCHOE16