[Résolu][Calc] Sélection multiple pour format

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 !
ameno
Membre lOOyal
Membre lOOyal
Messages : 46
Inscription : 13 oct. 2010 09:59

[Résolu][Calc] Sélection multiple pour format

Message par ameno »

Bonjour à tous,

Désolé j'avais oublié le balisage :oops:
J'ai trouvé une macro correspondant à mon besoin et en la réadaptant qui permet de chercher toutes les formules dans la feuille1, suite à cela je voulais mettre en surbrillance ces cellules, pour une cellule c'est ok, en sélection adjacente c'est bon aussi dès qu'il y a sélection non adjacente ça plante

En cherchant j'ai trouvé un lien qui me renvoie sur "com.sun.star.sheet.SheetCellRanges" ou "com.sun.star.sheet.SheetCellRange" mais là j'ai vraiment du mal à exploiter cela me semble bien compliqué pour un simple format, en fait je n'arrive pas à comprendre pourquoi ne peut-on pas exploiter directement la sélection renvoyée ?

Le code est inclus dans le message, je joins éventuellement le fichier
Merci pour vos réponses

Code : Tout sélectionner

    Sub essai_recherche()
    Dim oDoc As Object, maFeuille As Object
    Dim recherche As Object, trouve As Object

       oDoc = ThisComponent
       maFeuille = oDoc.Sheets.getByName("Feuille1")
       
       
       recherche = maFeuille.createSearchDescriptor
       With recherche
       ' Trouver "=" premier caractère
          .SearchString = "^="
          .SearchRegularExpression = True
       End With
       
       trouve = maFeuille.findAll(recherche)
       
    ' Visu plage pour controle
    msgbox trouve.absolutename

    ' OK pour sélection
    oDoc.CurrentController.select(trouve)

    ' Ok pour une cellule ou adjacent ne fonctionne pas en multi-sélection
    oDoc.Sheets.getByName("Feuille1").GetCellRangeByName(trouve.absolutename).CellBackColor = rgb(255,120,125)

    End Sub
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Dernière modification par ameno le 12 sept. 2015 11:11, modifié 3 fois.
Libre Office 4.3.6.2
Windows 7
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] Sélection multiple pour format

Message par Dude »

Salut,
ameno a écrit :J'ai trouvé une macro correspondant à mon besoin et en la réadaptant qui permet de chercher toutes les formules dans la feuille1
Je ne sais pas où tu as pêché cette macro mais elle ne me semble pas adaptée.
Pour savoir si une cellule contient une formule, il est inutile de créer un curseur pour lancer une recherche.
Cette méthode est faillible si la cellule contient une chaîne texte démarrant par =.
Il suffit tout simplement d'utiliser la méthode getType pour savoir si elle renvoie bien le type com.sun.star.table.CellContentType.FORMULA.

:idea:
ameno
Membre lOOyal
Membre lOOyal
Messages : 46
Inscription : 13 oct. 2010 09:59

Re: [Calc] Sélection multiple pour format

Message par ameno »

Bonjour Dude,

Pour la macro c'est là : https://forum.openoffice.org/fr/forum/v ... or#p257830

Pour le GetType je pense avoir compris, mais cela oblige à déclarer une plage et faire une boucle c'est ça ? La recherche me semble plus pratique dans le sens ou je ne connais pas la zone à l'avance et que du coup je laisse tomber la déclaration des cellules

Pour la chaine texte débutant par = pour l'instant je vais résoudre le point après, ce qui me pose problème c'est pourquoi je ne peux pas formater avec une sélection non contigüe

Merci
Libre Office 4.3.6.2
Windows 7
Piaf
GourOOu
GourOOu
Messages : 5622
Inscription : 25 nov. 2011 18:07
Localisation : Guyane

Re: [Calc] Sélection multiple pour format

Message par Piaf »

Bonjour
Un petit exemple à partir de ta macro.

Code : Tout sélectionner

Option Explicit
Sub essai_recherche()
Dim oDoc As Object, maFeuille As Object, maCellule as Object
Dim recherche As Object, trouve As Object, oSelection as Object, zoneSel as Object
Dim i as Integer, x as integer, y as Integer
	oDoc = ThisComponent
	maFeuille = oDoc.Sheets.getByName("Feuille1")
	recherche = maFeuille.createSearchDescriptor
	With recherche
		.SearchString = "^="
		.SearchRegularExpression = True
	End With
	trouve = maFeuille.findAll(recherche)
	oDoc.CurrentController.select(trouve)
	oSelection = ThisComponent.CurrentSelection
	If oSelection.supportsService("com.sun.star.sheet.SheetCellRanges") Then
		For i = 0 To oSelection.Count -1
			zoneSel = oSelection(i).RangeAddress
			For x = zoneSel.StartColumn To zoneSel.EndColumn
				For y = zoneSel.startRow To zoneSel.endRow
					maCellule = maFeuille.getCellByPosition(x,y)
					If macellule.type = com.sun.star.table.CellContentType.FORMULA Then maCellule.CellBackColor = rgb(255,120,125)
				Next y
			Next x		
		Next i
	ElseIf oSelection.supportsService("com.sun.star.table.Cell") Then
		maCellule = oDoc.Sheets.getByName("Feuille1").GetCellRangeByName(oselection(x).absolutename)
		If macellule.type = com.sun.star.table.CellContentType.FORMULA Then maCellule.CellBackColor = rgb(255,120,125)
	ElseIf oSelection.supportsService("com.sun.star.table.CellRange") Then
		zoneSel = oSelection.RangeAddress
		For x = zoneSel.StartColumn To zoneSel.EndColumn
			For y = zoneSel.startRow To zoneSel.endRow
				maCellule = maFeuille.getCellByPosition(x,y)
				If macellule.type = com.sun.star.table.CellContentType.FORMULA Then maCellule.CellBackColor = rgb(255,120,125)
			Next y
		Next x
	End If
End Sub
Et la même en plus simple

Code : Tout sélectionner

Sub ColorCellFormule
Dim oDoc as Object, maFeuille as Object,adresse as Object, maZone as Object
Dim Selection as Object, mesCellules as Object, maCellule as Object, uneCellule as Object
	oDoc = thisComponent
	maFeuille = oDoc.CurrentController.ActiveSheet
	adresse = mafeuille.rangeAddress
	maZone = maFeuille.getCellRangeByPosition(adresse.StartColumn,adresse.startRow,adresse.endColumn,adresse.endRow)
	Selection = maZone.queryContentCells(com.sun.star.sheet.CellFlags.FORMULA)
	mesCellules = Selection.Cells
	maCellule = mesCellules.createEnumeration
	Do While maCellule.hasMoreElements
		uneCellule = maCellule.nextElement
		uneCellule.CellBackColor = rgb(255,120,125)
	Loop
End Sub
A+
Libre Office Version: 6.1.6 et Apache OpenOffice 4.1.6 Sur Xubuntu 18.04 AMD64
ameno
Membre lOOyal
Membre lOOyal
Messages : 46
Inscription : 13 oct. 2010 09:59

Re: [Calc] Sélection multiple pour format

Message par ameno »

Bonjour Piaf,

:shock: Whaouh ! Effectivement je ne pensais pas qu'il existait un module spécifique pour la sélection non contigüe

Je vais maintenant disséquer la macro et je reviendrais pour des questions éventuelles

Merci encore
Libre Office 4.3.6.2
Windows 7
ameno
Membre lOOyal
Membre lOOyal
Messages : 46
Inscription : 13 oct. 2010 09:59

Re: [Résolu] [Calc] Sélection multiple pour format

Message par ameno »

Le modérateur a écrit : Merci de ne pas poster plusieurs messages à la suite, si vous devez ajouter un complément d'information, le bouton Editer à la droite du message permet d'y remédier.
En attendant une prochaine réponse, vous pouvez participer également en répondant à d'autres questions sur notre forum.
Rebonjour,

J'ai donc repris les macros de Piaf dans le post précédent et notamment la version simplifiée que j'ai commentée pour plus de compréhension

J'ai consulté la doc SDK surtout concernant la boucle énumération et je voulais savoir si mes commentaires étaient corrects
D'autre part je ne comprends pas bien le but de la ligne que j'ai placée entre tirets à savoir

Code : Tout sélectionner

'mesCellules = Selection.Cells
la macro fonctionne bien sans cela en reprenant directement la variable Selection

Merci

Code : Tout sélectionner

 Sub ColorCellFormule
    Dim oDoc as Object, maFeuille as Object,adresse as Object, maZone as Object
    Dim Selection as Object, mesCellules as Object, maCellule as Object, uneCellule as Object
    
' Déclaration document
oDoc = thisComponent

' Déclaration feuille active       
maFeuille = oDoc.CurrentController.ActiveSheet

' Déclaration de la plage de cellules       
adresse = mafeuille.rangeAddress

' Enregistrement de la plage par position (début colonne, début ligne, fin colonne, fin ligne)
' Sur feuille entière par défaut
maZone = maFeuille.getCellRangeByPosition(adresse.StartColumn,adresse.startRow,adresse.endColumn,adresse.endRow)

' Enregistrement des références contenant des formules
Selection = maZone.queryContentCells(com.sun.star.sheet.CellFlags.FORMULA)

'-------------------------
'mesCellules = Selection.Cells
'-------------------------

' Création de la liste objets cellule    
maCellule = Selection.createEnumeration

	' Boucle tant que liste contient des objets cellules
	Do While maCellule.hasMoreElements
	
		' Passer à l'objet suivant
		uneCellule = maCellule.nextElement
	
		' Formatage
		uneCellule.CellBackColor = rgb(255,120,125)

	Loop
    End Sub
Libre Office 4.3.6.2
Windows 7
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] Sélection multiple pour format

Message par Dude »

ameno a écrit :mais cela oblige à déclarer une plage
Je ne vois pas de code miracle qui fonctionnerait sans.
ameno a écrit :la macro fonctionne bien sans cela en reprenant directement la variable Selection
Plutôt que la doc SDK, sers toi de XRay.
L'objet Selection(1) ou mesCellules(2) peut servir à une énumération.
La différence réside dans l'accès aux propriétés :
  1. service SheetCellRanges
  2. service SheetCell
ameno
Membre lOOyal
Membre lOOyal
Messages : 46
Inscription : 13 oct. 2010 09:59

Re: [Calc] Sélection multiple pour format

Message par ameno »

Hello Dude

Ok j'ai vu je passe en résolu
Merci
Libre Office 4.3.6.2
Windows 7