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

XL 2019 VBA matrice reporter 1 seule fois la valeur la plus haute selon H puis J

SOSjeBloque

XLDnaute Nouveau
Bonjour à tous,

Grâce à des bouts de code j'ai pu créer la matrice qu'il me faut (voir pj.). Elle fonctionne, en revanche je souhaiterais la faire évoluer :

Aujourd'hui ma feuille "Matrice de visualisation B" me reporte la colonne B dans toutes les cases en fonction des notes H et J (Impact et Maitrise).

Je souhaiterais que chaque valeur n'apparaisse plus qu'une seule fois selon la priorité suivante :

n'afficher qu'une unique fois chaque valeur B dans la case à l'impact (H) le plus élevé (le plus proche de 4) puis la maitrise (J) la plus faible (le plus proche de 4).

Ex :
1.A devrait apparaitre uniquement en abs : 3 et ordon : 4 (car on priorise d'abord l'impact puis à impact similaire la maîtrise la plus haute)

2.A devrait apparaitre uniquement en abs : 2 et ordon : 1

3.A devrait apparaitre uniquement en abs : 1 et ordon : 3

Car on conserve la ligne dont le niveau d'ordonnée est le plus haut (impact - H - plus proche de 4) et s'il y a plusieurs lignes ayant le même plus fort niveau d'impact, alors on conserve ensuite le niveau d'abs (maitrise - J) le plus haut (plus proche de 4).

Je ne sais pas coder, juste adapter des bouts de codes pour arriver à mon objectif, je manque donc de méthode,

Merci par avance pour votre éclairage,
 

Pièces jointes

  • Macro test.xlsm
    48.2 KB · Affichages: 8

vgendron

XLDnaute Barbatruc
Hello
un exemple ici
VB:
Sub Matrice2()

'Déclartion des variables
Dim iRow As Integer
Dim sColB As String
Dim sColC As String
Dim sColD As String
Dim sIdentite As String
Dim sIdentiteB As String
Dim sPotent As String
Dim sPerfor As String
Dim eCodeMatrice As LCodeMatrice
Dim iLCodif As Integer
Dim Donnees As String
Dim DonneesB As String

Dim fin As Long

Dim dico
Dim Cat As String
Dim impactMait As String
Dim OldIM As String
Dim ele

'Appel à la codification de la matrice
Codification.CodeMatrice
'Initialiser la feuille des talents matrice
Intialiser.InitTalentMatrice

Set dico = CreateObject("Scripting.dictionary")

With Sheets("Base")
    fin = .Range("A" & .Rows.Count).End(xlUp).Row 'dernière ligne de la colonne A
    For i = 5 To fin 'pour chaque ligne
        Cat = .Range("B" & i) ' on récupère l'info de catégorie (colonne B)
        impactMait = .Range("H" & i) & "-" & .Range("J" & i) & "-" & i 'on concatène les infos de la colonne H et J et le numéro de ligne
        If Not dico.exists(Cat) Then 'si la Cat n'existe pas dans le dico
            dico.Add Cat, impactMait     'on crée l'entrée avec ImpactMait comme valeur
        Else 'sinon: l'entrée existe déjà
            'on regarde les niveaux d'impacts et de maitrise
            OldIM = dico(Cat)
            If Split(impactMait, "-")(0) > Split(OldIM, "-")(0) Then 'on a un impact supérieur
                dico(Cat) = impactMait ' on met à jour avec la nouvelle valeur
            Else 'on regarde si la maitrise est plus grande
                If Split(impactMait, "-")(1) > Split(OldIM, "-")(1) Then
                    dico(Cat) = impactMait ' on met à jour avec la nouvelle valeur
                End If
            End If
        End If
    Next i
End With

For Each ele In dico.keys 'on a dans le dico tous les éléments uniques==> on les parcourt un par un
    'Récupèration de l'identité de la personne
    iRow = Split(dico(ele), "-")(2) 'on récupère l'info de numéro de ligne sauvegardée
    sColC = Application.ThisWorkbook.Worksheets("Base").Cells(iRow, 3)
    sColD = Application.ThisWorkbook.Worksheets("Base").Cells(iRow, 4)
    sColB = Application.ThisWorkbook.Worksheets("Base").Cells(iRow, 2)
    sIdentite = sColC + " - " + sColD
    sIdentiteB = sColB

    'Récupèration de son potentiel et de sa performance
    sPotent = Split(dico(ele), "-")(0)
    sPerfor = Split(dico(ele), "-")(1)

    'Recherche sa destination
    For iLCodif = 0 To UBound(myListeCodif)
        Set eCodeMatrice = myListeCodif(iLCodif)

        If eCodeMatrice.sPotentiel = sPotent And eCodeMatrice.sPerforme = sPerfor Then
            Donnees = Application.ThisWorkbook.Worksheets("MATRICE VISUALISATION C-D").Range(eCodeMatrice.sDestination)
            Application.ThisWorkbook.Worksheets("MATRICE VISUALISATION C-D").Range(eCodeMatrice.sDestination) = Donnees + sIdentite & Chr(10) & ""

            DonneesB = Application.ThisWorkbook.Worksheets("MATRICE VISUALISATION B").Range(eCodeMatrice.sDestination)
            Application.ThisWorkbook.Worksheets("MATRICE VISUALISATION B").Range(eCodeMatrice.sDestination) = DonneesB + sIdentiteB & Chr(10) & ""

            Exit For
        End If

    Next
    iRow = iRow + 1
Next ele


'Return mouse pointer to normal display.
Application.Cursor = xlNormal

'Message
MsgBox "La mise à jour des données est terminée.", vbInformation
  
End Sub
 

SOSjeBloque

XLDnaute Nouveau
Hello vgendron,

Merci pour ton expertise !
Lorsque je lance la macro "Matrice" modifiée le débogueur m'indique une erreur lié à la ligne "Redim Preserve" de l'autre macro "CodeMatrice". Qui fonctionnait avec la Matrice initiale.

Serait-ce lié aux dimensions précisées dans la "Matrice" modifiée (2) ?

 

Pièces jointes

  • Macro test V2.xlsm
    49.8 KB · Affichages: 2

SOSjeBloque

XLDnaute Nouveau
Hello

Tu as oublié de redéfinir "myListeCodif()"

cette ligne a disparu
Public myListeCodif() As New LCodeMatrice
Hello vgendron,

Merci à toi ça refonctionne

J'ai séparé les codes pour que deux macros différentes s'exécutent aux feuilles.
En revanche, la macro ne me conserve pas toujours la bonne donnée, sais-tu pourquoi ?

Rappel : l'impact (H) le plus élevé (le plus proche de 4) puis la maitrise (J) la plus faible (le plus proche de 4) (ex. données qui ne ressort pas comme voulu : 1.A et 5.A sur la feuille "MATRICE VISUALISATION B" (macros portant le nom B)).
 

Pièces jointes

  • Macro test VF3.xlsm
    57.9 KB · Affichages: 1

SOSjeBloque

XLDnaute Nouveau
Bonjour,

Est-ce que quelqu'un pourrait m'aider à recoder la matrice B ?
Cella pourrait être simplifié :

En langage non vba :
Concatène H&J (ex: cela donner 44 43 42 41 34 33 .....) puis trier par ordre décroissant (xlDescending) et renvoyer pour chaque donnée B unique la plus haute, dans la matrice, selon la feuille "Codif Destination Matrice".

Je suis vraiment bloquée, help
 

Pièces jointes

  • MacroW1.xlsm
    51.4 KB · Affichages: 4
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…