Exécution d’une macro dans un certain nombre de classeurs (Microsoft Excel)
Si vous avez un certain nombre de classeurs que vous souhaitez traiter à l’aide de macros, vous pouvez être tenté de placer la macro de traitement dans chaque classeur (en tant que macro Auto_Open), puis d’écrire un type de routine pour charger chaque classeur, à son tour, et enregistrez-le.
Bien que cela puisse sembler bon en théorie, cela ne fonctionnera pas en pratique. Pourquoi?
Parce que lorsque vous ouvrez un classeur sous contrôle macro, la macro Auto_Open dans le classeur en cours d’ouverture ne s’exécutera pas automatiquement. Il existe trois façons de contourner ce problème.
La première consiste à refaire votre macro afin de ne pas vous fier aux macros Auto_Open dans chaque classeur. Si la macro Auto_Open dans chaque classeur est la même, pourquoi ne pas simplement déplacer le code vers une procédure distincte dans le classeur de contrôle? Par exemple, disons que vous utilisiez du code qui a suivi ce processus:
Sub MyMacro() Dim J As Integer Dim sTarget As String Application.ScreenUpdating = False For J = 1 To 999 sTarget = "Book" & Format(J, "000") & ".xls" Workbooks.Open sTarget 'Auto_Open runs here Workbooks(sTarget).Save Next J Application.ScreenUpdating = True End Sub
Cela ne fonctionnera pas, pour des raisons déjà expliquées. Une solution consiste simplement à déplacer le code Auto_Open commun dans une autre procédure, puis à l’appeler après avoir ouvert le classeur, comme indiqué ici:
Sub MyMacro() Dim J As Integer Dim sTarget As String Application.ScreenUpdating = False For J = 1 To 999 sTarget = "Book" & Format(J, "000") & ".xls" Workbooks.Open sTarget Workbooks(sTarget).Activate DoCommonCode Workbooks(sTarget).Save Next J Application.ScreenUpdating = True End Sub
Sub DoCommonCode() 'Common code goes here End Sub
Cette approche fonctionne correctement, à condition que la routine soit la même que celle qui sera exécutée sur tous vos différents classeurs. Si les routines sont différentes dans chaque classeur, vous pouvez forcer VBA à exécuter la macro Auto_Open. Cela se fait en utilisant la méthode RunAutoMacros juste après l’ouverture des classeurs:
Workbooks.Open sTarget ActiveWorkbook.RunAutoMacros xlAutoOpen
Compte tenu de cette approche, vous pouvez facilement proposer une macro qui ouvrirait simplement chaque classeur (afin que les macros Auto_Open puissent s’exécuter), puis les enregistrer. Une telle macro apparaîtrait comme suit:
Sub RunAutoOpenMacrosInBooks() Dim J As Integer Dim sTarget As String Application.ScreenUpdating = False For J = 1 To 999 sTarget = "Book" & Format(J, "000") & ".xls" On Error Resume Next Workbooks.Open sTarget Windows(sTarget).Activate With ActiveWorkbook If .Name <> ThisWorkbook.Name Then .RunAutoMacros xlAutoOpen .Save .Close End If End With Next i Application.ScreenUpdating = True End Sub
Une troisième approche, et même meilleure, consiste à ne pas compter sur les macros Auto_Open dans chacun de vos classeurs. Au lieu de cela, comptez sur l’événement Workbook_Open comme moyen d’exécuter votre macro. L’événement Workbook_Open est déclenché automatiquement, que le classeur soit ouvert manuellement ou dans une autre macro. Le code que l’événement contient est exécuté automatiquement, comme vous vous attendez d’une macro Auto_Open.
_Note: _
Si vous souhaitez savoir comment utiliser les macros décrites sur cette page (ou sur toute autre page des sites ExcelTips), j’ai préparé une page spéciale qui comprend des informations utiles.
lien: / excelribbon-ExcelTipsMacros [Cliquez ici pour ouvrir cette page spéciale dans un nouvel onglet de navigateur]
.
ExcelTips est votre source pour une formation Microsoft Excel rentable.
Cette astuce (1850) s’applique à Microsoft Excel 2007, 2010 et 2013. Vous pouvez trouver une version de cette astuce pour l’ancienne interface de menu d’Excel ici:
link: / excel-Running_a_Macro_in_a_Number_of_Workbooks [Exécution d’une macro dans un certain nombre de classeurs]
.