Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2016 Macro pour afficher grande valeur

guellila

XLDnaute Junior
Bonjour

j'ai un tableau Excel avec deux colonnes Site A et Site B et des données de pourcentages sur la colonnes C , je cherche une macro pour remplir les cellules de la colonnes D avec le plus grand pourcentage qui corresponds au critère Site A et Site B

un exemple en attaché
 

Pièces jointes

  • Grand Taux.xlsx
    9.9 KB · Affichages: 19

job75

XLDnaute Barbatruc
Bonsoir guellila, djidji59430,

Formule matricielle en C2 à valider par Ctrl+Maj+Entrée :
Code:
=MAX((A$2:A$61=A2)*(B$2:B$61=B2)*C$2:C$61)
A+
 

Pièces jointes

  • Grand Taux(1).xlsx
    12.3 KB · Affichages: 6

guellila

XLDnaute Junior
Bonsoir guellila, djidji59430,

Formule matricielle en C2 à valider par Ctrl+Maj+Entrée :
Code:
=MAX((A$2:A$61=A2)*(B$2:B$61=B2)*C$2:C$61)
A+
Bonjour
j'ai déjà travaillé avec une formule mais mon problème que je travail sur un tableau très volumineux avec plus de 450000 lignes et avec les formules c'est trop long alors je cherche une macro dans l'espoir que ca sera plus rapide

merci
 

job75

XLDnaute Barbatruc
Vous avez tout à fait raison, les formules matricielles ne vont pas avec un grand nombre de lignes.

Alors voyez le fichier .xlsm joint et cette macro :
VB:
Sub Maximum()
Dim d As Object, tablo, i&, x$
Set d = CreateObject("Scripting.Dictionary")
d.CompareMode = vbTextCompare 'la casse est ignorée
With Feuil1 'CodeName de la feuille
    If .FilterMode Then .ShowAllData 'si la feuille est filtrée
    With .[A1].CurrentRegion
        '---liste des maxima---
        tablo = .Resize(, 3) 'matrice, plus rapide
        For i = 2 To UBound(tablo)
            x = tablo(i, 1) & Chr(1) & tablo(i, 2)
            If tablo(i, 3) > d(x) Then d(x) = tablo(i, 3)
        Next i
        '---affectation des maxima au tableau resu---
        ReDim Resu(1 To UBound(tablo), 1 To 1)
        Resu(1, 1) = .Cells(1, 4)
        For i = 2 To UBound(tablo)
            Resu(i, 1) = d(tablo(i, 1) & Chr(1) & tablo(i, 2))
        Next
        '---restitution sur la 4ème colonne---
        .Columns(4) = Resu
    End With
End With
End Sub
Elle est très rapide car elle utilise des tableaux VBA et le Dictionary.
 

Pièces jointes

  • Grand Taux VBA(1).xlsm
    19.7 KB · Affichages: 1
Dernière édition:

job75

XLDnaute Barbatruc
Pour tester j'ai recopié le tableau A2: D61 sur 600 000 lignes.

On obtient un fichier de 11,6 Mo.

Chez moi sur Excel 2019 la macro s'exécute en 2,2 secondes.
 
Dernière édition:

guellila

XLDnaute Junior
Bonjour
merci pour la macro
je n'est pas beaucoup de connaissance en macro , est-ce que c'est possible d'adapter votre macro a la disposition des colonnes dans le fichier en attaché

cdt
 

Pièces jointes

  • Grand Taux 4.xlsx
    12.6 KB · Affichages: 2

job75

XLDnaute Barbatruc
Le fichier en retour avec la macro adaptée :
Code:
Sub Maximum()
Dim d As Object, tablo, i&, x$
Set d = CreateObject("Scripting.Dictionary")
d.CompareMode = vbTextCompare 'la casse est ignorée
With Feuil1 'CodeName de la feuille
    If .FilterMode Then .ShowAllData 'si la feuille est filtrée
    With .[J1].CurrentRegion
        '---liste des maxima---
        tablo = .Resize(, 7) 'matrice, plus rapide
        For i = 2 To UBound(tablo)
            x = tablo(i, 1) & Chr(1) & tablo(i, 3)
            If tablo(i, 7) > d(x) Then d(x) = tablo(i, 7)
        Next i
        '---affectation des maxima au tableau resu---
        ReDim resu(1 To UBound(tablo), 1 To 1)
        resu(1, 1) = .Cells(1, 8)
        For i = 2 To UBound(tablo)
            resu(i, 1) = d(tablo(i, 1) & Chr(1) & tablo(i, 3))
        Next
        '---restitution sur la 4ème colonne---
        .Columns(8) = resu
    End With
End With
End Sub
J'espère que vous allez essayer de comprendre comment fonctionnent les indices des tableaux.
 

Pièces jointes

  • Grand Taux 4.xlsm
    19.6 KB · Affichages: 5
Dernière édition:

job75

XLDnaute Barbatruc
Bonjour guellila, le forum,

Au post #6 j'ai remplacé :
VB:
d(x) = IIf(tablo(i, 3) > d(x), tablo(i, 3), d(x))
par :
VB:
If tablo(i, 3) > d(x) Then d(x) = tablo(i, 3)
Sur 600 000 lignes la durée d'exécution passe de 3,5 secondes à 2,2 secondes.

A+
 

Discussions similaires

Réponses
12
Affichages
305
Réponses
0
Affichages
263
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…