Classification selon critère

momo

XLDnaute Occasionnel
Bonjour à tous

je voudrais votre assistance par rapport à un travail

je voudrais classer en trois catégories des éléments comptés par deux équipes et faire une comparaison par rapport aux résultats obtenus

1- Éléments de même référence avec localisation différente
2- Eléments de même référence et de même localisation
3- Eléments avec différentes référence

Je joins un fichier montrant les résultats attendus

Je vous remercie par avance pour le coup de main
 

Pièces jointes

  • Classification.xlsx
    11.9 KB · Affichages: 16

momo

XLDnaute Occasionnel
Bonjour momo,
oui les formules matricielles sont très gourmandes en ressources, c'est normal que le calcul soit lent, mais je ne sais pas c'est quoi la configuration de ton PC.
En tous cas, je pense que notre cher ami Job75 pourrait te faire une macro VBA qui va te donner les bons résultats en quelques secondes, il faut juste qu'il soit disponible.


Cordialement
Ah oui Job il est très fort dans la macro ... je croise les doigts pour qu’il soit disponible donc
 

Amilo

XLDnaute Accro
Bonjour momo, R@chid, job75, le forum,
Voici une proposition avec Power query avec le résultat dans chacun des onglets R1, R2 et R3,
Avec Power query, aucun problème de lenteur, même avec plusieurs dizaines de milliers de lignes

Cordialement
 

Pièces jointes

  • Momo_Classification_PQ.xlsx
    36.6 KB · Affichages: 14

Amilo

XLDnaute Accro
Re,

@momo, il faudrait commencer à télécharger power query si vous ne l'avez pas déjà installé via ce lien,
Je vous ai fait une petite vidéo pour la démonstration pour l'instant pour le 1er tableau de l'onglet R1,

Pour les 2 autres onglets, c'est à peu près le même principe
Je pourrais vous faire 2 autres vidéos si vous ne parvenez pas à les réaliser.
Video_Classification

Cordialement
 
Dernière édition:

job75

XLDnaute Barbatruc
Bonsoir momo, R@chid, Amilo,

Pas eu trop de temps libre aujourd'hui.

Voyez cette solution VBA dans le fichier joint, le code est à placer dans le ThisWorkbook :
VB:
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
If Not Sh.Name Like "R#" Then Exit Sub
Dim tablo, resu(), d As Object, i&, x$, n&, lig&, numfeuille%, test As Boolean, j%
'---analyse du tableau source---
tablo = Sheets("Base").[A1].CurrentRegion.Resize(, 4) 'matrice, plus rapide
ReDim resu(1 To UBound(tablo), 1 To 4)
Set d = CreateObject("Scripting.Dictionary")
For i = 2 To UBound(tablo)
    x = tablo(i, 1) & tablo(i, 2)
    If Not d.exists(x) Then
        n = n + 1
        d(x) = n 'mémorise la ligne
        resu(n, 1) = tablo(i, 1)
        resu(n, 2) = tablo(i, 2)
    End If
    lig = d(x)
    If tablo(i, 4) = "AM" Then
        resu(lig, 3) = resu(lig, 3) + Val(tablo(i, 3))
    ElseIf tablo(i, 4) = "AB" Then
        resu(lig, 4) = resu(lig, 4) + Val(tablo(i, 3))
    End If
Next i
'---restitutions---
Application.ScreenUpdating = False
If Sh.FilterMode Then Sh.ShowAllData 'si la feuille est filtrée
With Sh.[A2]
    '---1ère restitution---
    If n Then
        .Resize(n, 4) = resu
        .Resize(n, 4).Sort .Cells, xlAscending, , .Cells(1, 2), xlAscending, Header:=xlNo 'tri sur les colonnes A et B
    End If
    .Offset(n).Resize(Sh.Rows.Count - n - .Row + 1, 4).ClearContents 'RAZ en dessous
    '---répartition entre les feuilles---
    tablo = .Cells(0, 1).Resize(n + 2, 4)
    ReDim resu(1 To UBound(tablo), 1 To 4)
    numfeuille = Val(Right(Sh.Name, 1))
    n = 0
    For i = 2 To UBound(tablo) - 1
        test = tablo(i, 1) = tablo(i - 1, 1) Or tablo(i, 1) = tablo(i + 1, 1)
        Select Case numfeuille
            Case 1: If test Then n = n + 1: For j = 1 To 4: resu(n, j) = tablo(i, j): Next j
            Case 2: If Not test And tablo(i, 3) <> "" And tablo(i, 4) <> "" Then n = n + 1: For j = 1 To 4: resu(n, j) = tablo(i, j): Next j
            Case 3: If Not test And (tablo(i, 3) = "" Or tablo(i, 4) = "") Then n = n + 1: For j = 1 To 4: resu(n, j) = tablo(i, j): Next j
        End Select
    Next i
    '---2ème restitution---
    If n Then
        .Resize(n, 4) = resu
        .Resize(n, 4).Borders.Weight = xlThin 'bordures
    End If
    .Offset(n).Resize(Sh.Rows.Count - n - .Row + 1, 4).Delete xlUp 'RAZ en dessous
End With
With Sh.UsedRange: End With 'ajuste la barre de défilement verticale
End Sub
La macro s'exécute quand on active une des feuilles R1 R2 R3.

Utilisant des tableaux VBA et le Dictionary elle est très rapide.

Bonne nuit.
 

Pièces jointes

  • Classification(1).xlsm
    24.1 KB · Affichages: 6

momo

XLDnaute Occasionnel
Re,

@momo, il faudrait commencer à télécharger power query si vous ne l'avez pas déjà installé via ce lien,
Je vous ai fait une petite vidéo pour la démonstration pour l'instant pour le 1er tableau de l'onglet R1,

Pour les 2 autres onglets, c'est à peu près le même principe
Je pourrais vous faire 2 autres vidéos si vous ne parvenez pas à les réaliser.
Video_Classification

Cordialement
Aaaaah merci beaucoup Amilo
C’est très gentil d’accorder de votre temps .. merci le tuto est très bon .. je vais essayer
 

momo

XLDnaute Occasionnel
Bonsoir momo, R@chid, Amilo,

Pas eu trop de temps libre aujourd'hui.

Voyez cette solution VBA dans le fichier joint, le code est à placer dans le ThisWorkbook :
VB:
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
If Not Sh.Name Like "R#" Then Exit Sub
Dim tablo, resu(), d As Object, i&, x$, n&, lig&, numfeuille%, test As Boolean, j%
'---analyse du tableau source---
tablo = Sheets("Base").[A1].CurrentRegion.Resize(, 4) 'matrice, plus rapide
ReDim resu(1 To UBound(tablo), 1 To 4)
Set d = CreateObject("Scripting.Dictionary")
For i = 2 To UBound(tablo)
    x = tablo(i, 1) & tablo(i, 2)
    If Not d.exists(x) Then
        n = n + 1
        d(x) = n 'mémorise la ligne
        resu(n, 1) = tablo(i, 1)
        resu(n, 2) = tablo(i, 2)
    End If
    lig = d(x)
    If tablo(i, 4) = "AM" Then
        resu(lig, 3) = resu(lig, 3) + Val(tablo(i, 3))
    ElseIf tablo(i, 4) = "AB" Then
        resu(lig, 4) = resu(lig, 4) + Val(tablo(i, 3))
    End If
Next i
'---restitutions---
Application.ScreenUpdating = False
If Sh.FilterMode Then Sh.ShowAllData 'si la feuille est filtrée
With Sh.[A2]
    '---1ère restitution---
    If n Then
        .Resize(n, 4) = resu
        .Resize(n, 4).Sort .Cells, xlAscending, , .Cells(1, 2), xlAscending, Header:=xlNo 'tri sur les colonnes A et B
    End If
    .Offset(n).Resize(Sh.Rows.Count - n - .Row + 1, 4).ClearContents 'RAZ en dessous
    '---répartition entre les feuilles---
    tablo = .Cells(0, 1).Resize(n + 2, 4)
    ReDim resu(1 To UBound(tablo), 1 To 4)
    numfeuille = Val(Right(Sh.Name, 1))
    n = 0
    For i = 2 To UBound(tablo) - 1
        test = tablo(i, 1) = tablo(i - 1, 1) Or tablo(i, 1) = tablo(i + 1, 1)
        Select Case numfeuille
            Case 1: If test Then n = n + 1: For j = 1 To 4: resu(n, j) = tablo(i, j): Next j
            Case 2: If Not test And tablo(i, 3) <> "" And tablo(i, 4) <> "" Then n = n + 1: For j = 1 To 4: resu(n, j) = tablo(i, j): Next j
            Case 3: If Not test And (tablo(i, 3) = "" Or tablo(i, 4) = "") Then n = n + 1: For j = 1 To 4: resu(n, j) = tablo(i, j): Next j
        End Select
    Next i
    '---2ème restitution---
    If n Then
        .Resize(n, 4) = resu
        .Resize(n, 4).Borders.Weight = xlThin 'bordures
    End If
    .Offset(n).Resize(Sh.Rows.Count - n - .Row + 1, 4).Delete xlUp 'RAZ en dessous
End With
With Sh.UsedRange: End With 'ajuste la barre de défilement verticale
End Sub
La macro s'exécute quand on active une des feuilles R1 R2 R3.

Utilisant des tableaux VBA et le Dictionary elle est très rapide.

Bonne nuit.
Bonjour Job!
Le résultat est fantastique!!!
Dès que je l'essaie sur ma base réelle je vous reviens
Merci pour le temps que vous m'avez accordé!
Bonne nuit
 

konzo

XLDnaute Nouveau
Bonjour momo, R@chid, job75, le forum,
Voici une proposition avec Power query avec le résultat dans chacun des onglets R1, R2 et R3,
Avec Power query, aucun problème de lenteur, même avec plusieurs dizaines de milliers de lignes

Cordialement
Bonjour Amilo
Je veux consolider des bulletins de salaire avec Power Query que j'ai découvert avec l'aide du Forum.
J'ai créé des bulletins de paie de plusieurs salariés par mois dans un classeur.
Ainsi, pour 2020, j'aurais 12 classeurs de bulletins de paie et 1 classeur avec un feuillet récapitulatif des données des bulletins des 12 mois.
Tous les classeurs (12 bulletins de paie et 1 Récapitulatif) sont dans le même dossier.
Je sollicite tout appui pour transférer des données des cellules spécifiques des bulletins de paie vers le récapitulatif pour chaque salarié sur la base de la couleur verte de la feuille (Bulletins de paie contient d'autres feuilles de couleur différente).
Le Récapitulatif indique dans les titres les données à importer.
Merci d'avance pour tout appui. EN ATTACHE MES DEUX FICHIERS
 

Pièces jointes

  • Bulletins Salaires Janvier 2020.xlsx
    370.1 KB · Affichages: 8
  • Récapitulatif.xlsx
    13.3 KB · Affichages: 7

Discussions similaires

Réponses
4
Affichages
276

Statistiques des forums

Discussions
312 082
Messages
2 085 170
Membres
102 805
dernier inscrit
emes