XL 2016 Exécution macro au démarrage d'un classeur

Yoyo01000

XLDnaute Occasionnel
Bonjour à tous, je m'en réfère à vos talents pour un problème que je n'arrive à résoudre :
J'aimerais, lorsque j'ouvre un classeur Excel, que la seconde feuille s'affiche avec l'exécution d'une macro étant liée à cette feuille.
J'ai 2 codes dans ce classeur :

le 1er dans [ThisWorbook] étant celui-ci :

Private Sub Workbook_Open()
Select Case MsgBox("Ne pas supprimer les cellules comportant des formules !", vbOKOnly + vbExclamation, "AVERTISSEMENT")
End Select
End Sub

le 2ème dans la feuille 2 :


Sub macro_formules()

Range("B3").Select
ActiveCell.FormulaR1C1 = "=IF(ISBLANK(RC[-1]),"""",R[-1]C+1)"
Range("B3").Resize(998).FillDown
Range("H2").Select
ActiveCell.FormulaR1C1 = "=IF(C6=""AC"",""2"","""")&IF(C6=""ICP"",""3"","""")&IF(C6=""P"",""2"","""")&IF(C6=""Q"",""2"","""")&IF(C6=""S"",""1"","""")&IF(C6=""TM"",""1"","""")"
Range("H2").Resize(999).FillDown
Range("E2").Select
ActiveCell.FormulaR1C1 = "=IF(RC[-1]>0,EDATE(RC[-1],1),"""")"
Range("E2").Resize(999).FillDown

End Sub

J'ai essayé plusieurs solutions mais le problème est que quand je ferme le classeur en étant sur la feuille 2 après enregistrement, j'ai un message d'erreur venant de VBA dès que je l'ouvre à nouveau.
 

cp4

XLDnaute Barbatruc
Bonjour,
Tu dois préciser sur quelle feuille le range se trouve.
Tu mets Range("B3").Select, le code sélectionne la cellule B3 mais de quelle feuille?
Soit tu mets le code name ex: Feuil1.Range("B3").Select
soit Sheets("MaFeuille").Range("B3").Select - MaFeuille est le nom de l'onglet.

nb: évite les select
il vaut mieux écrire:
Feuil1.Range("B3").FormulaR1C1 = "=IF(ISBLANK(RC[-1]),"""",R[-1]C+1)"

Bonne journée.
 

Yoyo01000

XLDnaute Occasionnel
Merci pour ta réponse et sur le conseil d'éviter les ''select" :)
Je viens de récrire mon code, en suivant tes conseils :

Sub macro_formules()
Feuil2.Range("B3").FormulaR1C1 = "=IF(ISBLANK(RC[-1]),"""",R[-1]C+1)"
Feuil2.Range("B3").Resize(998).FillDown
Feuil2.Range("H2").FormulaR1C1 = "=IF(C6=""AC"",""2"","""")&IF(C6=""ICP"",""3"","""")&IF(C6=""P"",""2"","""")&IF(C6=""Q"",""2"","""")&IF(C6=""S"",""1"","""")&IF(C6=""TM"",""1"","""")"
Feuil2.Range("H2").Resize(999).FillDown
Feuil2.Range("E2").FormulaR1C1 = "=IF(RC[-1]>0,EDATE(RC[-1],1),"""")"
Feuil2.Range("E2").Resize(999).FillDown
End Sub

Pour exécuter ce code au démarrage du classeur, voici ma macro dans ThisWorkBook :

Private Sub Workbook_Open()
Feuil2.Range("B3").FormulaR1C1 = "=IF(ISBLANK(RC[-1]),"""",R[-1]C+1)"
Feuil2.Range("B3").Resize(998).FillDown
Feuil2.Range("H2").FormulaR1C1 = "=IF(C6=""AC"",""2"","""")&IF(C6=""ICP"",""3"","""")&IF(C6=""P"",""2"","""")&IF(C6=""Q"",""2"","""")&IF(C6=""S"",""1"","""")&IF(C6=""TM"",""1"","""")"
Feuil2.Range("H2").Resize(999).FillDown
Feuil2.Range("E2").FormulaR1C1 = "=IF(RC[-1]>0,EDATE(RC[-1],1),"""")"
Feuil2.Range("E2").Resize(999).FillDown
End Sub

Tout fonctionne comme je le souhaitais, merci beaucoup :)
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Bonjour.
La place normale de cette procédure serait un module standard, non le module de l'objet Worksheet Feuil2 qui représente la deuxième feuille Excel. Cela ne se justifierait que si elle était uniquement appelée depuis une procédure évènement de cet objet. Et dans ce cas je mets d’habitude Me au lieu de son nom dans le code qui lui est intimement attaché.
 
Dernière édition:

Yoyo01000

XLDnaute Occasionnel
Comme cela ? :
upload_2018-12-21_16-34-4.png
 

Dranreb

XLDnaute Barbatruc
Si ce n'est n'est utilisé qu'à l'ouverture de classeur, oui, si c'est utilisé en plusieurs endroits mettez le seulement dans une Sub macro_formules() d'un module standard (de la rubrique Modules) et non d'un module objet (de n'importe quelle autre rubrique), et invoquez la simplement par son nom, à la rigueur avec Call devant, mais ça ne s'impose pas, partout où il faut.
 

cp4

XLDnaute Barbatruc
Bonsoir Dranreb;), Yoto;),

Dans le module ThisWorkbook met ce code
VB:
Private Sub Workbook_Open()
Select Case MsgBox("Ne pas supprimer les cellules comportant des formules !", vbOKOnly + vbExclamation, "AVERTISSEMENT")
End Select
Feuil2.Activate 'ici activation feuil2 (ici c'est le codeName qui est utilisé
End Sub
Ensuite, fais un clic-droit sur l'onglet de la feuil2, et tu colles ce code qui s’exécute à chaque activation de la feuille
VB:
Private Sub Worksheet_Activate()
Me.Range("B3").FormulaR1C1 = "=IF(ISBLANK(RC[-1]),"""",R[-1]C+1)"
Me.Range("B3").Resize(998).FillDown
Me.Range("H2").FormulaR1C1 = "=IF(C6=""AC"",""2"","""")&IF(C6=""ICP"",""3"","""")&IF(C6=""P"",""2"","""")&IF(C6=""Q"",""2"","""")&IF(C6=""S"",""1"","""")&IF(C6=""TM"",""1"","""")"
Me.Range("H2").Resize(999).FillDown
Me.Range("E2").FormulaR1C1 = "=IF(RC[-1]>0,EDATE(RC[-1],1),"""")"
Me.Range("E2").Resize(999).FillDown
End Sub
Bonne soirée:D
 

Discussions similaires

Réponses
11
Affichages
433
Réponses
7
Affichages
321

Statistiques des forums

Discussions
312 203
Messages
2 086 183
Membres
103 152
dernier inscrit
Karibu