Bouton inséré dans le frame d'une feuille Excel ne réagit pas

Résolu/Fermé
Ein85 Messages postés 32 Date d'inscription jeudi 10 décembre 2015 Statut Membre Dernière intervention 2 mars 2016 - 12 déc. 2015 à 14:08
Ein85 Messages postés 32 Date d'inscription jeudi 10 décembre 2015 Statut Membre Dernière intervention 2 mars 2016 - 14 déc. 2015 à 16:01
Bonjour à tous,

J'ai programmé une macro permettant de créer un frame dans une feuille Excel tout en insérant dans celui-ci un bouton "Delete" pour supprimer ledit frame. Tout fonctionne bien excepté le bouton "Delete" qui ne déclenche pas la procédure de suppression quand on clique dessus.

Quelqu'un aurait-il une idée du problème?

Voici mon code:

Private Sub FrameTest_Click()
Dim Frm As Object
Dim Del As Control
Dim ButtonMacro As String
Dim x As Integer

'Crée un frame
Set Frm = Worksheets(1).OLEObjects.Add(ClassType:="Forms.Frame.1", Left:=57, Top:=540, Width:=300, Height:=200.25)

With Frm
.Name = "FrameTest"
End With


'Crée le bouton de suppression dans le frame
Set Del = Frm.Object.Controls.Add("Forms.CommandButton.1")

With Del
.Name = "FrameDelete"
.Caption = "Delete"
.Left = 10
.Top = 170
.Width = 50
.Height = 20
End With

'assigne le code au bouton "Delete"
ButtonMacro = "Sub FrameDelete_Click()" & vbCrLf
ButtonMacro = ButtonMacro & "ActiveSheet.Shapes(""FrameTest"").Delete" & vbCrLf
ButtonMacro = ButtonMacro & "End Sub"

With ThisWorkbook.VBProject.VBComponents(ActiveSheet.Name).CodeModule
x = .CountOfLines + 1
.InsertLines x, ButtonMacro
End With

End If

Frm.Activate 'Active le frame

End Sub

Merci d'avance!
A voir également:

2 réponses

cs_Le Pivert Messages postés 7904 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 14 août 2024 729
12 déc. 2015 à 16:35
Bonjour,

Le problème est que ton bouton fait partie intégrante de la Frame.
Deux solutions, tu mets ton bouton en dehors de la Fame ou alors tu supprimes tout. Frame et bouton.

Pour supprimer la Frame et garder le bouton qui en dehors:

Sub EffaceShapesSaufBoutons()
Dim i
    For Each i In ActiveSheet.Shapes
      If i.Type <> 8 And i.Type <> 12 Then
        ActiveSheet.Shapes(i.Name).Delete
      End If
    Next i
 End Sub


Pour tout supprimer:

Sub EffaceShapesSaufBoutons()
Dim i
    For Each i In ActiveSheet.Shapes
    ActiveSheet.Shapes(i.Name).Delete
      Next i
 End Sub


Voilà!
1
cs_Le Pivert Messages postés 7904 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 14 août 2024 729
12 déc. 2015 à 16:37
J'ai mis le même nom aux 2 macros, a modifier la seconde par EffaceShapes()
0
cs_Le Pivert Messages postés 7904 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 14 août 2024 729
12 déc. 2015 à 16:39
Il y a un End If sans If qui se promène!!!
Mettre Option Explicit au début de la page
0
Ein85 Messages postés 32 Date d'inscription jeudi 10 décembre 2015 Statut Membre Dernière intervention 2 mars 2016
12 déc. 2015 à 20:19
Bonjour,

Merci pour ton aide mais le problème ne semble pas venir du code de suppression qui fonctionne très bien lorsque j'utilise le mode pas à pas en debug et qui supprime tout comme prévu. Le problème semble plutôt venir du bouton dont la macro n'est pas déclenchée par l'événement "Click". Lorsque je clique, c'est comme s'il n'y avait aucune macro associée. Que faut-il faire pour que le bouton soit reconnu?
0
cs_Le Pivert Messages postés 7904 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 14 août 2024 729
13 déc. 2015 à 08:55
Ton bouton n'est pas reconnu en tant que tel. Mets toi en mode Création et double cliques sur ton bouton, que vois-tu:

Private Sub FrameTest_Click()

End Sub

c'est ta Frame et c'est pour cela que ça ne fonctionne pas.

Voici un code avec avec un bouton indépendant:

Dim Frm As Object
Dim Del As Object
Dim ButtonMacro As String
Dim x As Integer

'Crée un frame
Set Frm = Worksheets(1).OLEObjects.Add(ClassType:="Forms.Frame.1", Left:=57, Top:=540, Width:=300, Height:=200.25)

With Frm
.Name = "FrameTest"
End With

'crée le bouton
Set Del = ActiveSheet.OLEObjects.Add(ClassType:="Forms.CommandButton.1", _
    Link:=False, DisplayAsIcon:=False, Left:=200, Top:=100, Width:=100, Height:=35)
    Del.Name = "FrameDelete"
   ActiveSheet.OLEObjects(2).Object.Caption = "Delete"
'assigne le code au bouton "Delete"
ButtonMacro = "Sub FrameDelete_Click()" & vbCrLf
ButtonMacro = ButtonMacro & "ActiveSheet.Shapes(""FrameTest"").Delete" & vbCrLf
ButtonMacro = ButtonMacro & "End Sub"

With ThisWorkbook.VBProject.VBComponents(ActiveSheet.Name).CodeModule
x = .CountOfLines + 1
.InsertLines x, ButtonMacro
End With




1
cs_Le Pivert Messages postés 7904 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 14 août 2024 729
13 déc. 2015 à 09:50
si tu veux que ton bouton est la même position que dans ton code (dans le Frame), tu mets:

'crée le bouton
Set Del = ActiveSheet.OLEObjects.Add(ClassType:="Forms.CommandButton.1", _
    Link:=False, DisplayAsIcon:=False, Left:=60, Top:=700, Width:=100, Height:=35)


Voilà!!!!
0
Ein85 Messages postés 32 Date d'inscription jeudi 10 décembre 2015 Statut Membre Dernière intervention 2 mars 2016
13 déc. 2015 à 14:04
Ok, j'espérais éviter de séparer le bouton du frame mais si ce n'est pas possible, je vais créer un bouton indépendant. Merci pour ton aide!
0
Ein85 Messages postés 32 Date d'inscription jeudi 10 décembre 2015 Statut Membre Dernière intervention 2 mars 2016 > cs_Le Pivert Messages postés 7904 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 14 août 2024
13 déc. 2015 à 17:06
Par contre, mon bouton est derrière le frame et je n'arrive pas à le faire réapparaître. Si j'utilise Del.Activate, je vois le bouton mais celui-ci est désactivé et si j'utilise Del.SetFocus, j'ai une erreur de type "Propriété ou méthode non gérée par cet objet". Aurais-tu une idée?
0
cs_Le Pivert Messages postés 7904 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 14 août 2024 729
13 déc. 2015 à 18:44
Je me suis amusé à supprimer le code dans la feuille1 en même temps que le Frame et le bouton. Avec le code suivant on voit le bouton dans le Frame:

Dim Frm As Object
Dim Del As Object
Dim ButtonMacro As String
Dim x As Integer

'Crée un frame
Set Frm = Worksheets(1).OLEObjects.Add(ClassType:="Forms.Frame.1", Left:=57, Top:=540, Width:=300, Height:=200.25)

With Frm
.Name = "FrameTest"
End With

'crée le bouton
Set Del = ActiveSheet.OLEObjects.Add(ClassType:="Forms.CommandButton.1", _
    Link:=False, DisplayAsIcon:=False, Left:=60, Top:=700, Width:=100, Height:=35)
    Del.Name = "FrameDelete"
   ActiveSheet.OLEObjects(2).Object.Caption = "Delete"
'assigne le code au bouton "Delete"
ButtonMacro = "Sub FrameDelete_Click()" & vbCrLf
ButtonMacro = ButtonMacro & "ActiveSheet.Shapes(""FrameTest"").Delete" & vbCrLf
ButtonMacro = ButtonMacro & "ActiveSheet.Shapes(""FrameDelete"").Delete" & vbCrLf
ButtonMacro = ButtonMacro & "With ActiveWorkbook.VBProject.VBComponents (ActiveWorkbook.Sheets(""Feuil1"").CodeName).CodeModule" & vbCrLf 'adapter le nom de la feuille
ButtonMacro = ButtonMacro & ".DeleteLines 1, .CountOfLines" & vbCrLf
ButtonMacro = ButtonMacro & ".CodePane.Window.Close" & vbCrLf
ButtonMacro = ButtonMacro & "End With" & vbCrLf
ButtonMacro = ButtonMacro & "End Sub"

With ThisWorkbook.VBProject.VBComponents(ActiveSheet.Name).CodeModule
x = .CountOfLines + 1
.InsertLines x, ButtonMacro
End With
0
Ein85 Messages postés 32 Date d'inscription jeudi 10 décembre 2015 Statut Membre Dernière intervention 2 mars 2016
14 déc. 2015 à 13:36
En fait, ça ne fonctionnait pas à cause d'une ligne de code (Frm.Activate en l'occurence) que j'avais laissé en fin de procédure. Une fois enlevée, ça fonctionne. Sinon, comme tu l'as dit toi même, ton code supprime tout le code de la feuille 1 mais comment fait-on pour ne supprimer que la sub rajoutée dynamiquement (donc Sub FrameDelete_Click())? J'ai en effet d'autres procédures liées à d'autres boutons sur cette feuille que je ne dois pas effacer. Merci d'avance!
0