Page 1 sur 1

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

Publié : 31 août 2008 22:47
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:

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

Publié : 01 sept. 2008 07:11
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


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

Publié : 01 sept. 2008 09:52
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

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

Publié : 04 sept. 2008 08:09
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.

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

Publié : 04 sept. 2008 09:39
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) ?

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

Publié : 05 sept. 2008 06:05
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: