Erreur de compilation lors de la suppression de contrôles
Résolu/Fermé
Ein85
Messages postés
32
Date d'inscription
jeudi 10 décembre 2015
Statut
Membre
Dernière intervention
2 mars 2016
-
17 déc. 2015 à 00:02
Ein85 Messages postés 32 Date d'inscription jeudi 10 décembre 2015 Statut Membre Dernière intervention 2 mars 2016 - 30 janv. 2016 à 11:38
Ein85 Messages postés 32 Date d'inscription jeudi 10 décembre 2015 Statut Membre Dernière intervention 2 mars 2016 - 30 janv. 2016 à 11:38
A voir également:
- Erreur de compilation lors de la suppression de contrôles
- Forcer la suppression d'un fichier - Guide
- Suppression compte instagram - Guide
- Erreur 1004 vba ✓ - Forum VB / VBA
- Iptv erreur de lecture - Forum Vidéo/TV
- Une erreur critique est survenue sur ce site. veuillez consulter la boite de réception de l’e-mail d’administration de votre site pour plus d’informations. ✓ - Forum Wordpress
4 réponses
cs_Le Pivert
Messages postés
7883
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
18 mars 2023
724
21 déc. 2015 à 17:53
21 déc. 2015 à 17:53
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!
f894009
Messages postés
16904
Date d'inscription
dimanche 25 novembre 2007
Statut
Membre
Dernière intervention
18 mars 2023
1 678
17 déc. 2015 à 08:06
17 déc. 2015 à 08:06
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...
Ein85
Messages postés
32
Date d'inscription
jeudi 10 décembre 2015
Statut
Membre
Dernière intervention
2 mars 2016
17 déc. 2015 à 12:50
17 déc. 2015 à 12:50
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
cs_Le Pivert
Messages postés
7883
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
18 mars 2023
724
19 déc. 2015 à 12:14
19 déc. 2015 à 12:14
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!
Ein85
Messages postés
32
Date d'inscription
jeudi 10 décembre 2015
Statut
Membre
Dernière intervention
2 mars 2016
19 déc. 2015 à 22:01
19 déc. 2015 à 22:01
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!
cs_Le Pivert
Messages postés
7883
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
18 mars 2023
724
20 déc. 2015 à 15:16
20 déc. 2015 à 15:16
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!
Ein85
Messages postés
32
Date d'inscription
jeudi 10 décembre 2015
Statut
Membre
Dernière intervention
2 mars 2016
21 déc. 2015 à 17:40
21 déc. 2015 à 17:40
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é?
30 janv. 2016 à 11:38