[Résolu] [Calc] Actualiser formule personnelle via listener

Discussions et questions sur tout ce qui concerne la programmation tous langages et tous modules confondus.

Modérateur : Vilains modOOs

Règles du forum
:alerte: Balisage obligatoire dans cette section !
Aidez-nous à vous aider au mieux en balisant correctement votre question : reportez-vous sur les règles de cette section avant de poster !
Jeff
GourOOu
GourOOu
Messages : 9608
Inscription : 18 sept. 2006 11:40
Localisation : France

[Résolu] [Calc] Actualiser formule personnelle via listener

Message par Jeff »

Bonsoir à toutes et tous,

Mon amie à créé une fonction personalisée permettant d'obtenir le nom d'une feuille en fonction de sa position dans le classeur.

Voici le code :

Code : Tout sélectionner

REM  *****  BASIC  *****
'Fonction NomFeuille
'Auteur : Jeff & Larrassac
'Mes remerciements au forum officiel OOo : http://user.services.openoffice.org/fr/forum/index.php
'Mes remerciements au Club des développeurs français : http://www.developpez.net/forums/

Function NomFeuille(position as integer)
Dim oDoc As Object
On error goto Erreurs 'contrôle si le numéro de feuille existe

oDoc=ThisComponent

     NomFeuille = oDoc.Sheets(position-1).Name
     
Erreurs: 'Retourne #NA si le numéro de feuille est inexistant
	if position < 1 or position > oDoc.Sheets.count then
		NomFeuille = "#NA"
		Exit Function
	Endif

End Function
Malheureusement, nous butons sur une difficulté d'actualisation : si une feuille est insérée ou bien renommée, la formule ne se met pas à jour.

J'ai parcouru la recherche, notamment sur les listeners (http://user.services.openoffice.org/fr/ ... =7405#7405 par ex), et j'en reviens avec une interrogation :
- faut-il un listener qui "écoute" le classeur (en cas d'ajout de feuille) + un listener par feuille (en cas de feuille renommée), et comment insérer ce(s) listener(s) dans la fonction, si bien évidemment le listener est la solution...

J'ai tenté naïvement de rajouter une fonction Now dans la macro puisque c'est ainsi que l'on contourne actuellement le problème par formule, sans plus de succès.

Merci d'avance pour vos pistes :wink:
Dernière modification par Jeff le 05 sept. 2008 08:06, modifié 1 fois.
Pierre-Yves Samyn
Grand Maître de l'OOffice
Grand Maître de l'OOffice
Messages : 11276
Inscription : 02 mai 2006 10:42

Re: [Calc]Actualiser formule perso/pose de plusieurs listener ?

Message par Pierre-Yves Samyn »

Bonjour Jeff

A priori un seul listener devrait suffire qui va "auditer" toute modification du classeur. En cas de modification, il suffit de lancer le calcul des formules. Ce qui nous donne par exemple :

Code : Tout sélectionner

Option Explicit

Global PysListener as object

sub PysListenerAdd

PysListener = createUnoListener("Pys_", "com.sun.star.util.XModifyListener")
ThisComponent.AddModifyListener(PysListener)

end sub

sub PysListenerRemove
	ThisComponent.RemoveModifyListener(PysListener)
end sub

sub Pys_disposing(PysListener)
end sub

Sub Pys_Modified(PysListener)
	thiscomponent.calculateAll
End Sub

Pièces jointes
NomFeuilleJeff.ods
(8.66 Kio) Téléchargé 134 fois
Jeff
GourOOu
GourOOu
Messages : 9608
Inscription : 18 sept. 2006 11:40
Localisation : France

Re: [Calc]Actualiser formule perso/pose de plusieurs listener ?

Message par Jeff »

Bonjour Pierre-Yves, content de te voir par ici :)

Je teste ta proposition dans la semaine et ne manquerai pas de faire le retour ;

A + :D
Jeff
GourOOu
GourOOu
Messages : 9608
Inscription : 18 sept. 2006 11:40
Localisation : France

Re: [Calc]Actualiser formule perso/pose de plusieurs listener ?

Message par Jeff »

Re...
Pierre-Yves Samyn a écrit :En cas de modification, il suffit de lancer le calcul des formules.
C'est à dire :?:

Sur la macro de base, il faut que je fasse un recalcul inconditionnel (Ctrl+Maj+F9 soit l'équivalent de CalculateHard ) pour ré-actualiser la fonction...et pareil pour la macro contenant le listener :fou:
  • Si je teste la fonction de cette façon :

    Code : Tout sélectionner

    =NOMFEUILLE(FEUILLES())
    elle renvoie le nom de la dernière feuille.
    • - Ensuite j'insère une feuille nouvelle en dernière position :arrow: je souhaite que la formule s'actualise sans avoir à faire un recalcul inconditionnel (c'est possible ?)

      - Si ensuite de renomme cette dernière feuille :arrow: je souhaite que la formule s'actualise sans avoir à faire un recalcul inconditionnel
Actuellement, avec l'une ou l'autre macro, le fonctionnement me parait le même...

J'ai essayé de mettre le code concernant le retrait du listener en commentaire, mais sans succès
Idem en changeant CalculateAll par CalculateHard

J'ai dû manquer quelque chose...

A + :wink:

EDIT : en fait, je voudrai obtenir le fonctionnement similaire à cette formule :

Code : Tout sélectionner

=SI($A$65536=1;MAINTENANT();NOMFEUILLE(FEUILLES()))
L'intervention de la fonction MAINTENANT sur une "cellule improbable" réactualise la fonction personnalisée selon mes désirs.
Pierre-Yves Samyn
Grand Maître de l'OOffice
Grand Maître de l'OOffice
Messages : 11276
Inscription : 02 mai 2006 10:42

Re: [Calc]Actualiser formule perso/pose de plusieurs listener ?

Message par Pierre-Yves Samyn »

Bonjour
Jeff a écrit :Re...
Pierre-Yves Samyn a écrit :En cas de modification, il suffit de lancer le calcul des formules.
C'est à dire :?:
C'est-à-dire que la seule chose qu'ait à faire le listener c'est :

Code : Tout sélectionner

thiscomponent.calculateAll
Jeff a écrit :Si je teste la fonction de cette façon :

Code : Tout sélectionner

=NOMFEUILLE(FEUILLES())
elle renvoie le nom de la dernière feuille.

- Ensuite j'insère une feuille nouvelle en dernière position :arrow: je souhaite que la formule s'actualise sans avoir à faire un recalcul inconditionnel (c'est possible ?)
Ben... c'est ce qu'est supposée faire la macro que je t'ai envoyée :lol:

Je me demande : as-tu lancé la procédure PysListenerAdd qui active le listener (car je ne l'ai pas associée à l'ouverture du document) ?
Jeff
GourOOu
GourOOu
Messages : 9608
Inscription : 18 sept. 2006 11:40
Localisation : France

Re: [Calc]Actualiser formule perso/pose de plusieurs listener ?

Message par Jeff »

Pierre-Yves Samyn a écrit :Je me demande : as-tu lancé la procédure PysListenerAdd qui active le listener (car je ne l'ai pas associée à l'ouverture du document) ?
:oops: Effectivement, ça fonctionne mieux comme ça :lol:

Merci beaucoup pour toute ces explications :bravo:
Répondre