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.

Rechercher des sujets similaires à "erreur execution auto ouverture fichier"