XL 2019 Améliorer le temps de recalcul

st007

XLDnaute Barbatruc
Bonjour,
Ce morceau de fichier fonctionne selon mes besoins, puisque réduit à 20 lignes.
Or le fichier complet évolue chaque semaine et comporte désormais 2000 lignes environs par onglet steam,diesel,electrique, maglev et hyperloop
j'ai donc en feuil6 2000 formules matricielle avec la fonction indirect pour "selectionner" l"onglet de recherche ainsi que le "player" de référence en fonction de A1, B1, C1
Le but est de lister les loco dont le "player"(b1) "Need"(c1) et afficher les "player" les possédant marqué "Own"
ou en choisissant Own en C1 d'afficher les loco que le player en B1 "own" et de lister les joueurs les ayant marquer "need"

Et le soucis est devenu le temps de recalcul, avec power query, le temps de calcul est similaire et tourne aux allentours des 15 secondes. Du moins de la manière dont j'ai opéré.
Rien de vital donc, mais un point de vue extérieur me permettrais sans doutes d'évoluer, en formule, en query, ou en vba

Merci d'avance du temps consacré à mon sujet
 

Pièces jointes

  • Locos forum.xlsm
    134.3 KB · Affichages: 19

st007

XLDnaute Barbatruc
Re St, Job,
J'ai enfin compris la philosophie.
Une V3. Si Need on les les Own. Si Own on liste les Need.
Par contre je ne sais pas quoi faire des Collected.
Mais au moins ça avance.
C'est tout à fait çà . Les collected sont celles que j'ai reçues mais que je ne suis pas en mesure d'envoyer.
Le principe serait le même pour une collection de carte marvel du leclerc ou Auchan, les Panini pour le foot.
Le but est de tout avoir . On a des doubles ("Own"), on peut en recevoir ("collected") , et en manquer (need)
Il est donc intéressant de savoir qui recherche tes doubles (c1 own)
et qui possède en double celle qu'il te manque (need)

Ta collection est terminée quand tu les a toutes collected et/ou own (les own sont alors des doubles)
 

st007

XLDnaute Barbatruc
Bonjour,

J'ai peut-être pas tout compris, mais voici deux requêtes
La première se contente de filtrer sur les critères en A1:A3
A1:A3 => Nommé "Critères"
La deuxième qui ensuite ramène et compte tous les players qui ne sont pas c ("Own ou collected ou needed")

La mise à jour est faite lorsqu'un critère de A1:A3 change si les 3 critères sont présents.

Attention dans vos données vous avez des espaces trainantes "Own " ou "Own " au lieu de "Own" idem pour les autres valeurs. Si vous ne corrigez pas vous pouvez faire la sélection des lignes par Text.StartsWith, comme dans le fichier joint ou Text.Contains.
Mais l'égalité est toujours préférable quand on veut gagner en temps d'exécution.

Cordialement
la manièré dont tu pose les critères , j'en étais loin ...
pour ma compréhension, la ligne résultat =, dans le vrai fichier, les players sont indiqués "1 Prénom nom", "2 prenom nom", etc Comment dois-je modifier ?

VB:
let
    Source = Excel.CurrentWorkbook(),
    Critere = Source{[Name = "Criteres"]}[Content]{0}[Column3],
    Tableau = "Tableau" & Source{[Name = "Criteres"]}[Content]{0}[Column1],
    Player = Source{[Name = "Criteres"]}[Content]{0}[Column2],
    Datas = Source{[Name=Tableau]}[Content],
    Résultat = Table.SelectRows(Datas, each Text.StartsWith(Record.Field(_,Player), Critere)),
    Personnalisé1 = Table.SelectColumns(Résultat,{"REC","LOCO"} & List.Select(Table.ColumnNames(Résultat),each Text.StartsWith(_,"Player"))),
    #"Supprimer le tableau croisé dynamique des autres colonnes" = Table.UnpivotOtherColumns(Personnalisé1, {"REC", "LOCO"}, "Player", "Valeur"),
    #"Lignes filtrées1" = Table.SelectRows(#"Supprimer le tableau croisé dynamique des autres colonnes", each ( Text.Trim([Valeur])= "Need")),
    #"Lignes groupées" = Table.Group(#"Lignes filtrées1", {"LOCO", "Valeur"}, {{"Nombre", each Table.RowCount(_), Int64.Type}, {"Qui", each _[Player]}}),
    #"Valeurs extraites" = Table.TransformColumns(#"Lignes groupées", {"Qui", each Text.Combine(List.Transform(_, Text.From), "; "), type text}),
    #"Colonnes supprimées" = Table.RemoveColumns(#"Valeurs extraites",{"Valeur", "Nombre"})
in
    #"Colonnes supprimées"
 

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour,

dans le vrai fichier, les players sont indiqués "1 Prénom nom", "2 prenom nom", etc Comment dois-je modifier

Avec les fonctions de liste appliquée à la liste des noms de colonnes.
Ci-dessous quelques exemples.
Si dans vos tableaux les noms de joueurs sont toujours après les N premières colonne vous pouvez utilisez List.Range
Vous pouvez également les sélectionner par exclusions des autres colonnes avec List.Différence
Il est aussi possible d'employer une fonction personnelle en deuxième paramètre de List.Select (voir dernier exemple) pour ne retenir que les noms de colonnes préfixés (ou suffixés) par un nombre (suivi d'une espace).
Et on peut inventer encore une foule de possibilités.

Testé sur le tableau "TableauDiesel"
let
Source = Table.ColumnNames(Excel.CurrentWorkbook(){[Name="TableauDiesel"]}[Content]),
/* sélection par différence de deux listes */
ListDifference = List.Difference(Source,{"REC","LOCO", "TYPE", "PWR"}),
/* sélection par décalage (en sautant les 4 premiers)*/
#"ListRange tous joueurs" = List.Range(Source,4),
/* sélection de 34 par décalage (eb sautant les 4 premiers) */
#"ListRange 34 joueurs" = List.Range(Source,4,34),
/* sélection des noms préfixés pas un nombre */
#"ListSelectJoueurs indéxés" = List.Select(Source,each try Value.Is(Number.From(Text.Split(_," "){0}), type number) otherwise false)
in
#"ListSelectJoueurs indéxés"
Fonctions de liste :
 

Discussions similaires

Statistiques des forums

Discussions
312 111
Messages
2 085 407
Membres
102 884
dernier inscrit
Macarena