[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 !

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

Messagepar migrec » 01 Avr 2019 21:48

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   AgrandirRéduire
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 édition par migrec le 10 Avr 2019 09:31, édité 4 fois.
LibreOffice 6.1.2.1 dernière version disponible sous Kubuntu 18.10
migrec
Membre OOrganisé
Membre OOrganisé
 
Message(s) : 82
Inscrit le : 16 Oct 2012 21:02

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

Messagepar OOotremer971 » 01 Avr 2019 22:11

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
Ubuntu
OpenSuse Leap
Avatar de l’utilisateur
OOotremer971
HédOOniste
HédOOniste
 
Message(s) : 2096
Inscrit le : 16 Avr 2010 14:31

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

Messagepar migrec » 01 Avr 2019 22:36

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 6.1.2.1 dernière version disponible sous Kubuntu 18.10
migrec
Membre OOrganisé
Membre OOrganisé
 
Message(s) : 82
Inscrit le : 16 Oct 2012 21:02

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

Messagepar Noonours » 02 Avr 2019 00:19

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   AgrandirRéduire
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

N’HÉSITEZ SURTOUT PAS À JOINDRE UN FICHIER

LibO 6.2.7.1 sous Windows 10
LibO 5.0.6.3 (obligation de version) sous Win 7
Avatar de l’utilisateur
Noonours
Membre cOOnverti
Membre cOOnverti
 
Message(s) : 309
Inscrit le : 11 Mai 2013 01:11
Localisation : Aix en Provence

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

Messagepar Piaf » 02 Avr 2019 12:38

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   AgrandirRéduire
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é 17 fois
Libre Office Version: 6.1.6 et Apache OpenOffice 4.1.6 Sur Xubuntu 18.04 AMD64
Piaf
GourOOu
GourOOu
 
Message(s) : 5622
Inscrit le : 25 Nov 2011 19:07
Localisation : Guyane

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

Messagepar migrec » 02 Avr 2019 15:35

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 6.1.2.1 dernière version disponible sous Kubuntu 18.10
migrec
Membre OOrganisé
Membre OOrganisé
 
Message(s) : 82
Inscrit le : 16 Oct 2012 21:02

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

Messagepar OOotremer971 » 04 Avr 2019 02:57

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é 333 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   AgrandirRéduire
=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   AgrandirRéduire
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   AgrandirRéduire
'oDoc.Sheets.removeByName("Liste")
'zdn.removeByName("Plage")


A+
En principe, toujours à jour des dernières versions dites stables
AOO
LibreOffice
Ubuntu
OpenSuse Leap
Avatar de l’utilisateur
OOotremer971
HédOOniste
HédOOniste
 
Message(s) : 2096
Inscrit le : 16 Avr 2010 14:31

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

Messagepar migrec » 08 Avr 2019 19:50

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é 12 fois
LibreOffice 6.1.2.1 dernière version disponible sous Kubuntu 18.10
migrec
Membre OOrganisé
Membre OOrganisé
 
Message(s) : 82
Inscrit le : 16 Oct 2012 21:02

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

Messagepar OOotremer971 » 08 Avr 2019 22:41

Bonjour,

Remplace dans mon précédent code :
Code : Tout sélectionner   AgrandirRéduire
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   AgrandirRéduire
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é 14 fois
En principe, toujours à jour des dernières versions dites stables
AOO
LibreOffice
Ubuntu
OpenSuse Leap
Avatar de l’utilisateur
OOotremer971
HédOOniste
HédOOniste
 
Message(s) : 2096
Inscrit le : 16 Avr 2010 14:31

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

Messagepar migrec » 09 Avr 2019 20:26

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 6.1.2.1 dernière version disponible sous Kubuntu 18.10
migrec
Membre OOrganisé
Membre OOrganisé
 
Message(s) : 82
Inscrit le : 16 Oct 2012 21:02

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

Messagepar OOotremer971 » 10 Avr 2019 00:26

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é 15 fois
Fichier_PDF_Obtenu.zip
(29.98 Kio) Téléchargé 12 fois
En principe, toujours à jour des dernières versions dites stables
AOO
LibreOffice
Ubuntu
OpenSuse Leap
Avatar de l’utilisateur
OOotremer971
HédOOniste
HédOOniste
 
Message(s) : 2096
Inscrit le : 16 Avr 2010 14:31


Retour vers Macros et API

Qui est en ligne ?

Utilisateur(s) parcourant ce forum : Aucun utilisateur inscrit et 4 invité(s)