Erreur execution auto ouverture fichier
Bonjour à tous,
J'ai écris une macro qui fonctionne très bien lorsqu'elle est dans un module et activé par un " bouton".
J'aimerai pourtant que cette macro s'exécute automatiquement à l'ouverture du fichier, mais quand je la sauvegarde dans "this Workbook" avec
Private Sub Workbook_Open ()
J'ai le message d'erreur suivant :
Run-Time Error '1004':
Select method of Worksheet class failed
Sur la ligne de code surligner ci dessous.
Est ce que quelqu'un pourrait m'aider ?
Merci
Sub Workbook_Open()
'
' Update BDD
'
' Update_Numbers Macro
'Set Variables
'Periode
Sheets("Data").Select
Range("R2").Select
Periode = ActiveCell
'Number of Areas
Range("R4").Select
Loop_Number = ActiveCell
'Macro File Name
Range("R3").Select
Macro_Name = ActiveCell
'Create Backup and Clear Old Data
Sheets("Backup").Select
Range("A6").Select
Range(Selection, Selection.End(xlToRight)).Select
Range(Selection, Selection.End(xlDown)).Select
Selection.ClearContents
Sheets("BDD").Select
Range("A6").Select
Range(Selection, Selection.End(xlToRight)).Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
Sheets("Backup").Select
Range("A6").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
Sheets("BDD").Select
Range("A7").Select
Range(Selection, Selection.End(xlToRight)).Select
Range(Selection, Selection.End(xlDown)).Select
Selection.ClearContents
'Update All Area Files with Loop Macro
x = 1
Do Until x > Loop_Number
Sheets("Data").Select
Range("N3").Select
ActiveCell.Offset(x, 0).Select
Shop_Name = ActiveCell
Application.Calculation = xlManual
'Open Area File
ChDir _
"Z:\SHOPS\5. SHOP PROFITABILITY\Driving Business\Quarterly forecast\2019\" & Periode
Workbooks.Open Filename:= _
"Z:\SHOPS\5. SHOP PROFITABILITY\Driving Business\Quarterly forecast\2019\" & Periode & "\" & Shop_Name, UpdateLinks:=0
'Get BDD from Shop File
ActiveWorkbook.Unprotect ("control")
Sheets("BDD").Visible = True
Sheets("BDD").Select
Range("A6").Select
Range(Selection, Selection.End(xlDown)).Select
Range(Selection, Selection.End(xlToRight)).Select
Selection.Copy
'Copy Data into BDD Upload tab in Macro File
Windows(Macro_Name).Activate
Sheets("BDD").Select
Range("A5").Select
Selection.End(xlDown).Select
ActiveCell.Offset(1, 0).Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
Range("A4").Select
Sheets("Data").Select
'Close Shop File
Windows(Shop_Name).Activate
ActiveWorkbook.Close savechanges:=0
Windows(Macro_Name).Activate
x = x + 1
Loop
'Finish Process
Windows(Macro_Name).Activate
Sheets("Summary").Select
Range("A1").Select
Application.Calculation = xlAutomatic
'Protect_Sheets Macro
Sheets("Summary").Select
ActiveSheet.Protect Password:="control", DrawingObjects:=True, Contents:=True, Scenarios:=True
ActiveWindow.DisplayWorkbookTabs = False
Sheets("Control").Select
ActiveSheet.Protect Password:="control", DrawingObjects:=True, Contents:=True, Scenarios:=True
Sheets("Summary").Select
Range("A9").Select
ActiveWindow.DisplayWorkbookTabs = False
End Sub
Bonjour,
Sans chercher à parler tout de suite de ta problématique, je te propose une révision de ton code (à tester, j'ai fait ça vite fait) pour supprimer au maximum ces instructions "Select" et "Activate" qui gangrènent ton code ! Ces instructions sont inutiles, alourdissent le code et ralentissent l'exécution des macros...
Sub MaMacro()
Application.Calculation = xlCalculationManual
'Set Variables
Dim Periode As Variant, Loop_Number As Integer, Macro_Name As String, x As Long, WB As Workbook
With Sheets("Data")
Periode = Sheets("Data").Range("R2") 'Periode
Loop_Number = Sheets("Data").Range("R4") 'Number of Areas
Macro_Name = Sheets("Data").Range("R3") 'Macro File Name
End With
'Create Backup and Clear Old Data
Sheets("Backup").Cells.ClearContents
Sheets("BDD").Range("A1").CurrentRegion.Copy
Sheets("Backup").Range("A6").PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
Sheets("BDD").Cells.ClearContents
'Update All Area Files with Loop Macro
For x = 1 To Loop_Number
Shop_Name = Sheets("Data").Range("N" & x + 3)
'Open Area File
Set WB = Workbooks.Open(Filename:="Z:\SHOPS\5. SHOP PROFITABILITY\Driving Business\Quarterly forecast\2019\" & Periode & "\" & Shop_Name, UpdateLinks:=0)
With WB
.Unprotect ("control")
.Sheets("BDD").Visible = True
.Sheets("BDD").Cells.Copy
Workbooks(Macro_Name).Sheets("BDD").Range("A" & Rows.Count).End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
.Close savechanges:=0
End With
Next
'Finish Process
Windows(Macro_Name).Activate
'Protect_Sheets Macro
Sheets("Summary").Protect Password:="control"
ActiveWindow.DisplayWorkbookTabs = False
Sheets("Control").Protect Password:="control"
ActiveWindow.DisplayWorkbookTabs = False
Application.Calculation = xlCalculationAutomatic
End Sub
Hello Pedro,
Du coup j'ai modifié un peu le code que tu m'as envoyé car cela ne correspondait pas tout à fait à ma demande.
Mais la manière dont tu l'as écris permet de l'ouvrir en exécution auto sans problème.
Merci beaucoup.
Je commence tout juste avec VBA donc si jamais tu sais pourquoi cela fonctionne avec l'un et pas l'autre ça serait top.
Sub Workbook_Open()
Application.Calculation = xlCalculationManual
'Set Variables
Dim Periode As Variant, Loop_Number As Integer, Macro_Name As String, x As Long, WB As Workbook
With Sheets("Data")
Periode = Sheets("Data").Range("R2") 'Periode
Loop_Number = Sheets("Data").Range("R4") 'Number of Areas
Macro_Name = Sheets("Data").Range("R3") 'Macro File Name
End With
'Create Backup and Clear Old Data
Sheets("Backup").Select
Range("A6").Select
Range(Selection, Selection.End(xlToRight)).Select
Range(Selection, Selection.End(xlDown)).Select
Selection.ClearContents
Sheets("BDD").Select
Range("A6").Select
Range(Selection, Selection.End(xlToRight)).Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
Sheets("Backup").Select
Range("A6").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
Sheets("BDD").Select
Range("A7").Select
Range(Selection, Selection.End(xlToRight)).Select
Range(Selection, Selection.End(xlDown)).Select
Selection.ClearContents
'Update All Area Files with Loop Macro
For x = 1 To Loop_Number
Shop_Name = Sheets("Data").Range("N" & x + 3)
'Open Area File
Set WB = Workbooks.Open(Filename:="Z:\SHOPS\5. SHOP PROFITABILITY\Driving Business\Quarterly forecast\2019\" & Periode & "\" & Shop_Name, UpdateLinks:=0)
With WB
.Unprotect ("control")
.Sheets("BDD").Visible = True
.Sheets("BDD").Select
Range("A6").Select
Range(Selection, Selection.End(xlToRight)).Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
Workbooks(Macro_Name).Sheets("BDD").Range("A5").End(xlDown).Offset(1, 0).PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
.Close savechanges:=0
Range("A4").Select
End With
Next
'Finish Process
Windows(Macro_Name).Activate
'Protect_Sheets Macro
ActiveWindow.DisplayWorkbookTabs = False
Sheets("Control").Protect Password:="control"
ActiveWindow.DisplayWorkbookTabs = False
Sheets("Summary").Protect Password:="control"
Sheets("Summary").Select
Application.Calculation = xlCalculationAutomatic
End Sub
Déjà, les instructions "Select" imitent ce qu'un utilisateur ferait, à savoir sélectionner une cellule pour en modifier ou utiliser la valeur, alors qu'il suffit juste d'y faire référence pour que le code fonctionne (VBA n'a pas besoin de "voir" ni "toucher" les objets pour travailler avec).
Aussi, les procédures événement (telle que Workbook_Open) s’exécutent sur des actions précises dans le classeur dans lequel se trouve le code. Alors si tu commences à ouvrir et sélectionner des données sur d'autres classeur, je crois que ce n'est vraiment pas l'endroit adapté...
Il serait plus judicieux de faire une macro "classique" dans un module standard, et éventuellement de l'appeler à l'ouverture :
Sub Workbook_Open()
Call MaMacro
End Sub
J'ai compris
Merci beaucoup pour ton aide et ton temps.