formule matricielle

Y compris Power BI, Power Query et toute autre question en lien avec Excel
m
mssm16
Nouveau venu
Nouveau venu
Messages : 9
Inscrit le : 23 décembre 2016
Version d'Excel : 2013

Message par mssm16 » 23 décembre 2016, 13:12

Bonjour,
Je suis nouveau et j'ai longtemps parcouru le site pour trouver ce qui répond en mon besoin main en vain.
Merci de me l'aider et j'ai mis toutes les explications nécessaires.
exem.xlsx
(11.57 Kio) Téléchargé 11 fois
M
MFerrand
Fanatique d'Excel
Fanatique d'Excel
Messages : 17'171
Appréciations reçues : 446
Inscrit le : 20 juillet 2015
Version d'Excel : 2010 FR

Message par MFerrand » 23 décembre 2016, 13:56

Bonjour,

M'est avis qu'une traduction s'imposerait ! :lol:

Mais cela ne suffira peut-être pas ! :lol:
p
patrick1957
Passionné d'Excel
Passionné d'Excel
Messages : 3'122
Appréciations reçues : 32
Inscrit le : 24 août 2015
Version d'Excel : 2007-2010-2016 PC

Message par patrick1957 » 23 décembre 2016, 14:09

MFerrand a écrit :Bonjour,

M'est avis qu'une traduction s'imposerait ! :lol:

Mais cela ne suffira peut-être pas ! :lol:
Tu n'a pas compris ça ?
Portant c'est clair et limpide :) mais la boule de cristal n'est pas livrée avec :)
Je fais du géocaching et vous ?
Indentez vos codes VBA, ---> http://www.oaltd.co.uk/Indenter/Default.htm
A lire pour les débutants: http://www.xlerateur.com/divers/2010/05 ... nnees-612/
m
mssm16
Nouveau venu
Nouveau venu
Messages : 9
Inscrit le : 23 décembre 2016
Version d'Excel : 2013

Message par mssm16 » 24 décembre 2016, 14:49

Je m'explique davantage:
Code 211: il y est rattaché les principaux codes ( ceux précédés par 2 **) et en bas ceux qui sont soulignés
*** 211
** 21100
** 21510
** 216
21610
21620
21630
** 217
21700
32000
** 218
21800
** 219
21900
215
et chaque principale y est rattaché , à titre d'exemple 216 (21610 -21620-21630)
exem.xlsx
(11.59 Kio) Téléchargé 5 fois
M
MFerrand
Fanatique d'Excel
Fanatique d'Excel
Messages : 17'171
Appréciations reçues : 446
Inscrit le : 20 juillet 2015
Version d'Excel : 2010 FR

Message par MFerrand » 24 décembre 2016, 15:17

:D C'est pas un jour pour réfléchir !
Il y a d'ailleurs une erreur de ta part sur 215 ! :mrgreen:

Ok ! On peut faire une matricielle personnalisée en lui demandant de transformer la plage A4:B18 dans l'exemple...
Mais pour appliquer correctement une telle fonction, il faut sélectionner une plage pour les résultats, et au cas particulier il faut que l'utilisateur sélectionne une plage de 4 lignes et 6 colonnes pour obtenir le résultat voulu, ce qui n'a rien d'évident et lui laisse toute chance de faire une sélection trop petite ou trop grande au départ...

C'est faisable donc ! :D
m
mssm16
Nouveau venu
Nouveau venu
Messages : 9
Inscrit le : 23 décembre 2016
Version d'Excel : 2013

Message par mssm16 » 24 décembre 2016, 16:31

Merci, on va enlever le 215 à qui aucun code n'est rattaché pour le moment
M
MFerrand
Fanatique d'Excel
Fanatique d'Excel
Messages : 17'171
Appréciations reçues : 446
Inscrit le : 20 juillet 2015
Version d'Excel : 2010 FR

Message par MFerrand » 25 décembre 2016, 15:38

Bonjour,

Voilà donc un essai de fonction :
Function TRANSCODE(plC As Range)
    Dim Cde(), k%, n%, i%, tn%, tk%
    Application.Volatile
    With plC
        For i = 1 To .Rows.Count
            Select Case .Cells(i, 1)
                Case "***"
                    If tk > k Then k = tk
                    n = n + tn
                    tn = 1: tk = 1
                Case "**"
                    tk = tk + 1
                Case Else
                    tn = tn + 1
            End Select
        Next i
        n = n + tn
        If tk > k Then k = tk
        ReDim Cde(1 To n, 1 To k)
        k = 0: n = 0: tn = 0: tk = 0
        For i = 1 To .Rows.Count
            Select Case .Cells(i, 1)
                Case "***"
                    k = 1: n = n + 1 + tk
                    Cde(n, k) = .Cells(i, 2)
                Case "**"
                    If tn > tk Then tk = tn
                    tn = 0: k = k + 1
                    Cde(n, k) = .Cells(i, 2)
                Case Else
                    tn = tn + 1
                    Cde(n + tn, k) = .Cells(i, 2)
            End Select
        Next i
    End With
    For n = 1 To UBound(Cde, 1)
        For k = 1 To UBound(Cde, 2)
            If IsEmpty(Cde(n, k)) Then Cde(n, k) = vbNullString
        Next k
    Next n
    TRANSCODE = Cde
End Function
Comme je l'ai dit précédemment, l'utilisateur devra faire un petit calcul mental pour évaluer la dimension du résultat attendu : nombre de colonne égal au nombre de "**" situé sous un "***" (+1 pour le "***"), nombre de lignes égal au nombre max. de "" situés sous un "**" (+1 pour le "**"), donc ici 7 colonnes et 4 lignes, avant de taper la formule :
=TRANSCODE(A4:B18)
et de la valider matriciellement.

Pour le nombre de colonnes c'est également le nombre max de "**" sous "***" +1, au cas où il y aurait plusieurs "***"... Ce cas est pris en compte par la fonction, je ne l'ai cependant pas testé.

Cordialement.

mssm16_exem.xlsm
(18.83 Kio) Téléchargé 4 fois
m
mssm16
Nouveau venu
Nouveau venu
Messages : 9
Inscrit le : 23 décembre 2016
Version d'Excel : 2013

Message par mssm16 » 26 décembre 2016, 19:28

Merci infiniment pour cette aide qui m'est précieuse.
Répondre Sujet précédentSujet suivant
  • Sujets similaires
    Réponses
    Vues
    Dernier message