[Résolu][Calc]Déclencher un évènement à la modification d'une cellule unique

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 !
Avatar de l’utilisateur
Carol
Membre OOrganisé
Membre OOrganisé
Messages : 93
Inscription : 10 sept. 2007 07:16

[Résolu][Calc]Déclencher un évènement à la modification d'une cellule unique

Message par Carol »

Bonjour.

Je cherche à déclencher une macro si une cellule précise est modifiée, et uniquement elle.
Dans la PJ (comme dans mon doc réel), je modifie la cellule jaune qui modifie ensuite la cellule rouge.

Si je déclenche la macro avec le Contenu modifié des évènements de la feuille, la macro démarre quand je modifie la cellule jaune avant de modifier la cellule rouge ; et les résultats attendus sont donc faux.

J'ai trouvé :

Code : Tout sélectionner

Sub cell_onChange (oEvent As Variant)
	'Macro responds to changes in B1 only
If oEvent.AbsoluteName <> "$SheetName.$B$1" Then Exit Sub 
End Sub
ici : https://ask.libreoffice.org/t/event-dri ... tener/4345

Mais soit je ne sais pas l'adapter, soit cela ne fonctionne pas.

Merci
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Dernière modification par Carol le 08 nov. 2025 11:34, modifié 1 fois.
LibreOffice Version 25.8.1.1 - Linux Mint 22.2 - Win 10 Pro
Avatar de l’utilisateur
Dolev
SuppOOrter
SuppOOrter
Messages : 1178
Inscription : 19 août 2018 05:20

Re: [Calc]Déclencher un évènement à la modification d'une cellule unique

Message par Dolev »

Bonjour,

Votre macro teste la cellule B1 alors qu'il n'y a rien dedans sur une feuille qui n'existe pas.
Le document joint ne contient pas de macro. :marto:
Celle-ci doit être assignée à l'événement de feuille :
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Open Office 4.1.15 sous Windows 11
Avatar de l’utilisateur
Carol
Membre OOrganisé
Membre OOrganisé
Messages : 93
Inscription : 10 sept. 2007 07:16

Re: [Calc]Déclencher un évènement à la modification d'une cellule unique

Message par Carol »

Dans le fichier, je donne un exemple de la situation.
Il n'y a pas de macro car ce n'est pas elle le problème, c'est comment la déclencher.
J'ai copié un code tel que. Le pointage vers la cellule B1 n'est évidemment pas mon problème.

Je rajoute que le :marto: et le :fou: la dernière fois donnent à penser que les gens qui posent des questions sont des demeurés...

Décidément, c'est pas possible...

Bonne continuation.
LibreOffice Version 25.8.1.1 - Linux Mint 22.2 - Win 10 Pro
Avatar de l’utilisateur
Carol
Membre OOrganisé
Membre OOrganisé
Messages : 93
Inscription : 10 sept. 2007 07:16

Re: [Calc]Déclencher un évènement à la modification d'une cellule unique

Message par Carol »

Pour information :
il suffisait d'ajouter classeur.calculate()

- modifier l'équivalent de la cellule jaune est détecté par le paramètrage des évènements de la feuille Contenu modifié
- la macro démarre
- je lui demande tout de suite avec classeur.calculate() de recalculer les valeurs
- ce qui apparaît dans la cellule rouge est désormais juste

Merci
LibreOffice Version 25.8.1.1 - Linux Mint 22.2 - Win 10 Pro
Avatar de l’utilisateur
Dolev
SuppOOrter
SuppOOrter
Messages : 1178
Inscription : 19 août 2018 05:20

Re: [Résolu][Calc]Déclencher un évènement à la modification d'une cellule unique

Message par Dolev »

Carol a écrit : 08 nov. 2025 11:33 il suffisait d'ajouter classeur.calculate()
Vous l'ajouter où ? Parce que classeur n'est pas un objet de l'API.
C'est ThisComponent qui contient cette méthode comme le montre Xray
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Open Office 4.1.15 sous Windows 11
Avatar de l’utilisateur
Carol
Membre OOrganisé
Membre OOrganisé
Messages : 93
Inscription : 10 sept. 2007 07:16

Re: [Résolu][Calc]Déclencher un évènement à la modification d'une cellule unique

Message par Carol »

C'est pour cette raison que j'ai bien distingué classeur.calculate()

classeur est défini ailleurs chez moi par classeur = ThisComponent

Bonne fin de journée
LibreOffice Version 25.8.1.1 - Linux Mint 22.2 - Win 10 Pro
Avatar de l’utilisateur
Dolev
SuppOOrter
SuppOOrter
Messages : 1178
Inscription : 19 août 2018 05:20

Re: [Résolu][Calc]Déclencher un évènement à la modification d'une cellule unique

Message par Dolev »

Sauf que vous ne l'avez pas précisé et que votre solution ne sera pas comprise pour ceux qui tomberont sur ce problème.
Il aurait été plus sympathique de fournir le code complet de la macro ainsi qu'un document fonctionnel.
D'ailleurs, je ne comprends pas trop le rapport entre recalculer les formules d'une feuille et le fait de déclencher un événement.

Bonne journée aussi.
Open Office 4.1.15 sous Windows 11
Avatar de l’utilisateur
Dolev
SuppOOrter
SuppOOrter
Messages : 1178
Inscription : 19 août 2018 05:20

Re: [Résolu][Calc]Déclencher un évènement à la modification d'une cellule unique

Message par Dolev »

Pour ceux qui voudraient une solution à
Carol a écrit : 08 nov. 2025 06:58 déclencher une macro si une cellule précise est modifiée, et uniquement elle.
Cette macro assignée sur "Contenu modifié" change la cellule C4 si la liste en A2 est modifiée :

Code : Tout sélectionner

Sub ChangeListeA2(oEvt)
	If oEvt.AbsoluteName <> "$Feuille1.$A$2" Then Exit Sub 
	sContenu = oEvt.getString()
	if sContenu = "tintin" then
		sResultat = "homme"
	else
		sResultat = "chien"
	endif
	oDoc = ThisComponent
	oFeuille = oDoc.CurrentController.getActiveSheet()
	oCell = oFeuille.getCellRangeByName("C4")
	with oCell
		.String = sResultat
		.CellBackColor = RGB(255,0,0) 'rouge
	end with
End Sub
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Open Office 4.1.15 sous Windows 11
Avatar de l’utilisateur
Carol
Membre OOrganisé
Membre OOrganisé
Messages : 93
Inscription : 10 sept. 2007 07:16

Re: [Résolu][Calc]Déclencher un évènement à la modification d'une cellule unique

Message par Carol »

Je demande à cette macro d'afficher une liste de personnes si, pour ces personnes, un évènement dont la date a été enregistrée (jj/mm/aaaa), a eu lieu depuis un certain nombre de mois.
La cellule jaune contient le nombre de mois (1 à 8 ).
La cellule rouge contient la date (jj/mm/aaaa) calculée à partir de aujourd'hui - nombre de mois.
L'objectif de la macro est de comparer les dates jj/mm/aaaa des évènements de chaque personne avec la date de la cellule rouge.

Quand j'utilisais seulement la détection d'un évènement sur la feuille, la macro démarrait avant l'actualisation de la cellule rouge, et donnait une liste fantaisiste.

ThisComponent.calculate() au démarrage règle le pb.

Voili voilou.
LibreOffice Version 25.8.1.1 - Linux Mint 22.2 - Win 10 Pro
Avatar de l’utilisateur
Dolev
SuppOOrter
SuppOOrter
Messages : 1178
Inscription : 19 août 2018 05:20

Re: [Résolu][Calc]Déclencher un évènement à la modification d'une cellule unique

Message par Dolev »

Carol a écrit : 08 nov. 2025 14:36 L'objectif de la macro est de comparer les dates jj/mm/aaaa des évènements de chaque personne avec la date de la cellule rouge.
Je ne vois vraiment pas le rapport avec le problème que vous postez au départ.
Ni même avec le document fourni d'ailleurs.
Mais bon... :tesfou:
Open Office 4.1.15 sous Windows 11
Avatar de l’utilisateur
Carol
Membre OOrganisé
Membre OOrganisé
Messages : 93
Inscription : 10 sept. 2007 07:16

Re: [Résolu][Calc]Déclencher un évènement à la modification d'une cellule unique

Message par Carol »

Dolev a écrit : 08 nov. 2025 16:59 :tesfou:
ça sert à quoi ça ?
ça fait avancer la réflexion ?
ça soutient la discussion ?
N'importe quoi !
LibreOffice Version 25.8.1.1 - Linux Mint 22.2 - Win 10 Pro
Avatar de l’utilisateur
Bidouille
RespOOnsable forum
RespOOnsable forum
Messages : 12751
Inscription : 08 nov. 2005 16:23
Localisation : Brest, France

Re: [Résolu][Calc]Déclencher un évènement à la modification d'une cellule unique

Message par Bidouille »

Bonjour,

Ce forum est d'abord une base de connaissances pour l'ensemble de la communauté.
Puisque vous avez balisé [Résolu], nous vous remercions de publier votre solution.
Vous insérez le code complet de votre macro ainsi qu'un document finalisé qui l'inclut afin d'illustrer le problème.

Ceci afin d'aider ceux qui tomberont sur ce fil.
Avatar de l’utilisateur
Carol
Membre OOrganisé
Membre OOrganisé
Messages : 93
Inscription : 10 sept. 2007 07:16

Re: [Résolu][Calc]Déclencher un évènement à la modification d'une cellule unique

Message par Carol »

Voici le code du fichier d'exemple.
La macro rafraichir_donnees() déclenche avec l'événèment Contenu modifié de la feuille SORTIE.

Vous remarquerez que passer de 10 à 15 dans la cellule jaune ne donne pas les mêmes résultats selon que le code est

Code : Tout sélectionner

classeur.calculate()
ou

Code : Tout sélectionner

rem classeur.calculate()
Bonne fin de WE.

Code : Tout sélectionner

REM  *****  BASIC  *****
dim classeur, controleur, fenetre, feuilles, sortie, source, zone as object
dim TexteCopie, texte_cellule as string
dim DateCopie, date_cellule, date_cible as date
dim ligne_source, ligne_sortie as integer
dim gomme as long

rem ************************************************************

Sub rafraichir_donnees()
	classeur = ThisComponent
	controleur = classeur.CurrentController
	fenetre = classeur.CurrentController.Frame.ContainerWindow
	feuilles = classeur.Sheets
	sortie = feuilles.getByName("SORTIE")
	source = feuilles.getByName("SOURCE")
	
	classeur.calculate()
	date_cible = LitDate(sortie.getCellByPosition(3, 2)) rem la cellule rouge
	
	ligne_source = 0 rem index 0 pour la ligne 1 du tableau
	ligne_sortie = 5
	
	rem nettoyage
	gomme = com.sun.star.sheet.CellFlags.STRING + com.sun.star.sheet.CellFlags.DATETIME
	zone = sortie.getCellRangeByPosition(0, 5, 1, 31)
	zone.clearContents(gomme)
	
	texte_cellule = LitTexte(source.getCellByPosition(0, ligne_source)) rem index 0 pour la colonne A
	while texte_cellule <> ""
		date_cellule = LitDate(source.getCellByPosition(1, ligne_source))
		if date_cellule < date_cible then
			CopieTexte(source.getCellByPosition(0, ligne_source), sortie.getCellByPosition(0, ligne_sortie))
			CopieDate(source.getCellByPosition(1, ligne_source), sortie.getCellByPosition(1, ligne_sortie))
			ligne_sortie = ligne_sortie + 1
		endif
		ligne_source = ligne_source + 1
		texte_cellule = LitTexte(source.getCellByPosition(0, ligne_source))
	wend	
	
End Sub

rem ************************************************************

Function LitDate(cible as object) as date
	LitDate = cible.getvalue()
End Function

Function LitTexte(cible as object) as string
	LitTexte = cible.getstring()
End Function

Sub CopieDate(depuis as object, vers as object)
	DateCopie = depuis.getvalue()
	if DateCopie <> 0 then
		vers.value = DateCopie
	else
		vers.string = ""
	endif
End Sub

Sub CopieTexte(depuis as object, vers as object)
	TexteCopie = depuis.getstring()
	vers.string = TexteCopie
End Sub
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
LibreOffice Version 25.8.1.1 - Linux Mint 22.2 - Win 10 Pro
Avatar de l’utilisateur
Dolev
SuppOOrter
SuppOOrter
Messages : 1178
Inscription : 19 août 2018 05:20

Re: [Résolu][Calc]Déclencher un évènement à la modification d'une cellule unique

Message par Dolev »

Carol a écrit : 09 nov. 2025 09:42 Vous remarquerez que passer de 10 à 15 dans la cellule jaune ne donne pas les mêmes résultats selon que le code est

Code : Tout sélectionner

classeur.calculate()
ou

Code : Tout sélectionner

rem classeur.calculate()
Alors vous auriez donné le 2nd classeur, j'aurais compris le problème dès le départ.
Il est plus simple de calculer directement la variable date_cible en Basic.
Je vous remets le début du code car le votre ne teste pas la modification d'une cellule unique.

Code : Tout sélectionner

Sub rafraichir_donnees(oEvt)
	if oEvt.AbsoluteName <> "$SORTIE.$A$3" then exit sub <- à ajouter
	
	classeur = ThisComponent
	controleur = classeur.CurrentController
	fenetre = classeur.CurrentController.Frame.ContainerWindow
	feuilles = classeur.Sheets
	sortie = feuilles.getByName("SORTIE")
	source = feuilles.getByName("SOURCE")
	
	'classeur.calculate()
	'date_cible = LitDate(sortie.getCellByPosition(3, 2)) rem la cellule rouge
	dim date_jour as long
	date_jour = DateSerial(Year(Date),Month(Date),Day(Date))
	nb_jour = oEvt.getValue()
	date_cible = date_jour - nb_jour * 30
	
	
	ligne_source = 0 rem index 0 pour la ligne 1 du tableau
	ligne_sortie = 5
Open Office 4.1.15 sous Windows 11
Avatar de l’utilisateur
Carol
Membre OOrganisé
Membre OOrganisé
Messages : 93
Inscription : 10 sept. 2007 07:16

Re: [Résolu][Calc]Déclencher un évènement à la modification d'une cellule unique

Message par Carol »

OK, merci
LibreOffice Version 25.8.1.1 - Linux Mint 22.2 - Win 10 Pro
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 26109
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Résolu][Calc]Déclencher un évènement à la modification d'une cellule unique

Message par Dude »

Salut,
Dolev a écrit : 09 nov. 2025 20:40 Il est plus simple de calculer directement la variable date_cible en Basic.
+1
Autre possibilité, utiliser le service FunctionAccess comme décrit dans le suprême : viewtopic.php?f=15&t=14625
Ce qui donne :

Code : Tout sélectionner

oFeuil = ThisComponent.Sheets.getByName("SORTIE") 
nb_jour = oFeuil.getCellRangeByName("A3").getValue() 

oAcces = CreateUnoService("com.sun.star.sheet.FunctionAccess")
ceJour = oAcces.callFunction("TODAY", Array()) 'Fonction AUJOURDHUI
date_cible = ceJour - nb_jour * 30
Msgbox date_cible
Avatar de l’utilisateur
Carol
Membre OOrganisé
Membre OOrganisé
Messages : 93
Inscription : 10 sept. 2007 07:16

Re: [Résolu][Calc]Déclencher un évènement à la modification d'une cellule unique

Message par Carol »

Merci.

Elle est bien celle-ci, elle ouvre pas mal de possibilités.
LibreOffice Version 25.8.1.1 - Linux Mint 22.2 - Win 10 Pro