[Résolu][Calc] Cell colorée en fonc° de la position actuelle

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 !
Bosluc
Membre hOOnoraire
Membre hOOnoraire
Messages : 181
Inscription : 25 févr. 2009 09:21

[Résolu][Calc] Cell colorée en fonc° de la position actuelle

Message par Bosluc »

Bonjour,
Dans un tableau, j'ai des noms dans la colonne B et des données dans les colonnes suivantes.
Par exemple si je suis en P5 (ou C5, E5, W5, etc), je vois à gauche que je suis sur la ligne 5 (car c'est gris foncé), mais pour une meilleur lecture est-il possible de mettre en évidence (avec un style de cellule) le contenu (ici le nom) de la cellule B5 ?
Donc quel que soit la colonne en cours, ça revient à mettre en évidence la cellule Bx.
Je joins un tableau basique. Ici j'ai mis en jaune la cellule B3 car mon curseur est en K3, si je me déplace en K4, c'est la cellule B4 qui est en jaune et ainsi de suite.
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Dernière modification par Bosluc le 20 sept. 2015 19:04, modifié 1 fois.
LibreOffice 5.0.1 sur Windows 10 x64 Edition familiale à la maison.
LibreOffice 4.4.5 sur Windows 7 Entreprise.
zeguedon
ManitOOu
ManitOOu
Messages : 3031
Inscription : 02 juil. 2014 17:25

Re: [Calc] Cellule colorée en fonction de la position actuel

Message par zeguedon »

Bonjour,

Une solution connectée à l’événement de feuille "Sélection modifiée"

Code : Tout sélectionner

Sub Main(oEv as Object)
maFeuille = ThisComponent.Sheets(0) 'Feuille1
maZone = maFeuille.GetCellRangeByName("B2:B50") 'Colonne des noms
maZone.CellStyle = "Par défaut" ' Lorsqu'une cellule est sélectionnée on efface le style jaune de colonne B
maLigne = oEv.CellAddress.Row 'numero de ligne sélectionnée
maCellule = maFeuille.getCellByPosition(1,maLigne) 'sélection de la cellule colonne B correspondant à la ligne sélectionnée
maCellule.CellStyle = "FondJaune" 'application du style jaune
End Sub


et le fichier qui va avec :

A+
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Comment baliser [Résolu] ?
AOO
LibreOffice
Sous Linux
Bosluc
Membre hOOnoraire
Membre hOOnoraire
Messages : 181
Inscription : 25 févr. 2009 09:21

Re: [Calc] Cellule colorée en fonction de la position actuel

Message par Bosluc »

Bonjour zeguedon,
C'est presque ça, car si je fais une sélection de plusieurs cellules pour changer le contenu par exemple, j'ai un message d'erreur.
Merci
LibreOffice 5.0.1 sur Windows 10 x64 Edition familiale à la maison.
LibreOffice 4.4.5 sur Windows 7 Entreprise.
zeguedon
ManitOOu
ManitOOu
Messages : 3031
Inscription : 02 juil. 2014 17:25

Re: [Calc] Cellule colorée en fonction de la position actuel

Message par zeguedon »

Bonjour,
Bosluc a écrit :C'est presque ça, car si je fais une sélection de plusieurs cellules pour changer le contenu par exemple, j'ai un message d'erreur.
En même temps c'était pas précisé non plus !

Tu ne précises pas non plus si certains noms de la colonne B possèdent déjà un formatage particulier qui ne doit pas être affecté par la procédure.

Merci de donner dès le départ toutes les infos.

A+
Comment baliser [Résolu] ?
AOO
LibreOffice
Sous Linux
Piaf
GourOOu
GourOOu
Messages : 5622
Inscription : 25 nov. 2011 18:07
Localisation : Guyane

Re: [Calc] Cellule colorée en fonction de la position actuel

Message par Piaf »

Bonjour
Bosluc a écrit :C'est presque ça, car si je fais une sélection de plusieurs cellules pour changer le contenu par exemple, j'ai un message d'erreur.

Code : Tout sélectionner

Sub Main(oEv as Object)
	maFeuille = ThisComponent.Sheets(0) 'Feuille1
	maZone = maFeuille.GetCellRangeByName("B2:B50") 'Colonne des noms
	maZone.CellStyle = "Par défaut" ' Lorsqu'une cellule est sélectionnée on efface le style jaune de colonne B
	If oEv.supportsService("com.sun.star.table.Cell") Then
		maLigne = oEv.CellAddress.Row 'numero de ligne sélectionnée
		maCellule = maFeuille.getCellByPosition(1,maLigne) 'sélection de la cellule colonne B correspondant à la ligne sélectionnée
		maCellule.CellStyle = "FondJaune" 'application du style jaune
	End If		
End Sub
A+
Libre Office Version: 6.1.6 et Apache OpenOffice 4.1.6 Sur Xubuntu 18.04 AMD64
Bosluc
Membre hOOnoraire
Membre hOOnoraire
Messages : 181
Inscription : 25 févr. 2009 09:21

Re: [Calc] Cellule colorée en fonction de la position actuel

Message par Bosluc »

zeguedon a écrit :Bonjour,
Bosluc a écrit :C'est presque ça, car si je fais une sélection de plusieurs cellules pour changer le contenu par exemple, j'ai un message d'erreur.
En même temps c'était pas précisé non plus !

Tu ne précises pas non plus si certains noms de la colonne B possèdent déjà un formatage particulier qui ne doit pas être affecté par la procédure.

Merci de donner dès le départ toutes les infos.

A+
Bonjour,
Oui, je précise que dans la colonne des noms ces derniers peuvent être de couleur différente et avec un style de format, mais ils ne font pas l'objet d'un formatage conditionnel, en revanche il y a des formatages conditionnels (par macro) dans les autres colonnes.
Après avoir testé la macro de Piaf (merci) il n'y a plus d'erreur, en revanche il devrait être possible de garder la couleur repère (jaune) en cas de sélection multiple sur la même ligne, et de pouvoir retrouver le formatage d'origine de la cellule.
En pratique, ça revient à ce que ça se comporte de la même façon que la colonne chiffrée à gauche où par défaut c'est gris clair et ça devient gris foncé (ou bleu selon les versions d'Open/LibreOffice).
LibreOffice 5.0.1 sur Windows 10 x64 Edition familiale à la maison.
LibreOffice 4.4.5 sur Windows 7 Entreprise.
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 25184
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Calc] Cellule colorée en fonction de la position actuel

Message par Dude »

Salut,

Déjà, évite de citer l'intégralité des messages.
Tu vois bien que cela rend pénible la lecture avec des choses redondantes.
Ne le fais que pour une phrase si cela permet de récapituler un contexte.

Bosluc a écrit :il devrait être possible de garder la couleur repère (jaune) en cas de sélection multiple sur la même ligne, et de pouvoir retrouver le formatage d'origine de la cellule.
Pour cela, il faudrait pouvoir stocker durablement ces informations de formatage
Comment penses-tu faire cette opération ?
Avatar de l’utilisateur
luky-luke
InconditiOOnnel
InconditiOOnnel
Messages : 936
Inscription : 27 nov. 2010 00:17
Localisation : gâtine deux-sèvrienne

Re: [Calc] Cellule colorée en fonction de la position actuel

Message par luky-luke »

Bonjour
Bosluc a écrit :en revanche il devrait être possible de garder la couleur repère (jaune) en cas de sélection multiple sur la même ligne
Il suffit de modifier un peu le code de Piaf. A tester bien sur :wink:

Code : Tout sélectionner

Sub Main(oEv as Object)
maFeuille = ThisComponent.Sheets(0) 'Feuille1
maZone = maFeuille.GetCellRangeByName("B2:B50") 'Colonne des noms
	If oEv.supportsService("com.sun.star.table.Cell") Then
		maZone.CellStyle = "Default"
		maLigne = oEv.CellAddress.Row 'numero de ligne sélectionnée
		maCellule = maFeuille.getCellByPosition(1,maLigne) 'sélection de la cellule colonne B correspondant à la ligne sélectionnée
		maCellule.CellStyle = "FondJaune" 'application du style jaune
	End If
End Sub
Bosluc a écrit :pouvoir retrouver le formatage d'origine de la cellule
Dude a écrit :Pour cela, il faudrait pouvoir stocker durablement ces informations de formatage
+1

Il y a une chose que je ne comprends pas, et en même temps c'est pas grave :lol: Mais à chaque fois que tu change le style d'une cellule, la feuille s'actualise, et donc les formules aussi. C'est le but du jeu ?

Cordialement
Luke
AOO 4.1.3 et LibO 5.3.7.2 Ubuntu 16.04 LTS et Debian 9
Xray ne tient pas lieu de tout, mais une pratique sans Xray ne vaut pas grand chose
Bosluc
Membre hOOnoraire
Membre hOOnoraire
Messages : 181
Inscription : 25 févr. 2009 09:21

Re: [Calc] Cellule colorée en fonction de la position actuel

Message par Bosluc »

Bonjour,
Luky-luke, ça fonctionne bien cette fois sauf pour le style d'origine qu'on ne retrouve pas.
L'idée est venue que dans des logiciels de planning quelque soit l'endroit où on se déplace horizontalement, la cellule où se trouve le nom change de couleur afin de bien visualiser sur quelle personnel on travaille.
Donc là, je me suis dit que ça peut être possible avec un tableur d'avoir un équivalent.
C'est pour ça que j'ai dit précédemment que l'idée est d'avoir le même comportement de ce qui se passe dans la colonne des chiffres où la couleur de la cellule active est gris foncé.
Après je ne sais pas comment est conçu LibreOffice, peut-être qu'il s'agit d'une cellule "calque" ou qu'il y a une mise en mémoire tampon pour retrouver instantanément le style initial, mais peut-être qu'avec vos connaissances en programmation il y a moyen de faire la même chose ?
LibreOffice 5.0.1 sur Windows 10 x64 Edition familiale à la maison.
LibreOffice 4.4.5 sur Windows 7 Entreprise.
Piaf
GourOOu
GourOOu
Messages : 5622
Inscription : 25 nov. 2011 18:07
Localisation : Guyane

Re: [Calc] Cellule colorée en fonction de la position actuel

Message par Piaf »

Bonsoir
luky-luke a écrit :Il suffit de modifier un peu le code de Piaf.
Le code est de zeguedon, je n'ai qu'ajouté la condition :)
Une solution éventuelle à tester.

Code : Tout sélectionner

Option Explicit
Global maCellule
Global Style as String
Global Couleur as Long

Sub Ouverture
	Style = "Par défaut"
	Couleur = -1
End sub

Sub Fermeture
Dim maZone as Object
	maZone = thisComponent.CurrentController.ActiveSheet.getCellRangeByName("A1")
	thisComponent.CurrentController.select(maZone)
End Sub

Sub Main(oEv as Object)
Dim maFeuille as Object, maLigne as Object
Dim Ligne as Long, lngY as Long
	maFeuille = thisComponent.CurrentController.ActiveSheet
	CleanPreFormat
	If oEv.supportsService("com.sun.star.table.Cell") Then
		Ligne = oEv.CellAddress.Row 'numero de ligne sélectionnée
		maCellule = maFeuille.getCellByPosition(1,Ligne) 'sélection de la cellule colonne B correspondant à la ligne sélectionnée
		Style = maCellule.CellStyle
		Couleur = maCellule.CellBackColor
		maCellule.CellStyle = "FondJaune" 'application du style jaune
	ElseIf oEv.supportsService("com.sun.star.table.CellRange") Then
		If oEv.Rows.Count > 1 Then Exit Sub
			maLigne = oEv.Rows.getByIndex(0)
			lngY = maligne.RangeAddress.StartRow
			maCellule = maFeuille.getCellByPosition(1,lngY)
			Style = maCellule.CellStyle
			Couleur = maCellule.CellBackColor			
			maCellule.CellStyle = "FondJaune"			
	End If		
End Sub

Sub CleanPreFormat()
On Error Resume Next
	maCellule.setPropertyValue("CellStyle",Style)
	maCellule.setPropertyValue("CellBackColor", Couleur)
End Sub
Je pars du principe que la cellule B1 n'a pas de formatage particulier. La sélection de plusieurs zones n'est pas traitée.
Et le fichier qui va avec.
A+
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Libre Office Version: 6.1.6 et Apache OpenOffice 4.1.6 Sur Xubuntu 18.04 AMD64
Avatar de l’utilisateur
luky-luke
InconditiOOnnel
InconditiOOnnel
Messages : 936
Inscription : 27 nov. 2010 00:17
Localisation : gâtine deux-sèvrienne

Re: [Calc] Cellule colorée en fonction de la position actuel

Message par luky-luke »

Bonjour
Piaf a écrit :Une solution éventuelle à tester.
:bravo:
Luke
AOO 4.1.3 et LibO 5.3.7.2 Ubuntu 16.04 LTS et Debian 9
Xray ne tient pas lieu de tout, mais une pratique sans Xray ne vaut pas grand chose
zeguedon
ManitOOu
ManitOOu
Messages : 3031
Inscription : 02 juil. 2014 17:25

Re: [Calc] Cellule colorée en fonction de la position actuel

Message par zeguedon »

Bonjour,

Une autre solution qui ne génère pas de clignotement.
L'idée était d'écrire dynamiquement au début de la macro, les infos concernant le style et la position que la cellule qui va passer au jaune pour les récupérer au prochain événement mais je n'y arrive pas par manque d'expérience. J'ai donc contourné en utilisant une cellule tampon pour récupérer le style de la cellule qui va passer au jaune, et sa position.

L'avantage et qu'après fermeture du classeur, la dernière ligne modifiée est mémorisée et retrouvera son état d'origine au prochain événement. J'ai aussi neutralisé la colonne des noms pour permettre de leur appliquer un style personnalisé sans fiche le bazar

Bémol, je n'ai pas réussis à gérer la multi-sélection de cellule (pas vraiment le temps de chercher à comprendre)

Code : Tout sélectionner

Sub Main(oEv as Object)
If oEv.supportsService("com.sun.star.table.Cell") Then
	If oEv.CellAddress.Column = 1 Then 'si sélection colonne B on sort
			Exit Sub
	End If		
	maFeuille = ThisComponent.Sheets(0) 'Feuille1
	maLigne = oEv.CellAddress.Row 'ligne sur laquelle on clique
	maCelluleRepere = maFeuille.getCellByPosition(1,maLigne) 'Cellule qui contient le nom de la ligne sélectionnée
	if maCelluleRepere.CellStyle = "FondJaune" Then	'si on a déjà un fond jaune on sort
		Exit Sub
	Else				
		Style1 = maCelluleRepere.CellStyle 'On récupère le style de la cellule qui va passer au jaune
		Couleur1 = maCelluleRepere.CellBackColor 'idem pour un éventuel formatage direct	
		maCelluleRepere.CellStyle = "FondJaune" 'on donne à la cellule le fond jaune
	End If
	maCelluleArchive = maFeuille.getCellByPosition(0,0)'définition de la cellule archive qui va contenir les infos
	precedenteSelection = maFeuille.getCellByPosition(1,maCelluleArchive.Value) 'on récupère la valeur de la cellule archive 	
	Style = maCelluleArchive.CellStyle 'on récupère le style de la cellule archive
	Couleur = maCelluleArchive.CellBackColor 'idem pour un éventuel fond
	precedenteSelection.CellStyle = Style 'on applique le style à l'ancienne cellule
	precedenteSelection.CellBackColor = Couleur 'idem pour l'éventuelle couleur de fond
	maCelluleArchive.CellStyle = Style1 'on donne à la cellule archive le style de la cellule qui vient de passer au jaune
	maCelluleArchive.CellBackColor = Couleur1 'idem pour l'éventuelle couleur de fond
	maCelluleArchive.Value = oEv.CellAddress.Row 'on écrit dans la cellule archive le numéro de la ligne qui vient de passer au jaune	
End If

End Sub
et le fichier qui va avec :
 Ajout : Finalement, après coup la multi-sélection semble fonctionner sans problème 
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Comment baliser [Résolu] ?
AOO
LibreOffice
Sous Linux