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