[Résolu][Calc] Menus aléatoires remplis à partir de listes

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 !
jamin_ben4910
NOOuvel adepte
NOOuvel adepte
Messages : 10
Inscription : 20 janv. 2019 09:59

[Résolu][Calc] Menus aléatoires remplis à partir de listes

Message par jamin_ben4910 »


La modération vous a écrit: Sujet déplacé. Ajout de la balise [Calc]

Bonjour à tous, je débute dans OpenOffice,

Je cherche à effectuer un affichage aléatoire dans plusieurs listes déroulante. Dans chacune des mes listes j'ai différente lignes et j'aimerais via un seul bouton, généré aléatoirement l'affichage des lignes tout en me permettant de modifier la/les ligne(s) si la ligne ne me plait pas. J'ai 20 listes déroulante et cliquer sur chaque ligne serait un peu long. Si quelqu'un pourrait m'aider...

Merci d'avance
Dernière modification par jamin_ben4910 le 20 janv. 2019 14:46, modifié 1 fois.
Apache OpenOffice 4.1.7 / Windows 10
Avatar de l’utilisateur
micmac
RespOOnsable forum
RespOOnsable forum
Messages : 9251
Inscription : 28 août 2010 08:45

Re: Listes déroulante aléatoire

Message par micmac »

Bonjour et bienvenue,

Pour faciliter la compréhension de votre question et permettre aux personnes qui vont vous répondre d'y apporter un traitement adapté, joignez un fichier exemple ou votre fichier anonymisé au format ODF.
Comment joindre un fichier
Comment dépersonnaliser un document

Cordialement
jamin_ben4910
NOOuvel adepte
NOOuvel adepte
Messages : 10
Inscription : 20 janv. 2019 09:59

Re: Listes déroulante aléatoire

Message par jamin_ben4910 »

Voilà ci-joint le fameux fichier.
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Apache OpenOffice 4.1.7 / Windows 10
Avatar de l’utilisateur
Jean-Louis Cadeillan
GourOOu
GourOOu
Messages : 5749
Inscription : 02 janv. 2009 23:56

Re: [Calc] Listes déroulante aléatoire

Message par Jean-Louis Cadeillan »

Bonjour,
Dans le fichier joint, le tri aléatoire se fait en appuyant sur Ctrl+Maj+F9. J'ai ajouté en Feuille4 la colonne 1 réservée à un nombre au hasard, créé par la fonction ALEA.ENTRE.BORNES() ; j'y ai ajouté un petit quelque chose pour départager les ex-aequos.
La formule de validité est la suivante :

Code : Tout sélectionner

SI(ESTERREUR(PETITE.VALEUR(SI(INDIRECT($A2)="";"";Hasard);LIGNE($A$1:$A$24)));"";RECHERCHEV(PETITE.VALEUR(SI(INDIRECT($A2)="";"";Hasard);LIGNE($A$1:$A$24));Listes;COLONNE(INDIRECT($A2));0))
Avec Hasard = Feuille4.A2:A25, $A2 qui renvoie à légumes, viandes, féculent, specials, plages nommées respectivement Feuille4.B2:B25, Feuille4.C2:C25, Feuille4.D2:D25 et Feuille4.E2:E25. Cette formule de validité est la même pour toutes les cellules à liste déroulante (ici de Janvier).
Par simple curiosité, quel est l'intérêt d'avoir une liste déroulante qui présente les items dans un ordre aléatoire ?
Cordialement,
Jean-Louis
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
LibO 7.6.6.3 (x64 avec Java 1.8.0_401) et AOO 4.1.15 (avec Java x32 1.8.0_381), Windows 7 Édition Intégrale 64 SP1
jamin_ben4910
NOOuvel adepte
NOOuvel adepte
Messages : 10
Inscription : 20 janv. 2019 09:59

Re: [Calc] Listes déroulante aléatoire

Message par jamin_ben4910 »

Ho excellent merci, le but final serait d'obtenir ce genre de chose (voir fichier ci-joint) avec la fonction aléatoire. Ici j'ai réaliser moi-même la sélection. Les doublons ne sont pas trop grave, car si il y en a un peu de trop, je peu corriger en sélectionnant direct via la liste, sans devoir tout régénérer(modifier) le résultat.
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Apache OpenOffice 4.1.7 / Windows 10
Avatar de l’utilisateur
Jean-Louis Cadeillan
GourOOu
GourOOu
Messages : 5749
Inscription : 02 janv. 2009 23:56

Re: [Calc] Listes déroulante aléatoire

Message par Jean-Louis Cadeillan »

jamin_ben4910 a écrit :Listes déroulante aléatoire
et
jamin_ben4910 a écrit :Je cherche à effectuer un affichage aléatoire dans plusieurs listes déroulante
J'ai l'impression que ni le titre ni les explications initiales ne correspondent à ton problème : il ne s'agit pas d'avoir un affichage aléatoire dans une liste déroulante, mais plutôt de remplir automatiquement des menus aléatoires à partir d'une liste ? Corrige-moi si je me trompe...
Et si je ne me trompe pas... corrige ton titre !
Cordialement,
Jean-Louis
LibO 7.6.6.3 (x64 avec Java 1.8.0_401) et AOO 4.1.15 (avec Java x32 1.8.0_381), Windows 7 Édition Intégrale 64 SP1
jamin_ben4910
NOOuvel adepte
NOOuvel adepte
Messages : 10
Inscription : 20 janv. 2019 09:59

Re: [Calc] Listes déroulante aléatoire

Message par jamin_ben4910 »

Jean-Louis Cadeillan a écrit :mais plutôt de remplir automatiquement des menus aléatoires à partir d'une liste
Oui c'est bien ça.
Apache OpenOffice 4.1.7 / Windows 10
Avatar de l’utilisateur
Hubert Lambert
SuppOOrter
SuppOOrter
Messages : 1214
Inscription : 06 avr. 2016 07:26

Re: [Calc] remplir automatiquement des menus aléatoires à pa

Message par Hubert Lambert »

Bonjour,

Ci-joint un exemple de ce qu'il est possible de faire.
Vu la nature de la demande, c'est en python, qui s'y prête nettement mieux. La macro :

Code : Tout sélectionner

def menu_alea(event=None):
    doc = XSCRIPTCONTEXT.getDocument()
    namedranges = doc.NamedRanges
    aliments = {"légumes": None, "viandes": None,
                  "féculents": None, "spéciaux": None}
    # récolte des aliments
    for categorie in aliments:
        items = namedranges.getByName(categorie).ReferredCells.DataArray
        items = [x[0] for x in items[1:] if x[0]]
        if categorie == "spéciaux":
            items += [""]*len(items)
        aliments[categorie] = items 

    # insertion des régimes
    feuille = doc.CurrentController.ActiveSheet
    curseur = feuille.createCursor()
    curseur.gotoStartOfUsedArea(False)
    curseur.gotoEndOfUsedArea(True)
    COLDEBUT = 0
    colref = tuple(zip(*curseur.DataArray))[COLDEBUT]
    lignes = (n for n, v in enumerate(colref) if v=="légumes")
    for ligne in lignes:
        plagedest = feuille.getCellRangeByPosition(COLDEBUT+1, ligne, COLDEBUT+7, ligne+3)
        regime = cree_menu(aliments)
        plagedest.setDataArray(regime)

def cree_menu(aliments):
    regimes = {}
    for categorie in aliments:
        melange = random.sample(aliments[categorie], len(aliments[categorie]))
        while len(melange) < 7:
            melange += random.sample(melange, len(melange))
        regimes[categorie] = melange
    for n in range(7):
        if regimes["spéciaux"][n]:
            regimes["légumes"][n] = ''
            regimes["viandes"][n] = ''
            regimes["féculents"][n] = ''
    return (tuple(regimes["légumes"][:7]), tuple(regimes["viandes"][:7]),
            tuple(regimes["féculents"][:7]), tuple(regimes["spéciaux"][:7]))
C'est optimisable, et sans doute faudra-t-il l'adapter à ton vrai fichier...
Cordialement.
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
AOOo 4.1.7 sur Win10
AOOo 4.1.x sur Linux Mint
LibreOffice 5.x/6.x sur Linux Mint
--
| « Nos défauts devraient nous donner une qualité : l'indulgence pour les défauts des autres » (Rivarol)
Avatar de l’utilisateur
Jean-Louis Cadeillan
GourOOu
GourOOu
Messages : 5749
Inscription : 02 janv. 2009 23:56

Re: [Calc] remplir automatiquement des menus aléatoires à pa

Message par Jean-Louis Cadeillan »

Bonsoir,
Ci-joint une solution par formule matricielle (ici en B2 de Janvier):

Code : Tout sélectionner

=INDEX(INDIRECT($A2);ALEA.ENTRE.BORNES(1;MAX(SI(INDIRECT($A2)="";"";LIGNE(INDIRECT($A2))))-1))
Le changement aléatoire des menus peut se faire par Ctrl+Maj+F9.
La liste de validité peut être utilisée. La formule de validité est la suivante (ici en B2 de Janvier):

Code : Tout sélectionner

INDIRECT($A2)
Attention, l'usage de la liste de validité va écraser la formule de la cellule. Aussi, une fois la génération au hasard effectuée et validée, il faut passer des formules aux valeurs par un copier/collage spécial (qui peut se simplifier par une petite macro si nécessaire). Toujours garder une feuille modèle pour les formules initiales.
Cordialement,
Jean-Louis
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
LibO 7.6.6.3 (x64 avec Java 1.8.0_401) et AOO 4.1.15 (avec Java x32 1.8.0_381), Windows 7 Édition Intégrale 64 SP1
Piaf
GourOOu
GourOOu
Messages : 5622
Inscription : 25 nov. 2011 18:07
Localisation : Guyane

Re: [Calc] Menus aléatoires remplis à partir de listes

Message par Piaf »

Bonjour
Un petit exemple à tester en Basic

Code : Tout sélectionner

Sub Aleatoire
Dim oDoc as Object, maFeuille as Object, alea as Object, Donnees as Object
Dim oDonnees as Variant, oCol as Variant, x as Integer, Element as String
	oDoc = thisComponent
	oDonnees = Array("Legumes","Viandes","Feculents","Speciaux")
	maFeuille = oDoc.CurrentController.ActiveSheet
	If maFeuille.Name = "Donnees" Then
		MsgBox("La procédure doit être déclenchée dans une feuille correspondant à un mois",0,"Régime")
		Exit Sub
	End If	
	oCol = Array("B","C","D","E","F","G","H")
	x = 1
	For Each Element in oDonnees
		Select Case Element
			Case "Legumes"
				Donnees = oDoc.NamedRanges.getByName(Element).ReferredCells.DataArray
				Alea = Combinaison(UBound(Donnees) + 1,UBound(Donnees) + 1)
				For n = 2 To 26 Step 6
					For i = 0 To UBound(oCol)
						If x > UBound(Alea()) Then
							Alea = Combinaison(UBound(Donnees) + 1,UBound(Donnees) + 1)
							x = 1 : i = i - 1
						Else
							maFeuille.getCellRangeByName(oCol(i) & n).String = Donnees(alea(x)-1)(0)
							x = x + 1
						End If
					Next i
				Next n
				x = 1
			Case "Viandes"
				Donnees = oDoc.NamedRanges.getByName(Element).ReferredCells.DataArray
				Alea = Combinaison(UBound(Donnees) + 1,UBound(Donnees) + 1)
				For n = 3 To 27 Step 6
					For i = 0 To UBound(oCol)
						If x > UBound(Alea()) Then
							Alea = Combinaison(UBound(Donnees) + 1,UBound(Donnees) + 1)
							x = 1 : i = i - 1
						Else
							maFeuille.getCellRangeByName(oCol(i) & n).String = Donnees(alea(x)-1)(0)
							x = x + 1
						End If
					Next i
				Next n
				X = 1		
			Case "Feculents"
				Donnees = oDoc.NamedRanges.getByName(Element).ReferredCells.DataArray
				Alea = Combinaison(UBound(Donnees) + 1,UBound(Donnees) + 1)
				For n = 4 To 28 Step 6
					For i = 0 To UBound(oCol)
						If x > UBound(Alea()) Then
							Alea = Combinaison(UBound(Donnees) + 1,UBound(Donnees) + 1)
							x = 1 : i = i - 1
						Else
							maFeuille.getCellRangeByName(oCol(i) & n).String = Donnees(alea(x)-1)(0)
							x = x + 1
						End If
					Next i
				Next n
				x = 1	
			Case "Speciaux"
				Donnees = oDoc.NamedRanges.getByName(Element).ReferredCells.DataArray
				Alea = Combinaison(UBound(Donnees) + 1,UBound(Donnees) + 1)
				For n = 5 To 29 Step 6
					For i = 0 To UBound(oCol)
						If x > UBound(Alea()) Then
							Alea = Combinaison(UBound(Donnees) + 1,UBound(Donnees) + 1)
							x = 1 : i = i - 1
						Else
							maFeuille.getCellRangeByName(oCol(i) & n).String = Donnees(alea(x)-1)(0)
							x = x + 1
						End If
					Next i
				Next n
				x = 1	
		End Select
	Next
	For i = 0 To 7
		maFeuille.Columns.getByIndex(i).OptimalWidth = True
	Next i
End Sub
La fonction Combinaison est issue du suprême d'alhazred [Basic] Tirage au hasard sans répétition (combinaison). Pour tester, appuyer sur le bouton Générer Feuilles. Aller dans la feuille Janvier et cliquer sur Aléatoire dans la barre d'outils.
Le code est certainement optimisable.
 Ajout : Suite à quelques tests, les références à la validité des listes déroulantes semblent perdues (sous AOO) lors de l'actualisation des zones nommées.
Ci-joint un nouveau fichier (toujours à tester :lol: ), qui prend en compte le problème. 
A+
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Libre Office Version: 6.1.6 et Apache OpenOffice 4.1.6 Sur Xubuntu 18.04 AMD64
jamin_ben4910
NOOuvel adepte
NOOuvel adepte
Messages : 10
Inscription : 20 janv. 2019 09:59

Re: [Calc] Menus aléatoires remplis à partir de listes

Message par jamin_ben4910 »

Piaf a écrit :Bonjour
Un petit exemple à tester en Basi
Merci beaucoup, je viens de regarder ton fichier, j'adore la génération des feuilles avec les dates (super top ) comment est-ce que je peux faire pour qu'il m'affiche le premier élément de chacune des listes après la génération de l'ordre aléatoire des liste?
Apache OpenOffice 4.1.7 / Windows 10
Piaf
GourOOu
GourOOu
Messages : 5622
Inscription : 25 nov. 2011 18:07
Localisation : Guyane

Re: [Calc] Menus aléatoires remplis à partir de listes

Message par Piaf »

Bonjour
Les listes sont toujours les mèmes, la génération des listes ne fait qu'ajouter ou supprimer les entrées saisies dans la première feuille. Ce qui est aléatoire c'est la sélection de l'entrée dans les listes.
Le premier élément de chaque liste est toujours le même.
A+
Libre Office Version: 6.1.6 et Apache OpenOffice 4.1.6 Sur Xubuntu 18.04 AMD64