Le script obtient une erreur lorsque VBE n'est pas ouvert

La procédure suivante est appelée lorsqu'un button est pressé. Il est censé append une nouvelle feuille de calcul et renommer (nom de code) l'object / module de la feuille de calcul. Cela doit être renommé car une autre procédure plus tard appenda du code au module de feuille de calcul.

Private Sub Add_OrderForms() Worksheets.Add After:=Sheets(1) ActiveSheet.Name = "Order Forms" ThisWorkbook.VBProject.VBComponents(Worksheets("Order Forms").CodeName).Name = "OrderForms" End Sub 

Cependant, si l'éditeur VB n'est pas ouvert, j'ai une erreur d'exécution 9: un sous-programme hors de scope. Je n'obtiens pas cette erreur lorsque j'ai l'éditeur ouvert. Mais le client n'aura pas l'éditeur ouvert. Devrais-je déclarer les variables en premier?

Je ne pense pas que vous pouvez modifier le projet lorsqu'il est verrouillé pour l'affichage. Lorsque le VBE est ouvert, vous l'avez débloqué manuellement et c'est pourquoi il fonctionne. Mais quand il est fermé, il est verrouillé à nouveau.

Vous pouvez supprimer la protection et fonctionneront comme écrit. Vous ne voulez probablement pas le faire, alors voici une alternative. Créez la feuille avec le nom de code souhaité et enregistrez-la. Ensuite, au lieu de créer une nouvelle feuille, copyz cette feuille dans votre classur. J'ai appelé mon classur avec la feuille de formulaire de command Book3.xlsx

 Public Sub Add_OrderForms() Dim wb As Workbook Set wb = Workbooks.Open(ThisWorkbook.Path & Application.PathSeparator & "Book3.xlsx") wb.Worksheets(1).Copy ThisWorkbook.Worksheets(1) wb.Close False End Sub 

Essaye ça:

 Private Sub Add_OrderForms() Debug.Print Activeworkbook.VBProject.Name Worksheets.Add After:=Sheets(1) ActiveSheet.Name = "Order Forms" ThisWorkbook.VBProject.VBComponents(Worksheets("Order Forms").CodeName).Name = "OrderForms" End Sub 

Je proposais ceci:

 Private Sub Add_OrderForms() Worksheets.Add After:=Sheets(1) ActiveSheet.Name = "Order Forms" DoEvents DoEvents ThisWorkbook.VBProject.VBComponents(Worksheets("Order Forms").CodeName).Name = "OrderForms" End Sub 

Si cela ne fonctionne toujours pas, je suggérerais application.ontime:

 Private Sub Add_OrderForms() Worksheets.Add After:=Sheets(1) ActiveSheet.Name = "Order Forms" Application.Ontime Now(), "UpdateOrderCodename" End Sub 

Dans un module normal:

 Public Sub UpdateOrderCodename() ThisWorkbook.VBProject.VBComponents(Worksheets("Order Forms").CodeName).Name = "OrderForms" End Sub 

Pour ce qu'il vaut, un raccourci bon marché est d'ouvrir le VBE via le code, puis le refermer à nouveau. Alors que l'user verra un flash rapide du VBE, il atteint toujours votre objective.

 Application.VBE.MainWindow.Visible = True ThisWorkbook.VBProject.VBComponents(Worksheets("Order Forms").CodeName).Name = "OrderForms" Application.VBE.MainWindow.Visible = False