définir cell par croisement étiquette ligne & colonne

Discussions à propos du tableur Calc.
Les questions sur les macros doivent être postées dans la section dédiée en dessous.

Modérateur : Vilains modOOs

Règles du forum
Cette section est uniquement dédiée au tableur Calc. Vous ne devez pas poster ici de questions sur les macros mais utiliser la section éponyme.
Merluche
Fraîchement OOthentifié
Messages : 4
Inscription : 07 oct. 2006 21:02
Localisation : San Miguel de Tucuman-Argentine

définir cell par croisement étiquette ligne & colonne

Message par Merluche »

Bonjour à tous,
Pour rendre mes formules plus lisible je souhaite utiliser les noms de plage ou les étiquettes de ligne et de colonne;
C'est très simple pour les fonctions s'appliquant sur les plages complètes, par exemple "=somme('Salaires')" ou encore "=somme('Pierre')" qui donnent respectivement le total des valeur de la colonne étiquetée 'Salaire' ou de la ligne étiquetée 'Pierre', ligne qui pourrait contenir son salaire, son loyer, ses prélèvements auto ect...
Mais comment pointer vers une céllule d'une plage sans devoir nommer une à une chaque céllule? exemple (qui ne fonctionne pas) "='Salaire'.'Pierre'+'Salaire'.'Jean' " .J'espère que ma question est claire et que les exemples sont parlants... ;-)

Merci de votre aide.

EDTI: reformulation partielle de la question
OOO_2.0.3 sous Mac OS X 10.4.8
Avatar de l’utilisateur
jeanmimi
Grand Maître de l'OOffice
Grand Maître de l'OOffice
Messages : 16960
Inscription : 03 mars 2006 16:02
Localisation : Venise verte

Message par jeanmimi »

bonjour,

Je pense que je n'ai pas dû bien comprendre ...
car ce que tu décris, je le ferai par Insertion/Nom et après je définirai la cellule ou la plage de cellules.
Mais tu attends sans doute autre chose comme réponse.
LibreOffice : Version : 24.2 (x64)(12 avril 2024)
Adoptium JRE ou Oracle JRE (x64), Windows 10, Thunderbird, Firefox
Pierre-Yves Samyn
Grand Maître de l'OOffice
Grand Maître de l'OOffice
Messages : 11276
Inscription : 02 mai 2006 08:42

Message par Pierre-Yves Samyn »

Si je comprends bien, par exemple :

la colonne E est nommée "salaire"
la ligne 8 est nommée "jeanmimi"

on voudrait pouvoir faire "salaire.jeanmimi" au lieu de E8 (c'est vrai que c'est plus parlant)

On pourrait faire :
=INDIRECT(ADRESSE(LIGNE(jeanmimi);COLONNE(Salaire)))

qui donne le bon résultat, mais je doute que cela constitue une réponse acceptable... :lol:
Merluche
Fraîchement OOthentifié
Messages : 4
Inscription : 07 oct. 2006 21:02
Localisation : San Miguel de Tucuman-Argentine

Message par Merluche »

SAlut, Merci pour vos répones
Pierre-Yves a saisi le sens de ma question; je ne souhaite pas renommer une à une toutes les cases de mon tableau. Ce serait donc bien quelque chose du genre =INDIRECT(ADRESSE(LIGNE(jeanmimi);COLONNE(Salaire))) que je cherche; n'y aurait-il pas une syntaxe plus simple? ou moyen de créer une fonction perso qui rende la syntaxe plus simple? genre cel(nom_de_ligne;nom_de_colonne) qui marche aussi d'une fauille à l'autre au sein d'un même classeur...
OOO_2.0.3 sous Mac OS X 10.4.8
Pierre-Yves Samyn
Grand Maître de l'OOffice
Grand Maître de l'OOffice
Messages : 11276
Inscription : 02 mai 2006 08:42

Message par Pierre-Yves Samyn »

Comme je ne trouve pas plus simple avec les fonctions "de base" (mais cela existe peut-être), je propose ci-dessous un exemple de fonction créée par macro. Cette fonction ne peut être copiée dans un module de la bibliothèque Standard d'OOo car elle provoquerait un message d'erreur à l'ouverture du classeur. Il faut donc la copier dans un module du classeur. Elle sera disponible dans toutes les feuilles.

On l'utilise ensuite dans le classeur de la manière suivante :
=PYSCROISE("Martin";"Salaire";A1:G8 )

Nota :
- passer les noms en arguments sous la forme lig;col (autrement dit Martin est en ligne, Salaire en colonne)
- de plus on les passe en texte (entourés de guillemets)
- A1:G8 est la plage complète. Ceci permet de mettre à jour le résultat automatiquement si la plage de données est modifiée. On peut mettre aussi un nom, ce qui est plus pratique. Par exemple :
=PYSCROISE("Martin";"Salaire";MaPlage)
- Dans ce cas, c'est la plage que l'on passe, donc on ne met pas les guillemets...

- si le nom de la fonction ne vous convient pas, il suffit de modifier toutes ses occurrences dans le code (8 si je ne m'abuse)

Code : Tout sélectionner

function PysCroise(PysNom1, PysNom2, PysPlage)
dim PysCell as object, PysLig as integer, PysCol as integer, PysFeuille as integer
if thiscomponent.NamedRanges.hasByName(PysNom1) and thiscomponent.NamedRanges.hasByName(PysNom2) then
	if thiscomponent.NamedRanges.getByName(PysNom1).ReferencePosition.sheet =_
		thiscomponent.NamedRanges.getByName(PysNom2).ReferencePosition.sheet then
		with thiscomponent.NamedRanges.getByName(PysNom1).ReferencePosition
			PysFeuille = .sheet 
			PysLig = .row
		end with
		PysCol = thiscomponent.NamedRanges.getByName(PysNom2).ReferencePosition.column
		PysCell = thiscomponent.sheets(PysFeuille).getCellByPosition(PysCol, PysLig)
		select case PysCell.Type
			case com.sun.star.table.CellContentType.EMPTY
				PysCroise = ""
			case com.sun.star.table.CellContentType.TEXT
				PysCroise = PysCell.string
			case com.sun.star.table.CellContentType.VALUE
				PysCroise = PysCell.value
			case com.sun.star.table.CellContentType.FORMULA
				PysCroise = PysCell.value
			case else				
				PysCroise = "#Type?"
		end select
	else		
	PysCroise = "#Feuilles<>"
	end if
else
	PysCroise = "#Noms N/A"
end if

end function
Dernière modification par Pierre-Yves Samyn le 10 oct. 2006 18:54, modifié 1 fois.
Merluche
Fraîchement OOthentifié
Messages : 4
Inscription : 07 oct. 2006 21:02
Localisation : San Miguel de Tucuman-Argentine

Message par Merluche »

Merci beaucoup, ça va bien m'etre utile; reste à tester le comportement d'une page utilisant la fonction en question chargée sur un autre tableur... tests à suivre.
OOO_2.0.3 sous Mac OS X 10.4.8