Page 1 sur 1

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

MessagePublié: 01 Avr 2019 21:48
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   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 ?

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

MessagePublié: 01 Avr 2019 22:11
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

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

MessagePublié: 01 Avr 2019 22:36
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.

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

MessagePublié: 02 Avr 2019 00:19
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   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,

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

MessagePublié: 02 Avr 2019 12:38
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   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+

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

MessagePublié: 02 Avr 2019 15:35
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

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

MessagePublié: 04 Avr 2019 02:57
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é 313 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+

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

MessagePublié: 08 Avr 2019 19:50
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 !

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

MessagePublié: 08 Avr 2019 22:41
par OOotremer971
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+

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

MessagePublié: 09 Avr 2019 20:26
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 !

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

MessagePublié: 10 Avr 2019 00:26
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.