[Résolu] [Calc] Lister les valeurs possibles d'une liste de

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 !
migrec
Membre hOOnoraire
Membre hOOnoraire
Messages : 108
Inscription : 16 oct. 2012 22:02

[Résolu] [Calc] Lister les valeurs possibles d'une liste de

Message par migrec »

Bonjour,

Sur l'une de mes feuilles de calcul, j'ai une liste déroulante (peuplée selon une liste de validité comprenant une plage de cellules) qui actualise d'autres données. Actuellement pour imprimer l'ensemble de mes "fiches", je sélectionne mes valeurs les unes après les autres et j'imprime.
Je cherche à imprimer tout en une seule fois : l'idée serait de copier cette feuille dans un nouveau classeur autant de fois qu'il y a de valeurs avant d'imprimer ou d'exporter en PDF le tout.

Je bloque sur la récupération des différentes valeurs possibles :

Code : Tout sélectionner

dim oClasseur as object, oCell as object, oFeuille as object, oFeuilles as object
dim sListe as string
dim i as long
dim sTableau

oCell = thiscomponent.sheets.getByName("Fiches").getCellRangeByName("D7")
sListe = oCell.getPropertyValue("Validation").Formula1
sListe contient : $'Inscriptions'.$AD$2:$'Inscriptions'.$AD$898

Comment trouver les valeurs possibles ?
Dernière modification par migrec le 10 avr. 2019 10:31, modifié 4 fois.
LibreOffice 7 dernière version disponible sous Kubuntu 21.10 / Windows 10
Avatar de l’utilisateur
OOotremer971
ManitOOu
ManitOOu
Messages : 2744
Inscription : 16 avr. 2010 15:31

Re: [calc] Lister les valeurs possibles d'une liste de valid

Message par OOotremer971 »

Bonjour,

Nous sommes d'accord que les explications sont claires et compréhensibles, néanmoins sans fichier exemple je doute fort que tu reçoives une aide pertinente.
En plus des explications, la structure du fichier est indispensable à la réalisation d'une solution.
Merci de joindre un fichier dépersonnalisé.

A+

PS: la balise Calc s’orthographie avec un C majuscule au début
En principe, toujours à jour des dernières versions dites stables
AOO
LibreOffice
Debian 10 et 11
migrec
Membre hOOnoraire
Membre hOOnoraire
Messages : 108
Inscription : 16 oct. 2012 22:02

Re: [Calc] Lister les valeurs possibles d'une liste de valid

Message par migrec »

Bonjour,

Merci pour la réponse. Je tacherais d'anonymiser les données contenues à l'intérieur ou de faire un exemple très simple.
LibreOffice 7 dernière version disponible sous Kubuntu 21.10 / Windows 10
Avatar de l’utilisateur
Noonours
PassiOOnné
PassiOOnné
Messages : 501
Inscription : 11 mai 2013 02:11
Localisation : Aix en Provence

Re: [Calc] Lister les valeurs possibles d'une liste de valid

Message par Noonours »

Bonjour migrec, le forum

Puisque tes lignes de script te renvoient les coordonnées au format chaîne de caractères de la zone de la liste de validité, je tente ce raccourci pas très élégant mais qui permet de récupérer sous forme de tableau tes données:

Code : Tout sélectionner

dim oClasseur as object, oCell as object, oFeuille as object, oFeuilles as object
dim sListe() as string, sNomZone As String
dim i as long
dim sTableau

oFeuille = thiscomponent.sheets.getByName("Fiches")
oCell = oFeuille.getCellRangeByName("D7")
sNomZone = oCell.getPropertyValue("Validation").Formula1
sListe = oFeuille.getCellRangeByName(sNomZone).DataArray
COOordialement,
Noonours procrastinateur perfectionniste: "Je fais rien, mais demain je l'ferai mieux"

Pour obtenir la réponse la plus précise possible, VEUILLEZ JOINDRE UN FICHIER

LibO 7.6.5.2 Stable et OpenOffice 4.1.15 sous Windows 10
Piaf
GourOOu
GourOOu
Messages : 5622
Inscription : 25 nov. 2011 19:07
Localisation : Guyane

Re: [Calc] Lister les valeurs possibles d'une liste de valid

Message par Piaf »

Bonjour
Comme précisé par OOotremer971 un fichier est préférable à un seul bout de code :)
$'Inscriptions'.$AD$2:$AD$898
une liste de plus de 800 entrées !
Un petit exemple sur 10 entrées

Code : Tout sélectionner

Sub Main
Dim oDoc as Object, maFeuille as Object, laFeuille as Object, maCellule as Object, laZone as Object
Dim maZone as Variant, i as Integer
	oDoc = thisComponent
	maFeuille = oDoc.Sheets.getByName("Fiches")
	maCellule = maFeuille.getCellRangeByName("D7")
	maZone = Split(maCellule.Validation.Formula1,".")
	laFeuille = oDoc.Sheets.getByName(split(maZone(0),"$")(1))
	laZone = laFeuille.getCellRangeByName(maZone(1))
	for i = 0 To UBound(laZone.DataArray)
		maCellule.String = laZone.dataArray(i)(0)
		Wait 1000
	Next i
	maCellule.String = ""	
End Sub
A+
Pièces jointes
migrec.ods
(9.5 Kio) Téléchargé 144 fois
Libre Office Version: 6.1.6 et Apache OpenOffice 4.1.6 Sur Xubuntu 18.04 AMD64
migrec
Membre hOOnoraire
Membre hOOnoraire
Messages : 108
Inscription : 16 oct. 2012 22:02

Re: [Calc] Lister les valeurs possibles d'une liste de valid

Message par migrec »

Piaf a écrit :Bonjour
Comme précisé par OOotremer971 un fichier est préférable à un seul bout de code :)
$'Inscriptions'.$AD$2:$AD$898
une liste de plus de 800 entrées !
Un petit exemple sur 10 entrées
C'est effectivement prévu pour 999 entrées à la base mais ce sont des catégories dans ces cellules donc on arrive à une vingtaine de sélection à traiter.

Je vais regarder attentivement le code. Merci
LibreOffice 7 dernière version disponible sous Kubuntu 21.10 / Windows 10
Avatar de l’utilisateur
OOotremer971
ManitOOu
ManitOOu
Messages : 2744
Inscription : 16 avr. 2010 15:31

Re: [Calc] Lister les valeurs possibles d'une liste de valid

Message par OOotremer971 »

Bonjour,

En fait, tu veux trier et dédoublonner ta plage $'Inscriptions'.$AD$2:$'Inscriptions'.$AD$898 sous forme de liste !?

Tu peux y parvenir avec une formule matricielle (merci Jean-Loius Cadeillan que je salue au passage) :

1) il faut créer une zone nommée (Plage pour la circonstance) par le raccourci clavier Ctrl+F3 :
Sélection_003.png
Sélection_003.png (14.82 Kio) Consulté 2520 fois
2) créer une nouvelle feuille nommée Liste

3) valider la formule suivante par Ctrl+Maj+Entrée dans la cellule A1 de la feuille Liste:

Code : Tout sélectionner

=INDEX(Plage;EQUIV(MIN(SI(NB.SI($A$1:A1;Plage)=0;SI(Plage<>"";NB.SI(Plage;"<"&Plage);"")));SI(NB.SI($A$1:A1;Plage)=0;SI(Plage<>"";NB.SI(Plage;"<"&Plage);""));0))
4) étirer la formule vers la bas en maintenant la touche Ctrl enfoncée

A partir de là, il suffit de parcourir par macro la liste obtenue pour récupérer chacun des items en vue d'un traitement et de la supprimer ensuite si besoin.

Pour le fun, une macro qui fait le job :

Attention si ton fichier contient déjà une plage nommée Plage et/ou une feuille nommée Liste, elles seront supprimées par la macro

Code : Tout sélectionner

Option Explicit

Sub main()
Dim oDoc As Object
Dim oCell As Object
Dim zdn As Object
Dim nf As Object
Dim nfA1 As Object
Dim nfB1 As Object
Dim vecteur As Variant
Dim v As String
Dim sListe As String
Dim liste As String
Dim i As Long

'"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
'Reprise de ton code
'"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
oCell = thiscomponent.sheets.getByName("Fiches").getCellRangeByName("D7")
sListe = oCell.getPropertyValue("Validation").Formula1
'"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""


oDoc = Thiscomponent
REM oDoc.CurrentController.Frame.ContainerWindow.Enable = False
zdn = oDoc.NamedRanges
if zdn.hasByName("Plage") then
	zdn.removeByName("Plage")
end if
zdn.addNewByName("Plage", sListe, oCell.CellAddress,0)

if oDoc.Sheets.hasByName("Liste") Then
	oDoc.Sheets.removeByName("Liste")
end if
oDoc.Sheets.insertNewByName("Liste", oDoc.Sheets.Count)
nf = oDoc.Sheets.GetByIndex(oDoc.Sheets.Count - 1)
nfA1 = nf.GetCellByPosition(0,0)
nfB1 = nf.GetCellByPosition(1,0)
nfA1.SetFormula("=SUMPRODUCT(1/COUNTIF(IF(Plage<>"""";Plage);IF(Plage<>"""";Plage)))-1")
nfB1.ArrayFormula = "=INDEX(Plage;MATCH(MIN(IF(COUNTIF($B$1:B1;Plage)=0;IF(Plage<>"""";COUNTIF(Plage;""<""&Plage);"""")));IF(COUNTIF($B$1:B1;Plage)=0;IF(Plage<>"""";COUNTIF(Plage;""<""&Plage);""""));0))"
nf.GetCellRangeByPosition(1,0,1,nfA1.Value-1).fillAuto(com.sun.star.sheet.FillDirection.TO_BOTTOM, 1)
vecteur = nf.GetCellRangeByPosition(1,0,1,nfA1.Value-1).DataArray
For i = LBound(vecteur) To UBound(vecteur)
	v = vecteur(i)(0)
	liste = liste & v & Chr(10)
	msgBox v
Next
msgBox liste
'oDoc.Sheets.removeByName("Liste")
'zdn.removeByName("Plage")
REM oDoc.CurrentController.Frame.ContainerWindow.Enable = True
End Sub
Si tu veux que le code supprime la feuille liste et la plage nommée, il faut dé-commenter les deux avant dernières lignes en retirant l'apostrophe en début de ligne :

Code : Tout sélectionner

'oDoc.Sheets.removeByName("Liste")
'zdn.removeByName("Plage")
A+
En principe, toujours à jour des dernières versions dites stables
AOO
LibreOffice
Debian 10 et 11
migrec
Membre hOOnoraire
Membre hOOnoraire
Messages : 108
Inscription : 16 oct. 2012 22:02

Re: [Calc] Lister les valeurs possibles d'une liste de valid

Message par migrec »

Bonjour,

C'est vrai que j'étais partit sur une fonction Basic qui listerait toutes les entrées valides d'une liste de sélection.

Dans mon tableur j'ai effectivement déjà la liste des items uniques possibles donc je pourrais me baser dessus.

Pour imprimer ou exporter en PDF, j'ai dans l'idée d'ouvrir un nouveau classeur, d'y copier ma feuille source autant de fois que nécessaire avec la bonne valeur dans la cellule. Est-ce une bonne manière de gérer ça ? Je vais devoir copier-coller les valeurs, les nombres le format mais aussi le format de la page.
Es-ce qu'il y a une autre manière de procéder ?

En PJ ma fiche aussi simplifiée que possible avec la macr donnée en exemple. Merci beaucoup !
Pièces jointes
ImprimerTousLesChoixPossible.ods
(96.84 Kio) Téléchargé 135 fois
LibreOffice 7 dernière version disponible sous Kubuntu 21.10 / Windows 10
Avatar de l’utilisateur
OOotremer971
ManitOOu
ManitOOu
Messages : 2744
Inscription : 16 avr. 2010 15:31

Re: [Calc] Lister les valeurs possibles d'une liste de valid

Message par OOotremer971 »

Bonjour,

Remplace dans mon précédent code :

Code : Tout sélectionner

For i = LBound(vecteur) To UBound(vecteur)
   v = vecteur(i)(0)
   liste = liste & v & Chr(10)
   msgBox v
Next
msgBox liste
Par

Code : Tout sélectionner

For i = LBound(vecteur) To UBound(vecteur)
   v = vecteur(i)(0)
   oDoc.Sheets.copyByName("Fiches", "Fiche_" & i+1, oDoc.Sheets.Count)
   oDoc.Sheets(oDoc.Sheets.Count - 1).GetCellByPosition(3,6).SetString(v)
Next
Cela va te créer une nouvelle fiche pour chacun des items de la liste avec en D7 le nom de l'item.
Reste plus qu'à imprimer les fiches.
Pour créer un autre fichier, c'est un peu plus complexe mais forcement nécessaire donc si c'est pas une obligation urgente, je viendrai dessus à temps perdu (pas trop le temps en ce moment).

J'ai neutralisé les formules de la zone E11:H11 de la feuille fiche car elle renvoient une erreur.

A+
Pièces jointes
ImprimerTousLesChoixPossible_Mod1.ods
(91.66 Kio) Téléchargé 133 fois
En principe, toujours à jour des dernières versions dites stables
AOO
LibreOffice
Debian 10 et 11
migrec
Membre hOOnoraire
Membre hOOnoraire
Messages : 108
Inscription : 16 oct. 2012 22:02

Re: [Calc] Lister les valeurs possibles d'une liste de valid

Message par migrec »

Bonjour.
Merci pour vos solutions. Je vais tâcher adapter ça à mon besoin, j'ai déjà une très bonne base de travail !
LibreOffice 7 dernière version disponible sous Kubuntu 21.10 / Windows 10
Avatar de l’utilisateur
OOotremer971
ManitOOu
ManitOOu
Messages : 2744
Inscription : 16 avr. 2010 15:31

Re: [Résolu] [Calc] Lister les valeurs possibles d'une liste

Message par OOotremer971 »

En complément, un fichier qui génère un fichier PDF de toutes les fiches (prêt à être imprimé).
Le principe :
une boucle copie la feuille fiche autant de fois que nécessaire, supprime toutes les autres feuilles du classeur avant de l'exporter au format PDF, puis recharge le document sans tenir compte des modifications. Il retrouve donc son état initial.
Le fichier PDF généré est créé dans le même répertoire que le fichier, il conserve le même nom avec le suffixe "_A_IMPRIMER.pdf"

Pense à définir une zone d'impression ($A$7:$H$17) dans ton vrai fichier (en y plaçant correctement les sauts de pages) car c'est elle qui détermine ce qui doit-être exporté dans le pdf.
A+
 Ajout : Si ta liste existe déjà dans ton vrai fichier, ce serait bien que tu nous donnes ses coordonnées, cela permettrait d'éviter la création de la feuille Liste et surtout de la formule matricielle qui prend un demi siècle à s'actualiser pour 1000 lignes. 
Pièces jointes
ExporterFiches.ods
(94.34 Kio) Téléchargé 139 fois
Fichier_PDF_Obtenu.zip
(29.98 Kio) Téléchargé 121 fois
En principe, toujours à jour des dernières versions dites stables
AOO
LibreOffice
Debian 10 et 11
Verrouillé