Comment supprimer un bouton d'une feuille de calcul par programmation

Bonjour,

J'ai du reprendre une macro réalisée sous Excel.

L'essentiel du code est bien repris à quelque exceptions près.

Actuellement je ne trouve pas la solution pour supprimer un Bouton placé dans la feuille active.

Normalement, le code suivant devrait pouvoir le faire mais je ne réussi qu'à supprimer l'action associé au déclenchement du bouton mais le bouton lui ne disparait pas.
(En plus ce bouton ne peux plus être associé à nouveau à une macro).

/' Procédure déclenché par le bouton à supprimer/

/Sub Main/

/ Dim oForm, oControl, iNumControls%, i%/

/ oForm=THISCOMPONENT.CurrentController.ActiveSheet.DrawPage.Forms.getByName("Standard")/

/ 'ray oForm/

/ ' Le bouton ne disparait pas seul l'action dans les propriété est remise à blanc/

/ oForm.removeByName( "Bouton 1")/

/ iNumControls = oForm.Count()/

/ /

/ For i = 0 To iNumControls - 1/

/ oControl = oForm.GetByIndex(i)/

/ ' xray oControl/

/ ' même comportement que pour le RemoveByName j'ai aussi tenté avec RemoveEventListener() sans + de succès /

/ oForm.RemoveEntry(i)/

/ Next/

/End Sub /

Est-ce que quelqu'un voit ce qui pourrait clocher (méthode complémentaire manquante etc.) ou connait un moyen pour faire autrement ?

Merci d'avance

Samuel

Bonjour,

Je vais peut-être dire une c##nerie mais un bouton, au départ, ce n'est pas de la programmation, c'est du dessin, non ?

Est-ce que tu as essayé d'afficher la barre d'outils "Ébauche de formulaire" (Affichage > Barre d'outils > Ébauche de formulaire) et dans celle-ci, d'activer le mode Ébauche (la deuxième icône en partant de la gauche) ?

Normalement, une fois ce mode enclenché, un clic sur le bouton te permet de le sélectionner et une petite pression sur la touche <Suppr> devrait faire le reste, non ?

Ou alors j'ai raté quelque chose ?

A+

Bonjour

Message du 18/03/11 17:53
De : "Samuel Mounier (Liste CGO)"

je ne trouve pas la solution pour supprimer un Bouton placé
dans la feuille active.

Le forum comprend des exemples de suppression de contrôle, entre
autres :
http://user.services.openoffice.org/fr/forum/viewtopic.php?f=8&t=18718&p=102585&hilit=suppr*+contr*#p102585

Cordialement

Pierre-Yves

Une messagerie gratuite, garantie à vie et des services en plus, ça vous tente ?
Je crée ma boîte mail www.laposte.net

pierre-yves.samyn a écrit :

Bonjour

Message du 18/03/11 17:53
De : "Samuel Mounier (Liste CGO)"

je ne trouve pas la solution pour supprimer un Bouton placé dans la feuille active.

Le forum comprend des exemples de suppression de contrôle, entre
autres :
http://user.services.openoffice.org/fr/forum/viewtopic.php?f=8&t=18718&p=102585&hilit=suppr*+contr*#p102585

Cordialement

Pierre-Yves

Bonjour Pierre-Yves,

Oui j'avais déjà trouvé cette exemple, mais le fonctionnement dans le tableur est différent.

Ce code ne s'applique que pour un bouton réalisé dans un document traitement de texte.

Je n'avais pas trouvé le code pour le faire dans le tableur.

Samuel

Docgranville a écrit :

Bonjour,

J'ai du reprendre une macro réalisée sous Excel.

L'essentiel du code est bien repris à quelque exceptions près.

Actuellement je ne trouve pas la solution pour supprimer un Bouton placé dans la feuille active.

Normalement, le code suivant devrait pouvoir le faire mais je ne réussi qu'à supprimer l'action associé au déclenchement du bouton mais le bouton lui ne disparait pas.
(En plus ce bouton ne peux plus être associé à nouveau à une macro).

[...]

Est-ce que quelqu'un voit ce qui pourrait clocher (méthode complémentaire manquante etc.) ou connait un moyen pour faire autrement ?

Merci d'avance

Samuel

Bonjour,

Je vais peut-être dire une c##nerie mais un bouton, au départ, ce n'est pas de la programmation, c'est du dessin, non ?

Est-ce que tu as essayé d'afficher la barre d'outils "Ébauche de formulaire" (Affichage > Barre d'outils > Ébauche de formulaire) et dans celle-ci, d'activer le mode Ébauche (la deuxième icône en partant de la gauche) ?

Normalement, une fois ce mode enclenché, un clic sur le bouton te permet de le sélectionner et une petite pression sur la touche <Suppr> devrait faire le reste, non ?

Bonjour,

Je connaissais cette manip que j'ai tenté de "coder" par l'enregistrement de Macro sans succès.
(c'est la méthode qui avait été utilisée dans Excel par le créateur de mon fichier d'origine.
  Dommage que ça ne fonctionne pas dans LibO ou OOo :-()

Bon, bien sûr que c'est aussi réalisable à la main sans trop de difficulté mais apparemment
ce genre de manip est 10 fois trop compliqué pour mes utilisateurs en ce moment.

C'est pour cela que j'ai tenté de réaliser le "vrai" code qui le fait directement dans la macro.

Mais n'étant pas un grand habitué de Xray et de l'API, j'ai du mal à trouvé les bons services et méthodes pour supprimer un bouton dans une feuille du tableur.

Si quelqu'un connait bien ces deux là, ce bout de code serait le bienvenu sur un forum ou sur une des listes OOo et/ou LibO.

A+

Samuel

Bonjour

Message du 23/03/11 10:52
De : "Samuel Mounier (Liste CGO)"

Ce code ne s'applique que pour un bouton réalisé dans un document traitement de texte.
Je n'avais pas trouvé le code pour le faire dans le tableur.

Essaie :

thiscomponent.sheets.getByName("Feuille1").DrawPage.Forms.getByName("Standard").getByName("PushButton").dispose

Cordialement
Pierre-Yves

Laposte.net, Messager Officiel du Rallye des Gazelles 2011, Pour suivre le Rallye Aicha des Gazelles et soutenir les participantes,
cliquez ici http://www.laposte.net/rallye-des-gazelles

pierre-yves.samyn a écrit :

Essaie :

thiscomponent.sheets.getByName("Feuille1").DrawPage.Forms.getByName("Standard").getByName("PushButton").dispose

Cordialement
Pierre-Yves

Bonjour Pierre-Yves,

En l'adaptant à mon document... (nom de feuille et nom du bouton)

thiscomponent.sheets.getByName("dossier").DrawPage.Forms.getByName("Standard").getByName("Button 2").dispose

Me donne le message d'erreur suivant.
X Une exception s'est produite :
   Type: com.sun.star.container.NoSuchElementException
   Message:.

Ce n'est donc pas le bon code

Je continue à chercher

A+

Samuel

pierre-yves.samyn a écrit :

Bonjour

Message du 23/03/11 10:52
De : "Samuel Mounier (Liste CGO)"

Ce code ne s'applique que pour un bouton réalisé dans un document traitement de texte.
Je n'avais pas trouvé le code pour le faire dans le tableur.

Essaie :

thiscomponent.sheets.getByName("Feuille1").DrawPage.Forms.getByName("Standard").getByName("PushButton").dispose

Cordialement
Pierre-Yves

Apparement, il faudrait plutôt que j'utilise la propriété EnableVisible = FALSE sur les seuls objets du type "com.sun.star.comp.forms.OButtonModel" mais [obj].supportsService("com.sun.star.comp.forms.OButtonModel") me renvoie false
même lorsque je suis sur un bouton (je le vois en affichant son nom), étrange non ?

A+

Samuel

pierre-yves.samyn a écrit :

Essaie :

thiscomponent.sheets.getByName("Feuille1").DrawPage.Forms.getByName("Standard")
.getByName("PushButton").dispose

Message du 23/03/11 14:47
De : "Samuel Mounier (Liste CGO)"

En l'adaptant à mon document... (nom de feuille et nom du bouton)

thiscomponent.sheets.getByName("dossier").DrawPage.Forms.getByName("Standard")>
.getByName("Button 2").dispose
Me donne le message d'erreur suivant.
Type: com.sun.star.container.NoSuchElementException

Es-tu sûr de la capitalisation (dossier et non Dossier, Button 2) ?
Par ailleurs le nom du formulaire est-il correct (Standard) ?

Ce n'est donc pas le bon code

Disons... sous réserve des vérifications ci-dessus :slight_smile:

Cordialement
Pierre-Yves

Laposte.net, Messager Officiel du Rallye des Gazelles 2011, Pour suivre le Rallye Aicha des Gazelles et soutenir les participantes,
cliquez ici http://www.laposte.net/rallye-des-gazelles

pierre-yves.samyn a écrit :

pierre-yves.samyn a écrit :

Essaie :

thiscomponent.sheets.getByName("Feuille1").DrawPage.Forms.getByName("Standard")
.getByName("PushButton").dispose

Message du 23/03/11 14:47
De : "Samuel Mounier (Liste CGO)"

En l'adaptant à mon document... (nom de feuille et nom du bouton)

thiscomponent.sheets.getByName("dossier").DrawPage.Forms.getByName("Standard")>
.getByName("Button 2").dispose Me donne le message d'erreur suivant. Type: com.sun.star.container.NoSuchElementException

Es-tu sûr de la capitalisation (dossier et non Dossier, Button 2) ?
Par ailleurs le nom du formulaire est-il correct (Standard) ?

Ce n'est donc pas le bon code

Disons... sous réserve des vérifications ci-dessus :slight_smile:

O oui presque...

thiscomponent.sheets.getByName("dossier").DrawPage.Forms.getByName("Standard").getByName("Bouton 2").dispose
Fonctionne

Il ne me manquait qu'un O à mon Button...

Pour ce que ça intéresse, j'ai fait une compilation de ce que ton bout de code m'a permis de comprendre.

Au fait maintenant ça marche ... (j'suis content là ...)

Merci beaucoup Pierre-Yves.

Donc pour ceux qui en auraient besoin :

' Ce code supprime les contrôles de formulaire qui porte le nom "bouton 2"
Sub SupprMesBt
  Dim objF as object
  objF = thiscomponent.sheets.getByName("dossier").DrawPage.Forms.getByIndex(0)

  ' Forms.getByName("nomduform") pourrait être utilisé si je savais que le formulaire porte ce nom
  ' Pour déterminer, le nom de mon formulaire, on peut aussi lister tous les formulaires par le code suivant :
  ' Ne me demandez pas comment en ajouter des différents je ne saurai pas faire... :slight_smile:
  ' Mais ça doit être possible puisque l'on peut les lister... et en compter le nombre
  ' For I = thiscomponent.sheets.getByName("Feuille1").DrawPage.Forms.getCount() - 1 to 0 step -1
  ' msgbox thiscomponent.sheets.getByName("Feuille1").DrawPage.Forms.getByIndex(I).Name
  ' Next

  ' Parcours tous les objets du 1er formulaire trouvé dans le document
  For I = objF.getCount() - 1 to 0 step -1
    ' xRay objF.getByIndex(I)
    ' Msgbox objF.getByIndex(I).getName
    ' Lorsque je tombe sur un controle nommé Bouton2, je le supprime
    if objF.getByIndex(I).getName = "Bouton 2" then objF.getByIndex(I).dispose()

  Next

End Sub

Cordialement
Pierre-Yves

Et merci encore

A+

Samuel

Bonjour

content que ca marche pour toi

juste une petite remarque

if objF.getByIndex(I).getName = "Bouton 2" then
objF.getByIndex(I).dispose()

pourrait s'ecrire
if objF(I).name = "Bouton 2" then objF(I).dispose()

en effet, en OOoBasic, les getByIndex sont transformés en tableaux (ce
qui est tres pratique). de meme les get... set... en propriétes
directement accessible en lecture ou ecriture suivant le contexte

Bonne fin de journee

laurent