Erreur de compilation lors de la suppression de contrôles
Résolu
Ein85
Messages postés
32
Statut
Membre
-
Ein85 Messages postés 32 Statut Membre -
Ein85 Messages postés 32 Statut Membre -
Bonjour à tous,
J'ai créé un programme qui permet d'ajouter dynamiquement un label dans lequel se trouve une textbox et un bouton "Delete". Il y a aussi un bouton "Add" qui permet de dupliquer ce trio label-textbox-bouton à volonté pour l'utilisateur. Bien évidemment, le bouton "Delete" permet de supprimer le label auquel il est associé ainsi que la textbox et lui même.
En parallèle j'ai aussi créé un bouton "Reset" qui supprime tous les trios créés par l'utilisateur. Le hic c'est que celui-ci ne fonctionne plus dès qu'il y a trois lots et Excel renvoie l'erreur de compilation suivante: "Seuls des commentaires peuvent apparaitre après End Sub, End Fonction, ou End Property". Le problème c'est que tout semble ok et d'ailleurs si je re-clique sur "Reset", le 3ème lot restant est supprimé sans problème.
Quelqu'un pourrait-il m'aider svp?
Je vous aurais bien mis en PJ mon fichier mais je n'ai pas l'impression que c'est faisable.
Il faut créer dans la première feuille un bouton "Validate", un bouton "Reset", une textbox nommée "FrmCounter" (valeur d'origine = 1), une autre "FrmIndex (valeur =1) et une troisième "LeftCounter".
Voici le code (désolé, il est un peu lourd malgré mes simplifications):
'Dans Feuil1:
Option Explicit
Private Sub Validate_Click()
Call FrmCreation
Call AddButtonFrm
End Sub
Sub Reset_Click()
Dim Ctrl As OLEObject
Dim MyVar, MySheet, DeleteAddMacro As String
'Macro pour enlever tous les contrôles ajoutés dynamiquement
MySheet = ActiveSheet.Name
For Each Ctrl In ActiveSheet.OLEObjects 'Loop sur chaque contrôle
If TypeOf Ctrl.Object Is MSForms.CommandButton Then
If Ctrl.Object.Caption = "Delete" Then 'Si c'est un bouton Delete, on appelle sa sub qui se charge de la suppression
MyVar = Ctrl.Name
Application.Run (MySheet & "." & MyVar & "_Click")
ElseIf Ctrl.Object.Caption = "Add" Then 'Si c'est un bouton Add, on le supprime directement ainsi que son code
MyVar = Ctrl.Name & "_Click"
With ThisWorkbook.VBProject.VBComponents(ActiveSheet.Name).CodeModule
.DeleteLines .ProcStartLine(MyVar, 0), .ProcCountLines(MyVar, 0) 'Suppression du code du bouton Add
End With
ActiveSheet.Shapes(Ctrl.Name).Delete
End If
End If
Next Ctrl
End Sub
'Code du Module1
Option Explicit
Public Sub AddButtonFrm()
'Crée le bouton "Add"
Dim Obj As OLEObject
Dim MacroAdd As String
Dim X As Integer
'Ajoute le bouton dans la feuille
Set Obj = Worksheets(1).OLEObjects.Add(ClassType:="Forms.CommandButton.1", Left:=67, Top:=400, Width:=50, Height:=30)
With Obj
.Name = "FrmAdd"
.Object.Caption = "Add"
End With
'Ajoute le code associé au bouton:
MacroAdd = "Sub FrmAdd_Click()" & vbCrLf
MacroAdd = MacroAdd & "Call FrmCreation" & vbCrLf
MacroAdd = MacroAdd & "End Sub" & vbCrLf
With ThisWorkbook.VBProject.VBComponents(ActiveSheet.Name).CodeModule
X = .CountOfLines + 1
.InsertLines X, MacroAdd
End With
End Sub
Sub FrmCreation()
Dim Lab, Del, TxtBody As Object
Dim DeleteMacro As String
Dim X, LabelCounter, LabelIndex As Integer
'Macro généréé lorsqu'on clique sur le bouton "Add"
LabelCounter = ActiveSheet.FrmCounter.Value 'Compteur utilisé pour connaître le nombre de labels créés
LabelIndex = ActiveSheet.FrmIndex.Value 'Compteur utilisé pour donner un nom au nouveaux objets créés (labels et objets à l'intérieur)
'-----------------------------------------------
'Crée FRM LABEL:
Set Lab = Worksheets(1).OLEObjects.Add(ClassType:="Forms.Label.1", Left:=(LabelCounter - 1) * 300 + 47 + 10 * LabelCounter, Top:=250, Width:=300, Height:=130) 'Crée un Label
With Lab
.Name = "Frm" & LabelIndex & ""
With .Object
.Caption = " Frm " & LabelIndex & ""
.BackStyle = 0
.BorderStyle = 1
End With
End With
'-----------------------------------------------
'Crée TEXTBOX:
Set TxtBody = ActiveSheet.OLEObjects.Add(ClassType:="Forms.TextBox.1", Left:=(LabelCounter - 1) * 300 + 57 + 10 * LabelCounter, Top:=265, Width:=240, Height:=60)
With TxtBody
.Name = "Frm" & LabelIndex & "TxtBody"
End With
'-----------------------------------------------
'Crée bouton "DELETE":
Set Del = ActiveSheet.OLEObjects.Add(ClassType:="Forms.CommandButton.1", _
Link:=False, DisplayAsIcon:=False, Left:=(LabelCounter - 1) * 300 + 57 + 10 * LabelCounter, Top:=340, Width:=50, Height:=30)
With Del
.Name = "Frm" & LabelIndex & "Delete"
With .Object
.Caption = "Delete"
End With
End With
'Insert le code du bouton Delete (cliqué sur celui-ci supprimera le label et les contrôles à l'intérieur
DeleteMacro = "Sub Frm" & LabelIndex & "Delete_Click()" & vbCrLf
DeleteMacro = DeleteMacro & "ActiveSheet.LeftCounter.Value =ActiveSheet.Frm" & LabelIndex & ".Left" & vbCrLf
DeleteMacro = DeleteMacro & "ActiveSheet.Shapes(""Frm" & LabelIndex & "TxtBody"").Delete" & vbCrLf
DeleteMacro = DeleteMacro & "ActiveSheet.Shapes(""Frm" & LabelIndex & "Delete"").Delete" & vbCrLf
DeleteMacro = DeleteMacro & "ActiveSheet.Shapes(""Frm" & LabelIndex & """).Delete" & vbCrLf
DeleteMacro = DeleteMacro & "With ThisWorkbook.VBProject.VBComponents(ActiveSheet.Name).CodeModule" & vbCrLf
DeleteMacro = DeleteMacro & " .DeleteLines .ProcStartLine(""Frm" & LabelIndex & "Delete_Click"", 0), .ProcCountLines(""Frm" & LabelIndex & "Delete_Click"", 0)" & vbCrLf 'Supprime le code du bouton Delete
DeleteMacro = DeleteMacro & "End With" & vbCrLf
DeleteMacro = DeleteMacro & "Call ShiftControls" & vbCrLf
DeleteMacro = DeleteMacro & "ActiveSheet.FrmCounter.Value = ActiveSheet.FrmCounter.Value - 1" & vbCrLf
DeleteMacro = DeleteMacro & "End Sub" & vbCrLf
With ThisWorkbook.VBProject.VBComponents(ActiveSheet.Name).CodeModule
X = 0 'Reset X sur 0
X = .CountOfLines + 1
.InsertLines X, DeleteMacro
End With
ActiveSheet.FrmCounter.Value = LabelCounter + 1
ActiveSheet.FrmIndex.Value = LabelIndex + 1
End Sub
'Code du Module2
Option Explicit
Sub ShiftControls()
Dim Ctrl As OLEObject
'Macro servant à déplacer les labels et leurs contrôles si un label situé à gauche est supprimé
'Loop sur chaque contrôle
For Each Ctrl In ActiveSheet.OLEObjects
'Se focalise sur les contrôles dont la propriété Top est comprise entre 200 et 380
If Ctrl.Top >= 200 And Ctrl.Top <= 380 And Ctrl.Left > ActiveSheet.LeftCounter.Value Then
'Déplace le contrôle de 310 vers la gauche
Ctrl.Left = Ctrl.Left - 310
End If
Next Ctrl
End Sub
J'ai créé un programme qui permet d'ajouter dynamiquement un label dans lequel se trouve une textbox et un bouton "Delete". Il y a aussi un bouton "Add" qui permet de dupliquer ce trio label-textbox-bouton à volonté pour l'utilisateur. Bien évidemment, le bouton "Delete" permet de supprimer le label auquel il est associé ainsi que la textbox et lui même.
En parallèle j'ai aussi créé un bouton "Reset" qui supprime tous les trios créés par l'utilisateur. Le hic c'est que celui-ci ne fonctionne plus dès qu'il y a trois lots et Excel renvoie l'erreur de compilation suivante: "Seuls des commentaires peuvent apparaitre après End Sub, End Fonction, ou End Property". Le problème c'est que tout semble ok et d'ailleurs si je re-clique sur "Reset", le 3ème lot restant est supprimé sans problème.
Quelqu'un pourrait-il m'aider svp?
Je vous aurais bien mis en PJ mon fichier mais je n'ai pas l'impression que c'est faisable.
Il faut créer dans la première feuille un bouton "Validate", un bouton "Reset", une textbox nommée "FrmCounter" (valeur d'origine = 1), une autre "FrmIndex (valeur =1) et une troisième "LeftCounter".
Voici le code (désolé, il est un peu lourd malgré mes simplifications):
'Dans Feuil1:
Option Explicit
Private Sub Validate_Click()
Call FrmCreation
Call AddButtonFrm
End Sub
Sub Reset_Click()
Dim Ctrl As OLEObject
Dim MyVar, MySheet, DeleteAddMacro As String
'Macro pour enlever tous les contrôles ajoutés dynamiquement
MySheet = ActiveSheet.Name
For Each Ctrl In ActiveSheet.OLEObjects 'Loop sur chaque contrôle
If TypeOf Ctrl.Object Is MSForms.CommandButton Then
If Ctrl.Object.Caption = "Delete" Then 'Si c'est un bouton Delete, on appelle sa sub qui se charge de la suppression
MyVar = Ctrl.Name
Application.Run (MySheet & "." & MyVar & "_Click")
ElseIf Ctrl.Object.Caption = "Add" Then 'Si c'est un bouton Add, on le supprime directement ainsi que son code
MyVar = Ctrl.Name & "_Click"
With ThisWorkbook.VBProject.VBComponents(ActiveSheet.Name).CodeModule
.DeleteLines .ProcStartLine(MyVar, 0), .ProcCountLines(MyVar, 0) 'Suppression du code du bouton Add
End With
ActiveSheet.Shapes(Ctrl.Name).Delete
End If
End If
Next Ctrl
End Sub
'Code du Module1
Option Explicit
Public Sub AddButtonFrm()
'Crée le bouton "Add"
Dim Obj As OLEObject
Dim MacroAdd As String
Dim X As Integer
'Ajoute le bouton dans la feuille
Set Obj = Worksheets(1).OLEObjects.Add(ClassType:="Forms.CommandButton.1", Left:=67, Top:=400, Width:=50, Height:=30)
With Obj
.Name = "FrmAdd"
.Object.Caption = "Add"
End With
'Ajoute le code associé au bouton:
MacroAdd = "Sub FrmAdd_Click()" & vbCrLf
MacroAdd = MacroAdd & "Call FrmCreation" & vbCrLf
MacroAdd = MacroAdd & "End Sub" & vbCrLf
With ThisWorkbook.VBProject.VBComponents(ActiveSheet.Name).CodeModule
X = .CountOfLines + 1
.InsertLines X, MacroAdd
End With
End Sub
Sub FrmCreation()
Dim Lab, Del, TxtBody As Object
Dim DeleteMacro As String
Dim X, LabelCounter, LabelIndex As Integer
'Macro généréé lorsqu'on clique sur le bouton "Add"
LabelCounter = ActiveSheet.FrmCounter.Value 'Compteur utilisé pour connaître le nombre de labels créés
LabelIndex = ActiveSheet.FrmIndex.Value 'Compteur utilisé pour donner un nom au nouveaux objets créés (labels et objets à l'intérieur)
'-----------------------------------------------
'Crée FRM LABEL:
Set Lab = Worksheets(1).OLEObjects.Add(ClassType:="Forms.Label.1", Left:=(LabelCounter - 1) * 300 + 47 + 10 * LabelCounter, Top:=250, Width:=300, Height:=130) 'Crée un Label
With Lab
.Name = "Frm" & LabelIndex & ""
With .Object
.Caption = " Frm " & LabelIndex & ""
.BackStyle = 0
.BorderStyle = 1
End With
End With
'-----------------------------------------------
'Crée TEXTBOX:
Set TxtBody = ActiveSheet.OLEObjects.Add(ClassType:="Forms.TextBox.1", Left:=(LabelCounter - 1) * 300 + 57 + 10 * LabelCounter, Top:=265, Width:=240, Height:=60)
With TxtBody
.Name = "Frm" & LabelIndex & "TxtBody"
End With
'-----------------------------------------------
'Crée bouton "DELETE":
Set Del = ActiveSheet.OLEObjects.Add(ClassType:="Forms.CommandButton.1", _
Link:=False, DisplayAsIcon:=False, Left:=(LabelCounter - 1) * 300 + 57 + 10 * LabelCounter, Top:=340, Width:=50, Height:=30)
With Del
.Name = "Frm" & LabelIndex & "Delete"
With .Object
.Caption = "Delete"
End With
End With
'Insert le code du bouton Delete (cliqué sur celui-ci supprimera le label et les contrôles à l'intérieur
DeleteMacro = "Sub Frm" & LabelIndex & "Delete_Click()" & vbCrLf
DeleteMacro = DeleteMacro & "ActiveSheet.LeftCounter.Value =ActiveSheet.Frm" & LabelIndex & ".Left" & vbCrLf
DeleteMacro = DeleteMacro & "ActiveSheet.Shapes(""Frm" & LabelIndex & "TxtBody"").Delete" & vbCrLf
DeleteMacro = DeleteMacro & "ActiveSheet.Shapes(""Frm" & LabelIndex & "Delete"").Delete" & vbCrLf
DeleteMacro = DeleteMacro & "ActiveSheet.Shapes(""Frm" & LabelIndex & """).Delete" & vbCrLf
DeleteMacro = DeleteMacro & "With ThisWorkbook.VBProject.VBComponents(ActiveSheet.Name).CodeModule" & vbCrLf
DeleteMacro = DeleteMacro & " .DeleteLines .ProcStartLine(""Frm" & LabelIndex & "Delete_Click"", 0), .ProcCountLines(""Frm" & LabelIndex & "Delete_Click"", 0)" & vbCrLf 'Supprime le code du bouton Delete
DeleteMacro = DeleteMacro & "End With" & vbCrLf
DeleteMacro = DeleteMacro & "Call ShiftControls" & vbCrLf
DeleteMacro = DeleteMacro & "ActiveSheet.FrmCounter.Value = ActiveSheet.FrmCounter.Value - 1" & vbCrLf
DeleteMacro = DeleteMacro & "End Sub" & vbCrLf
With ThisWorkbook.VBProject.VBComponents(ActiveSheet.Name).CodeModule
X = 0 'Reset X sur 0
X = .CountOfLines + 1
.InsertLines X, DeleteMacro
End With
ActiveSheet.FrmCounter.Value = LabelCounter + 1
ActiveSheet.FrmIndex.Value = LabelIndex + 1
End Sub
'Code du Module2
Option Explicit
Sub ShiftControls()
Dim Ctrl As OLEObject
'Macro servant à déplacer les labels et leurs contrôles si un label situé à gauche est supprimé
'Loop sur chaque contrôle
For Each Ctrl In ActiveSheet.OLEObjects
'Se focalise sur les contrôles dont la propriété Top est comprise entre 200 et 380
If Ctrl.Top >= 200 And Ctrl.Top <= 380 And Ctrl.Left > ActiveSheet.LeftCounter.Value Then
'Déplace le contrôle de 310 vers la gauche
Ctrl.Left = Ctrl.Left - 310
End If
Next Ctrl
End Sub
A voir également:
- Erreur de compilation lors de la suppression de contrôles
- Forcer la suppression d'un fichier - Guide
- Suppression compte gmail - Guide
- Erreur lors de l'envoi de la requête facebook - Forum Facebook
- Une erreur s’est produite une erreur s’est produite et il est impossible de charger la page. ✓ - Forum Instagram
- Play store erreur de serveur ✓ - Forum Free mobile
4 réponses
C'est exact, c'est assez aléatoire; J'attendais ta réponse. J'ai trouvé une solution radicale:
Supprimer le code de toute la feuille car c'est la suppression des codes qui bloque. Dans la foulée réinjecter le code des 2 boutons avec mise à zero des compteurs comme ceci:
inserer un module avec ce code:
et dans la feuille active ceci:
Normalement j'ai testé, il n'y a pas de problème!
Supprimer le code de toute la feuille car c'est la suppression des codes qui bloque. Dans la foulée réinjecter le code des 2 boutons avec mise à zero des compteurs comme ceci:
inserer un module avec ce code:
Option Explicit
Sub EffaceShapesSaufBoutons()
Dim Obj As OLEObject
Dim MacroAdd As String
Dim X As Integer
Dim i
For Each i In ActiveSheet.Shapes
If i.Name = "Validate" Or i.Name = "FrmCounter" Or i.Name = "FrmIndex" Or i.Name = "LeftCounter" Or i.Name = "Reset" Then
'on ne supprime pas ces shapes
Else
'supprime tout le code de la feuille active
With ActiveWorkbook.VBProject.VBComponents(ActiveWorkbook.Sheets(ActiveSheet.Name).CodeName).CodeModule
.DeleteLines 1, .CountOfLines
.CodePane.Window.Close
End With
ActiveSheet.Shapes(i.Name).Delete 'supprime les shapes
End If
Next i
'dans la feuille active
'Ajoute le code associé au bouton:validate
MacroAdd = "Private Sub Validate_Click()" & vbCrLf
MacroAdd = MacroAdd & "FrmCounter = 1" & vbCrLf
MacroAdd = MacroAdd & "FrmIndex = 1" & vbCrLf
MacroAdd = MacroAdd & "Call AddButtonFrm" & vbCrLf
MacroAdd = MacroAdd & "Call FrmCreation" & vbCrLf
MacroAdd = MacroAdd & "Validate.Enabled = False" & vbCrLf
MacroAdd = MacroAdd & "Reset.Enabled = True " & vbCrLf
MacroAdd = MacroAdd & "End Sub" & vbCrLf
With ThisWorkbook.VBProject.VBComponents(ActiveSheet.Name).CodeModule
X = .CountOfLines + 1
.InsertLines X, MacroAdd
End With
'Ajoute le code associé au bouton:reset
MacroAdd = "Private Sub Reset_Click()" & vbCrLf
MacroAdd = MacroAdd & "EffaceShapesSaufBoutons" & vbCrLf
MacroAdd = MacroAdd & "Validate.Enabled = True" & vbCrLf
MacroAdd = MacroAdd & "Reset.Enabled = False" & vbCrLf
MacroAdd = MacroAdd & "End Sub" & vbCrLf
With ThisWorkbook.VBProject.VBComponents(ActiveSheet.Name).CodeModule
X = .CountOfLines + 1
.InsertLines X, MacroAdd
End With
End Sub
et dans la feuille active ceci:
Private Sub Validate_Click() FrmCounter = 1 FrmIndex = 1 Call AddButtonFrm Call FrmCreation Validate.Enabled = False Reset.Enabled = True End Sub Private Sub Reset_Click() EffaceShapesSaufBoutons Validate.Enabled = True Reset.Enabled = False End Sub
Normalement j'ai testé, il n'y a pas de problème!
Ein85
Messages postés
32
Statut
Membre
Désolé pour cette réponse tardive mais merci beaucoup pour ton aide, ça m'a été et me sera très utile.
Bonjour,
mais je n'ai pas l'impression que c'est faisable. Ah que si!!!!
Pour transmettre un fichier,
il faut passer par un site de pièce jointe tel que cjoint.com
Allez sur ce site : https://www.cjoint.com/
Clic sur parcourir,
Cherche ton fichier,
clic sur ouvrir,
Clic sur "Créer le lien cjoint",
Copier le lien,
Revenir ici le coller dans une réponse...
mais je n'ai pas l'impression que c'est faisable. Ah que si!!!!
Pour transmettre un fichier,
il faut passer par un site de pièce jointe tel que cjoint.com
Allez sur ce site : https://www.cjoint.com/
Clic sur parcourir,
Cherche ton fichier,
clic sur ouvrir,
Clic sur "Créer le lien cjoint",
Copier le lien,
Revenir ici le coller dans une réponse...
Bonjour,
Je ne connaissais pas cette astuce. J'ai fait comme indiqué et l'on peut désormais trouver le fichier Excel à cette adresse: http://www.cjoint.com/c/ELrlRYVrkdm
Pour comprendre le problème, on peut procéder de la manière suivante:
- Cliquer sur Validate pour faire apparaître un label puis cliquer sur le bouton Add pour en faire apparaître un 2ème.
- Cliquer ensuite sur Reset pour supprimer le tout => Dans ce cas ça fonctionne
- Recommencer mais en créant cette fois-ci 3 labels => Dans ce cas on obtient l'erreur mentionnée.
Merci d'avance
Je ne connaissais pas cette astuce. J'ai fait comme indiqué et l'on peut désormais trouver le fichier Excel à cette adresse: http://www.cjoint.com/c/ELrlRYVrkdm
Pour comprendre le problème, on peut procéder de la manière suivante:
- Cliquer sur Validate pour faire apparaître un label puis cliquer sur le bouton Add pour en faire apparaître un 2ème.
- Cliquer ensuite sur Reset pour supprimer le tout => Dans ce cas ça fonctionne
- Recommencer mais en créant cette fois-ci 3 labels => Dans ce cas on obtient l'erreur mentionnée.
Merci d'avance
Bonjour,
Une solution pour ne pas avoir de bug, il faut supprimer à chaque action sur le bouton un trio à la fois et le bouton Add à la fin comme ceci :
j'ai mis
Une solution pour ne pas avoir de bug, il faut supprimer à chaque action sur le bouton un trio à la fois et le bouton Add à la fin comme ceci :
Option Explicit
Private Sub Validate_Click()
Call AddButtonFrm
Call FrmCreation
Validate.Enabled = False
End Sub
Sub Reset_Click()
Dim Ctrl As OLEObject
Dim MyVar, MySheet As String
'Macro pour enlever tous les contrôles ajoutés dynamiquement
MySheet = ActiveSheet.Name
For Each Ctrl In ActiveSheet.OLEObjects 'Loop sur chaque contrôle
If TypeOf Ctrl.Object Is MSForms.CommandButton Then
If Ctrl.Object.Caption = "Delete" Then 'Si c'est un bouton Delete, on appelle sa sub qui se charge de la suppression
MyVar = Ctrl.Name
Application.Run (MySheet & "." & MyVar & "_Click")
Exit Sub
End If
End If
Next Ctrl
With ThisWorkbook.VBProject.VBComponents(ActiveSheet.Name).CodeModule
.DeleteLines .ProcStartLine("FrmAdd_Click", 0), .ProcCountLines("FrmAdd_Click", 0) 'Suppression du code du bouton Add
End With
ActiveSheet.Shapes("FrmAdd").Delete
Validate.Enabled = True
End Sub
j'ai mis
Validate.Enabled = Falsepour ne pas avoir 2 boutons Add qui occasionneraient un bug aussi!
Bonjour,
Merci pour ta réponse mais le but du bouton Reset est de tout supprimer d'un coup. Si l'utilisateur souhaite simplement supprimer les lots individuellement, il clique sur Delete. Dans le cas que tu proposes, il n'y a plus vraiment de différence entre Reset et Delete si ce n'est qu'avec Delete tu choisis précisément le lot à supprimer, ce qui n'est pas le cas de Reset. Est-il possible d'arriver au résultat voulu, à savoir la suppression générale?
Merci d'avance!
Merci pour ta réponse mais le but du bouton Reset est de tout supprimer d'un coup. Si l'utilisateur souhaite simplement supprimer les lots individuellement, il clique sur Delete. Dans le cas que tu proposes, il n'y a plus vraiment de différence entre Reset et Delete si ce n'est qu'avec Delete tu choisis précisément le lot à supprimer, ce qui n'est pas le cas de Reset. Est-il possible d'arriver au résultat voulu, à savoir la suppression générale?
Merci d'avance!
J'ai réussi, mais ce n'est pas évident. J'ai fait une Sub de réinitialisation. Ensuite je l'ai appelé avec une boucle, comme ceci:
C'est la seule façon pour éviter un bug!
Option Explicit
Private Sub Validate_Click()
Call AddButtonFrm
Call FrmCreation
Validate.Enabled = False 'inactif
Reset.Enabled = True 'actif
End Sub
Sub Reset_Click()
Dim nombre, i As Integer
nombre = ActiveSheet.Shapes.Count 'nombre de shapes
nombre = nombre - 6 'on enleve les shapes qui doivent rester
On Error Resume Next 'pour éviter le bug
For i = nombre To 1 Step -3 'on demarre à l'envers toutes les 3 shapes, il y a 3 shapes par trio
Reinitialise 'on lance le reset
Next i
End Sub
Sub Reinitialise()
Dim Ctrl As OLEObject
Dim MyVar, MySheet As String
'Macro pour enlever tous les contrôles ajoutés dynamiquement
MySheet = ActiveSheet.Name
For Each Ctrl In ActiveSheet.OLEObjects 'Loop sur chaque contrôle
If TypeOf Ctrl.Object Is MSForms.CommandButton Then
If Ctrl.Object.Caption = "Delete" Then 'Si c'est un bouton Delete, on appelle sa sub qui se charge de la suppression
MyVar = Ctrl.Name
Application.Run (MySheet & "." & MyVar & "_Click")
End If
End If
Next Ctrl
With ThisWorkbook.VBProject.VBComponents(ActiveSheet.Name).CodeModule
.DeleteLines .ProcStartLine("FrmAdd_Click", 0), .ProcCountLines("FrmAdd_Click", 0) 'Suppression du code du bouton Add
End With
ActiveSheet.Shapes("FrmAdd").Delete
Validate.Enabled = True 'actif
Reset.Enabled = False 'inactif
End Sub
C'est la seule façon pour éviter un bug!
La solution semble prometteuse mais c'est sans compter sur Excel qui veut n'en faire qu'à sa tête.
J'ai testé ton code et j'ai des résultats qui varient selon que je cherche à supprimer un lot, deux lots ou trois lots.
Si je n'en supprime qu'un, ça marche très bien.
Si j'en supprime deux, j'ai une erreur de compilation pour la suppression du 2ème lot (End Sub attendu alors qu'il est bien là).
Et enfin, si je veux en supprimer trois, là Excel plante carrément. As-tu rencontré ces problèmes de ton côté?
J'ai testé ton code et j'ai des résultats qui varient selon que je cherche à supprimer un lot, deux lots ou trois lots.
Si je n'en supprime qu'un, ça marche très bien.
Si j'en supprime deux, j'ai une erreur de compilation pour la suppression du 2ème lot (End Sub attendu alors qu'il est bien là).
Et enfin, si je veux en supprimer trois, là Excel plante carrément. As-tu rencontré ces problèmes de ton côté?