VBA : Utilisation d'un tableau (à trois dimensions ?)

Y compris Power BI, Power Query et toute autre question en lien avec Excel
Répondre
Avatar du membre
Yvouille
Passionné d'Excel
Passionné d'Excel
Messages : 9'137
Appréciations reçues : 94
Inscrit le : 6 avril 2007
Version d'Excel : 2016

Message par Yvouille » 22 mars 2020, 20:40

Bonsoir,

J’ai un problème de lenteur avec ma macro et j’ai l’impression que la solution pourrait être un tableau.

Mon problème est bien plus complexe que le modèle joint, mais je suis persuadé que si je comprends la logique pour cet exemple, je pourrais l’utiliser pour mon fichier réel.

Merci donc de ne pas me donner de solutions ou idées autres que celle demandée par l’intermédiaire d’un tableau.

Ma macro Sub Essais() démontre le résultat final attendu. C’est-à-dire effectuer un tirage au sort de combinaisons de 3 joueurs, d’en calculer le total de points et d’en garder le meilleur des x essais, selon le nombre indiqué en E2. Bien évidemment que plus le nombre d’essais est élevés, plus grandes sont les chances de trouver une bonne solution, mais la macro mouline passablement si le nombre choisi d’essais est très grand. Le résultat est affiché/réactualisé en I2:J5.

Dans ma macro Sub Essais_Tableau(), j’ai tenté de charger un tableau de ces x essais afin d’en chercher le meilleur par la suite, souhaitant pouvoir effectuer 10'000, 100'000 ou plus d’essais.

Je bloque alors pour le chargement du tableau. J’imagine qu’il faudrait effectuer le même tirage au sort que pour l’autre macro (c’est bon, cette deuxième macro le fait), PUIS enregistrer les 3 lignes et les 2 colonnes de la combinaison 1, soit A2:B3 - ainsi que son total et enregistrer quelque part qu’il s’agit de l’essai 1 (raison pour laquelle je pense qu’il faut un tableau à trois dimensions), PUIS tirer au sort les 3 joueurs du deuxième essai, enregistrer la combinaison 2 ainsi que son total et enregistrer qu’il s’agit de l’essai 2, etc., etc.

Une fois ce tableau chargé de x essais, il faudrait encore pouvoir retrouver la meilleure combinaison.

Dans la réalité, pour chacune de ces combinaisons, je n’ai pas 3 lignes, 2 colonnes et un total comme dans cet exemple, mais 8, 10, 15 lignes selon le nombre de joueurs présents et 41 colonnes de données. Toutefois, pour ce fichier réel, je devrais arriver à m’en sortir sur la base de l’exemple demandé.

Cordialement.
Démo Forum.xlsm
(21.99 Kio) Téléchargé 8 fois
Yvouille

Valais de Coeur
h
h2so4
Passionné d'Excel
Passionné d'Excel
Messages : 9'461
Appréciations reçues : 428
Inscrit le : 16 juin 2013
Version d'Excel : 365 UK Windows 10

Message par h2so4 » 23 mars 2020, 00:19

Bonsoir Yvouille,

une proposition.

Mais si le but est de sélectionner les 3 joueurs qui donnent le meilleur total, il y a plus simple et beaucoup plus rapide.
Démo Forum.xlsm
(22.47 Kio) Téléchargé 4 fois
1 membre du forum aime ce message.
Avatar du membre
Yvouille
Passionné d'Excel
Passionné d'Excel
Messages : 9'137
Appréciations reçues : 94
Inscrit le : 6 avril 2007
Version d'Excel : 2016

Message par Yvouille » 23 mars 2020, 21:20

Salut H2so4,

Merci beaucoup pour ta réponse.

J’avais indiqué dans mon message que dans la réalité il s’agissait de quelque chose de plus compliqué que le tirage de 3 joueurs, mais tu n’as pas dû me lire jusqu’au bout :)

Et comme la solution que tu proposes n’est pas exactement celle que je pensais, je ne vais pas arriver à l’appliquer à mon fichier. Mais peut-être que toi, tu en vois la possibilité ?

Je suis donc obligé de t’expliquer mon fichier.

Il s’agit du tirage d’équipe de pétanque lors de rencontres durant une saison, avec un nombre variable de mêlées par soirée et des joueurs qui nous quittent ou nous rejoignent en cours de saison. On essaie de former le maximum de doublettes et 1,2 ou 3 triplettes selon le nombre de joueurs présents.

Dans le module ‘’Tirage’’, j’ai la macro ‘’Tirage’’. Toute la première partie n’est que la préparation des joueurs présents et des joueurs qui doivent jouer en triplette, selon le nombre de fois qu’ils ont déjà joué précédemment (anciennes parties enregistrées sur la feuille ‘’Archives’’).

Puis dès la ligne 161 de cette macro, je reporte simplement ces joueurs choisis au hasard sur la feuille ‘’Equipes’’. C’est là que je pensais qu’il serait préférable d’enregistrer ces données dans un tableau plutôt que sur cette feuille.

Une fois les joueurs reportés dans les colonnes 2 à 7 de la feuille ‘’Equipes’’, je recherche combien de fois :
A) les différentes paires ont déjà joué ensemble (colonnes 8 à 19 de la feuille ‘’Equipe’’ par rapport aux enregistrements des colonnes 4 à 6 de la feuille ‘’Archives’’)

B) les différentes paires ont déjà joué les l’un contre l’autre (colonnes 22 à 39 de la feuille ‘’Equipe’’ par rapport aux enregistrements des colonnes 7 à 9 de la feuille ‘’Archives’’).

Une fois ces nombres de fois joué ‘’ensemble’’ ou ‘’contre’’, j’enregistre le résultat sur les feuilles ‘’Mémoire Avec’’ et ‘’Mémoires Duo’’.

Je lance alors un deuxième tirage et je compare le nouveau résultat sur la feuille ‘’Equipes’’ avec ceux sur les feuilles ‘’Mémoire Avec’’ et ‘’Mémoires Duo’’.

Si le résultat de la cellule R2C20 (soit O2) du nouveau tirage est meilleur que celui du tirage enregistré sur la feuille ‘’Mémoire Avec’’, je remplace le tirage en place sur la feuille ‘’Mémoires Avec’’.

Je fais un contrôle identique mais avec une pondération entre les cellules R2C20 et R2C40 et compare avec le résultat de la feuille ‘’Mémoire Duo’’. Mais pour l’instant, je ne fais rien avec cette feuille.

En revanche, à la fin du nombre souhaité de tirages (indiqué en R9C6 de la feuille ‘’Base’’), je reprends le meilleur tirage de la feuille ‘’Mémoire Avec’’ que je replace sur la feuille ‘’Equipes’’, ce qui est mon résultat final pour cette mêlée.

Je présume qu’en pouvant enregistrer des milliers d’essais, on devrait arriver à trouver des combinaisons pour lesquels les joueurs ont déjà joué très peu de fois ensemble ou les uns contre les autres, non ?

En règle générale, on arrive en fin de saison à 40 à 50 mêlées.

Amicalement.
Essai Tirage - Démo Forum.xlsm
(91.33 Kio) Téléchargé 9 fois
Yvouille

Valais de Coeur
h
h2so4
Passionné d'Excel
Passionné d'Excel
Messages : 9'461
Appréciations reçues : 428
Inscrit le : 16 juin 2013
Version d'Excel : 365 UK Windows 10

Message par h2so4 » 24 mars 2020, 23:03

Bonsoir Yvouille
J’avais indiqué dans mon message que dans la réalité il s’agissait de quelque chose de plus compliqué que le tirage de 3 joueurs, mais tu n’as pas dû me lire jusqu’au bout :)
je ne sais pas si c'est une réponse à la solution que j'ai proposée ou une remarque à mon commentaire à propos d'une solution plus simple pour 3 joueurs. Je n'ai lu nulle part que tu voulais une solution pour plus de 3 joueurs, tout au plus dis-tu que c'est plus complexe (plus de lignes, plus de colonnes, ...)

Dans tous les cas je t'ai lu jusqu'au bout et j'ai essayé de mon mieux de te proposer une solution sur base de ce que j'ai compris de ta demande, elle ne te convient pas, j'en suis désolé.

J'ai essayé de comprendre ta problématique avec tes explications complémentaires. Là j'avoue que j'ai laché le fil.

mais d'une façon plus générale, tout ce que tu mets dans une feuille peut-être mis dans un tableau à 2 dimensions (numéro de ligne, numéro de colonne). Si tu veux travailler avec le même tableau sur plusieurs feuille, tu peux rajouter une dimension (qui serait le numéro de la feuille), donc oui 3 dimensions.
Modifié en dernier par h2so4 le 25 mars 2020, 09:46, modifié 1 fois.
1 membre du forum aime ce message.
Avatar du membre
eriiic
Passionné d'Excel
Passionné d'Excel
Messages : 9'721
Appréciations reçues : 446
Inscrit le : 7 février 2010
Version d'Excel : 2010fr

Message par eriiic » 24 mars 2020, 23:35

Bonjour,

pas eu le courage de tout lire non plus à cette heure... ;-)
En plus d'un tableau à x dimensions tu peux aussi faire de tableau de tableaux.

Ou bien faire un type personnalisé qui peux contenir autant de variables nommées que tu veux, et même des tableaux (voire même des tableaux de tableaux si tu es doué d'un fort pouvoir d'abstraction ;-) ).
Et te faire un tableau de ce type personnalisé.
Exemple à mettre dans un module standard :
Type tabResult
    Score As Double
    Tabl() As Long
End Type

Sub test()
    Dim resultats() As tabResult ' tableau de type tabResult
    Dim i As Long
    ReDim resultats(1 To 5)
    'init dim tabl
    For i = 1 To 5
        ReDim resultats(i).Tabl(1 To 10, 1 To 10)
    Next i
    'exemple bidon utilisation
    resultats(1).Tabl(2, 3) = 4
    resultats(1).Score = resultats(1).Score + resultats(1).Tabl(2, 3) * 2
End Sub
C'est intéressant surtout si tu veux regrouper plusieurs 'propriétés'.
Sinon resultats(1, 2, 3) est plus simple à écrire que resultats(1).Tabl(2, 3) qui lui peut être un peu plus parlant.
eric

PS : j'ai oublié de dire que ça t'apporte l'intellisense également.
Si tu tapes resultats(1). il te proposera la liste des sous-variables (Score, Tabl ici)
2 membres du forum aiment ce message.
En essayant continuellement, on finit par réussir.
Donc plus ça rate, plus on a de chances que ça marche.
(les Shadoks)

En plus du merci (si si, ça se fait !!!), penser à mettre en résolu. Merci
Avatar du membre
Yvouille
Passionné d'Excel
Passionné d'Excel
Messages : 9'137
Appréciations reçues : 94
Inscrit le : 6 avril 2007
Version d'Excel : 2016

Message par Yvouille » 25 mars 2020, 12:09

Bonjour à vous deux et merci infiniment pour vos réponses.


@ H2so4
Désolé si je me suis mal exprimé. Comme tu avais écrit :" Mais si le but est de sélectionner les 3 joueurs qui donnent le meilleur total, il y a plus simple et beaucoup plus rapide", j'ai pensé que tu n'avais pas vu que j'avais indiqué que c'était plus complexe que ça.

Quand à ta solution, ce n'est vraiment pas qu'elle ne me convient pas, mais je n'arrive pas à comprendre comment l'appliquer à mon problème.


@ eriiic
J'avoue avoir de la peine à comprendre comment appliquer ton idée à mon problème. Tu as écrit : "Ca t'apporte l'intellisense". C'est une faute de frappe ou est-ce vraiment ce que tu voulais écrire. J'ai cherché la définition de ce mot sur internet, sans succès.


@ tous deux
Je vais continuer à chercher une solution sur la base de vos indications. Si nécessaire, je reviendrai vers vous.

Merci encore et bonnes salutations.
Yvouille

Valais de Coeur
Avatar du membre
eriiic
Passionné d'Excel
Passionné d'Excel
Messages : 9'721
Appréciations reçues : 446
Inscrit le : 7 février 2010
Version d'Excel : 2010fr

Message par eriiic » 25 mars 2020, 12:52

Bonjour,

je me suis contenté de répondre à ton interrogation "à 3 dimension ?" pour t'ouvrir d'autres horizons dans ce domaine.

A vrai dire je n'ai ouvert aucun fichier. La question, en première lecture, n'étant pas comment faire ? :-)
Je jetterai un oeil, mais quand et si j'ai un long temps disponible puisque tu annonces une complexité.
D'ailleurs ta question c'est plus Comment faire ? Ou comment faire en plus rapide ?

Une piste de résolution : les algorithmes génétiques. Mais bon, il faut du temps pour comprendre et mettre en place...

L'intellisense (nom de baptême marketing de MS) c'est l'auto-complétion : la liste de choix qui apparait au fil de la saisie ou sur le raccourci Ctrl+espace.
Mots clés : vba intellisense et vba auto-complétion
eric
1 membre du forum aime ce message.
En essayant continuellement, on finit par réussir.
Donc plus ça rate, plus on a de chances que ça marche.
(les Shadoks)

En plus du merci (si si, ça se fait !!!), penser à mettre en résolu. Merci
Avatar du membre
Yvouille
Passionné d'Excel
Passionné d'Excel
Messages : 9'137
Appréciations reçues : 94
Inscrit le : 6 avril 2007
Version d'Excel : 2016

Message par Yvouille » 26 mars 2020, 19:33

Salut eriiic et merci pour tes explications.

Je faisais donc de l'intellisense sans le savoir, comme Monsieur Jourdain faisait de la prose. Je ne savais toutefois pas que ça fonctionnais également avec des variables personnelles. Super conseil, merci :)

Pour le reste, j'avoue nager un peu. J'ai été voir un peu sur internet les algorithmes génétiques, ça vole quand même très haut.

Il me reste l'espoir de ta promesse "quand et si tu as un long temps disponible" :)

Amicalement.
Yvouille

Valais de Coeur
Avatar du membre
eriiic
Passionné d'Excel
Passionné d'Excel
Messages : 9'721
Appréciations reçues : 446
Inscrit le : 7 février 2010
Version d'Excel : 2010fr

Message par eriiic » 26 mars 2020, 23:06

Bonjour,

n'espère pas trop quand même ;-)
J'ai quand même ouvert ton fichier mais j'ai du mal à voir le tenants et aboutissants.
D'autant plus que la pétanque étant un monde que j'ignore je risque de perdre du temps à faire n'importe quoi.
Je ne connais ni les régles, ni les impératifs, ni les préférences à appliquer :bof:
J'ai bien essayé de m'y m'intéresser cette am avec un tournoi à la télé, mais j'ai du mal. Résultat : 4h heures de siestes cette am ::(
eric
En essayant continuellement, on finit par réussir.
Donc plus ça rate, plus on a de chances que ça marche.
(les Shadoks)

En plus du merci (si si, ça se fait !!!), penser à mettre en résolu. Merci
Avatar du membre
eriiic
Passionné d'Excel
Passionné d'Excel
Messages : 9'721
Appréciations reçues : 446
Inscrit le : 7 février 2010
Version d'Excel : 2010fr

Message par eriiic » 27 mars 2020, 11:42

Re,

une question de néophyte :
une doublette peut-elle rencontrer une triplette ?
Jamais ? Exceptionnellement ?
eric
1 membre du forum aime ce message.
En essayant continuellement, on finit par réussir.
Donc plus ça rate, plus on a de chances que ça marche.
(les Shadoks)

En plus du merci (si si, ça se fait !!!), penser à mettre en résolu. Merci
Répondre
  • Sujets similaires
    Réponses
    Vues
    Dernier message