Power Query Convertir les fonctions Grande.Valeur et Filtre dans Power Qwery

hatem1234

XLDnaute Junior
Bonjour à tous,
J'aurais besoin de votre aide pour convertir une formule Excel dans Power Qwery
Ci-joint une version sommaire d'un tableau contenant plus que 75000 lignes dans la version originale
J'essaye de convertir une formule excel qui contient les fonctions SI, GRANDE.VALEUR et FILTRE
Merci d'avance pour vos idées
 

Pièces jointes

  • Exp Power Qwery.xlsx
    39.7 KB · Affichages: 8

Hasco

XLDnaute Barbatruc
Repose en paix
Bonsoir,

La requête suivante
1 - Elimine d'office les entreprises de moins de 6 salariés.
2 - elle tri par contact et Revenu total
3 - Groupe par contact en gardant que les deux premières lignes qui sont triées (TOP 2)
Et renvoie le tous
Vous verrez qu'il n'y a que pour le contact Daniel qu'il semble y avoir un désaccord avec votre méthodologie.
Pourtant
11225599222 QCDaniel10
$63 405,00​
La ligne ci-dessus a plus de 5 salariés et que $63405 est le deuxième revenu, mais cette ligne n'est pas retenue par votre formule.

Quelle est la priorité des critères ?


Cordialement

[Edit]bonsoir Merinos[/Edit]
 

Pièces jointes

  • hatem1234 Exp Power Qwery.xlsx
    45.2 KB · Affichages: 4

Hasco

XLDnaute Barbatruc
Repose en paix
Re,

Dans le fichier joint, vous trouverez la même requête que précédemment plus une autre qui peut-être sera plus véloce sur un grand nombre de lignes.
Au lieu d'agir par Regroupement, elle Partitionne la table par Contact (autant de tables que de contacts), fait un TOP2 de chaque table pour enfin les recombiner.

Cordialement
 

Pièces jointes

  • hatem1234 Exp Power Qwery.xlsx
    48.4 KB · Affichages: 12
Dernière édition:

hatem1234

XLDnaute Junior
Bonjour à vous deux et un gros merci pour vos suggestions
merinos, je ne vois pas dans ton ficher où tu considère le nombre d'employé qui doit être > 5 et aussi je vois que tu considère le max du revenu à moins que je me trompe mais je voulais utiliser le TOP2 donc le 2ème plus grand revenu est aussi à considérer.
Hasco j'aime ton 2ème fichier même si je ne comprends pas beaucoup l'utilité de la ligne de code Table.Buffer( #"Lignes triées")

En fait je m'aperçois qu'il y a un petit problème dès le départ même avec ma fonction Excel. Chaque contact est lié à un client qui peut avoir plusieurs ID mais ca reste le même client donc un client lié à un contact doit être considéré une seule fois bien sur s'il répond aux autres critères, cad, nb employés > 5 et son revenu total est dans le TOP 2 de tous les clients liés à ce contact

Par exemple, Sébastien est lié à un seul client UNIVERS (qui a 3 ID) donc automatiquement on ne considère que le ID avec le plus gros revenu ayant le nbre d'employé > 5 cad ID = 1250654

1672775359030.png


En résumé, voici les points qu'il faut considérer:

1. On ne prend que les clients ayant plus de 5 employés
2. On regroupe par Contact et NomClient
3. Dans les clients qui restent, on prend un seul ID de chaque groupe de clients ayant le plus gros revenu dans le groupe de client lié à ce contact
4. Dans la liste des ID qui restent, on prend les TOP2 revenus

Merci encore si vous avez une idée
 

Pièces jointes

  • 1672775317118.png
    1672775317118.png
    5 KB · Affichages: 13

hatem1234

XLDnaute Junior
Hello Chris et tous,
Désolé si je poste sur plus qu'un forum car avec plusieurs suggestions différentes on apprend mieux et je ne veux pas prendre une solution toute faite sans en apprendre
Oui j'ai posté sur d'autres forums pour maximiser les chances et désolé si ca ne respecte pas les règles
PVI, je n'ai pas obtenu de solution finale suite à mon dernier post
Merci de votre compréhension
 

Hasco

XLDnaute Barbatruc
Repose en paix
bonjour,

Vous auriez pu dire que vous postiez sur plus d'un forum dès le départ.
Je vais répondre à votre question sur Table.Buffer
Lorsqu'un ordre de tri est important et doit être conservé lors d'une opération de regroupement, il faut bufferiser la table afin d'en figer l'ordre..
Les opérations de regroupement ont tendance a désordonner les lignes.

Pour le reste voyez dans l'autre discussion
 

hatem1234

XLDnaute Junior
bonjour,

Vous auriez pu dire que vous postiez sur plus d'un forum dès le départ.
Je vais répondre à votre question sur Table.Buffer
Lorsqu'un ordre de tri est important et doit être conservé lors d'une opération de regroupement, il faut bufferiser la table afin d'en figer l'ordre..
Les opérations de regroupement ont tendance a désordonner les lignes.

Pour le reste voyez dans l'autre discussion
Bonjour,
Merci beaucoup pour les explications du Table.Buffer
 

job75

XLDnaute Barbatruc
Bonjour hatem1234, le forum,

Pour ceux qui préfèrent le VBA voyez le fichier joint et cette macro :
VB:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim tablo, resu(), i&, n&
With [Tbl_1].ListObject.Range 'tableau structuré
    If Target.Address <> .Cells(1, 6).Address Then Exit Sub
    Cancel = True
    Application.ScreenUpdating = False
    .AutoFilter: .AutoFilter 'si le tableau est filtré
    .Columns(2).Resize(, 2).Insert xlToRight 'insère 2 colonnes auxiliaires
    .Cells(2, 2) = "=N(R[-1]C)+1" 'numérotation
    .Cells(2, 3) = "=REPT(RC[2],RC[3]>5)" 'effectif > 5
    .Columns(2).Resize(, 2) = .Columns(2).Resize(, 2).Value 'supprime les formules
    .Sort .Columns(3), xlAscending, .Columns(7), , xlDescending, Header:=xlYes 'tri sur 2 colonnes
    tablo = .Columns(3).Resize(Application.CountA(.Columns(3))) 'matrice, plus rapide
    ReDim resu(1 To .Rows.Count, 1 To 1)
    resu(1, 1) = .Cells(1, 8) 'en-tête
    For i = 2 To UBound(tablo)
        If tablo(i - 1, 1) <> tablo(i, 1) Then n = 1 Else n = n + 1
        If n < 3 Then resu(i, 1) = "Oui"
    Next
    .Columns(8) = resu 'restitution
    .Sort .Columns(2), xlAscending, Header:=xlYes 'tri dans l'ordre initial
    .Columns(2).Resize(, 2).Delete xlToLeft 'supprime les 2 colonnes auxiliaires
End With
End Sub
Elle se déclenche quand on fait un double-clic sur G5.

Pour tester j'ai recopié le tableau B6:G54 sur 98 000 lignes, chez moi la macro s'exécute en 1,3 seconde.

PS : je n'ai pas compris pourquoi chez vous il n'y a pas de "Oui" pour 9222 QC/Daniel.

A+
 

Pièces jointes

  • Tri VBA(1).xlsm
    46.5 KB · Affichages: 4

job75

XLDnaute Barbatruc
Bonsoir hatem1234, le forum,

Pour répondre à ce que vous demandez au post #6 il me paraît nécessaire de consolider les données.

Voyez le fichier joint et cette nouvelle macro :
VB:
Sub Consolider()
Dim tablo, resu(), d As Object, i&, x$, n&, j%, nn&, v
'---2ème tableau---
Application.ScreenUpdating = False
If IsArray([Tbl_2]) Then
    With [Tbl_2].ListObject.Range: .AutoFilter: .AutoFilter: End With 'si le tableau est filtré
    [Tbl_2].EntireColumn.Delete 'RAZ
End If
With [Tbl_1].ListObject.Range 'tableau structuré
    .AutoFilter: .AutoFilter 'si le tableau est filtré
    .EntireColumn.Copy .Columns(7).EntireColumn 'copier-coller
    .Cells(2, 7).ListObject.Name = "Tbl_2" 'renomme le tablea
    tablo = .Value 'matrice, plus rapide
End With
'---tableau des résultats---
ReDim resu(1 To UBound(tablo), 1 To 5)
Set d = CreateObject("Scripting.Dictionary")
For i = 2 To UBound(tablo)
    x = tablo(i, 2) & Chr(1) & tablo(i, 3) 'concatène les 2ème et 3ème colonnes
    If x <> Chr(1) And tablo(i, 4) > 5 Then
        If Not d.exists(x) Then
            n = n + 1
            d(x) = n 'mémorise la ligne
            For j = 1 To 4: resu(n, j) = tablo(i, j): Next j
        End If
        nn = d(x) 'récupère la ligne
        v = tablo(i, 5)
        If IsNumeric(CStr(v)) Then resu(nn, 5) = resu(nn, 5) + CDbl(v)
    End If
Next i
'---tableau consolidé et 6ème colonne---
With [Tbl_2].ListObject.Range 'tableau structuré
    If n Then .Rows(2).Resize(n, 5) = resu 'restitution
    If .Rows.Count = 2 And n = 0 Then
        .Rows(2) = "" 'si le tableau est vide
    Else
        If .Rows.Count > n + 1 Then .Rows(n + 2).Resize(.Rows.Count - n - 1).Delete xlUp 'RAZ en dessous
        .Columns(2).Insert xlToRight 'insère une colonne auxiliaire
        .Cells(2, 2) = "=N(R[-1]C)+1" 'numérotation
        .Columns(2) = .Columns(2).Value 'supprime les formules
        .Sort .Columns(4), xlAscending, .Columns(6), , xlDescending, Header:=xlYes 'tri sur 2 colonnes
        tablo = .Columns(4) 'matrice, plus rapide
        ReDim resu(1 To UBound(tablo), 1 To 1)
        For i = 2 To UBound(tablo)
            If tablo(i - 1, 1) <> tablo(i, 1) Then n = 1 Else n = n + 1
            If n < 3 Then resu(i, 1) = "Oui"
        Next i
        .Columns(7) = resu 'restitution
        .Sort .Columns(2), xlAscending, Header:=xlYes 'tri dans l'ordre initial
        .Columns(2).Delete xlToLeft 'supprime la colonne auxiliaire
    End If
    .Cells(1, 6) = "Client à considérer"
    .Cells(1, 6).Columns.AutoFit 'ajustement largeur
    .ListObject.TableStyle = "TableStyleMedium6" 'bleu
End With
End Sub
Bonne nuit.
 

Pièces jointes

  • Tri VBA(2).xlsm
    50.3 KB · Affichages: 0
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
314 491
Messages
2 110 182
Membres
110 691
dernier inscrit
Marhvax