Suppression d'une macro via une autre macro
Bonjour,
Je crains malheureusement devoir faire appel à nouveau à votre immense sagesse, afin de venir à bout d'une macro qui refuse obstinémant de faire ce que je souhaiterai
Je suis toujours sur mon classeur dont le fonctionnement est expliqué dans mon précédent poste "ListBox qui ne veux pas se remplir". Afin de faciliter l'usage de mon fichier, je souhaite créer une sorte de barre de contrôle sur l'onglet sommaire avec 4 boutons:
- le premier permet de créer un nouvel onglet (création de l'onglet, renommer l'onglet, création automatique du lien dans l'onglet sommaire et, le plus important, création automatique de la macro permettant au lien de fonctionner)
- le deuxième permet d'afficher plusieurs onglets en même temps.
- le troisième permet de supprimer un ou plusieurs onglets (suppression de l'onglet et, le plus important, suppression de la macro associé permettant le bon fonctionnement du lien du sommaire)
- le quatrième permet de modifier le nom d'un onglet (modification du nom de l'onglet, création du nouveau lien dans l'onglet sommaire et, le plus important, actualisation de la macro associé)
Les deux premier boutons fonctionne à ce jours
Le troisième fonctionne mais possède deux éléments à corriger et pour lesquels je fait appel à votre aide
le code actuelle est le suivant:
Private Sub CommandButton1_Click()
Dim i As Integer
Dim message As String
Dim Debut As Integer
Dim Lignes As Integer
Dim compteur As Integer
compteur = 0
For i = 0 To ListBox1.ListCount - 1
If ListBox1.Selected(i - compteur) = True Then
'supression de l'onglet
Worksheets(i - compteur + 2).Visible = True
Worksheets(i - compteur + 2).Activate
Worksheets(i - compteur + 2).Delete
'supression de la macro portant le nom de l'onglet
With ThisWorkbook.VBProject.VBComponents("Ouverture_onglet").CodeModule
Debut = .ProcStartLine(ListBox1.List(i - compteur), 0)
Lignes = .ProcCountLines(ListBox1.List(i - compteur), 0)
.DeleteLines Debut, Lignes
End With
compteur = compteur + 1
End If
Next i
message = "Veuillez supprimer manuellement du sommaire les raccourcis des onglets supprimés" & vbCrLf
message = message & "(cliquez sur les onglets avec la touche Ctrl enfoncée pour les sélectionner)"
MsgBox (message)
Worksheets(1).Activate
Cells(1, 1).Select
Unload UserForm2
End SubPremier élément: si la suppression d'un élément unique ne pose aucun problème, le programme plante lorsque plusieurs éléments sont sélectionnés pour suppression. Le premier onglet est supprimé, la macro associé au premier onglet est supprimé, le deuxième onglet est supprimé, la suppression de la macro associé au deuxième onglet fait planter le programme. Message d’erreur: "Erreur d'exécution '35': Sub ou fonction non définie"
J'ai beau regarder mon programme, je ne vois pas où se situe le problème
Deuxième élément: afin de sécuriser la suppression des onglets, j'affiche l'onglet en question avant de lancer sa surpression. Le message de confirmation que génère automatiquement excel pour confirmer la suppression apparaît donc sur l'onglet en question, permettant de vérifier que l'on ne s'est pas trompé d'onglet. Il est donc possible d'annuler la suppression en cas d'erreur. Malheureusement ce message de confirmation est extérieur à mon programme, l'annulation de la suppression entraîne donc la conservation de l'onglet mais n'arrête pas mon programme qui continue en supprimant la macro associé à mon onglet. Il s'agit d'un élément assez fâcheux que je n'arrive pas à contourner ...
En vous remerciant grandement pour votre aide
Bien cordialement
J'ai réussi à régler mon premier point.
J'avais simplement oublié d'actualiser ma ListeBox en supprimant l'item correspondant à l'onglet supprimé.
Le nouveau code est donc:
Private Sub CommandButton1_Click()
Dim i As Integer
Dim message As String
Dim Debut As Integer
Dim Lignes As Integer
Dim compteur As Integer
compteur = 0
For i = 0 To ListBox1.ListCount - 1
If ListBox1.Selected(i - compteur) = True Then
'supression de l'onglet
Worksheets(i - compteur + 2).Visible = True
Worksheets(i - compteur + 2).Activate
Worksheets(i - compteur + 2).Delete
'supression de la macro portant le nom de l'onglet
With ThisWorkbook.VBProject.VBComponents("Ouverture_onglet").CodeModule
Debut = .ProcStartLine(ListBox1.List(i - compteur), 0)
Lignes = .ProcCountLines(ListBox1.List(i - compteur), 0)
.DeleteLines Debut, Lignes
End With
ListBox1.RemoveItem (i - compteur)
compteur = compteur + 1
End If
Next i
message = "Veuillez supprimer manuellement du sommaire les raccourcis des onglets supprimés" & vbCrLf
message = message & "(cliquez sur les onglets avec la touche Ctrl enfoncée pour les sélectionner)"
MsgBox (message)
Worksheets(1).Activate
Cells(1, 1).Select
Unload UserForm2
End SubJe vous met en pièce jointe une version de mon fichier si cela peux vous aider.
En vous remerciant par avance pour l'aide que vous pourriez m'apporter
J'ai fini par régler mon deuxième point en vérifiant le nombre d'onglets avant et après la fonction supprimer.
Pour ceux qui seraient intéressé, le code finale est donc
Private Sub CommandButton1_Click()
UserForm2.Hide
'Supprimer les onglets sélectionnés
Dim i As Integer
Dim message As String
Dim Debut As Integer
Dim Lignes As Integer
Dim compteur As Integer
Dim verification As Integer
compteur = 0
For i = 0 To ListBox1.ListCount - 1
If ListBox1.Selected(i - compteur) = True Then 'supression de l'onglet
verification = ThisWorkbook.Worksheets.Count
Worksheets(i - compteur + 2).Visible = True
Worksheets(i - compteur + 2).Activate
Worksheets(i - compteur + 2).Delete
If ThisWorkbook.Worksheets.Count = verification Then 'supression de la macro après vérifiaction de la supression effective de l'onglet
ListBox1.Selected(i - compteur) = False
Else
With ThisWorkbook.VBProject.VBComponents("ouverture_onglet").CodeModule
Debut = .ProcStartLine(ListBox1.List(i - compteur), 0)
Lignes = .ProcCountLines(ListBox1.List(i - compteur), 0)
.DeleteLines Debut, Lignes
End With
ListBox1.RemoveItem (i - compteur)
compteur = compteur + 1
End If
End If
Next i
'Suppression du lien sur la page d'accueil
message = "Veuillez supprimer manuellement du sommaire les raccourcis des onglets supprimés" & vbCrLf
message = message & "(cliquez sur les onglets avec la touche Ctrl enfoncée pour les sélectionner)"
MsgBox (message)
'Terminer la macro
Worksheets(1).Activate
Cells(1, 1).Select
Unload UserForm2
End SubEn remerciant ceux qui on pu se pencher sur mes questions
Bien cordialement