Formule matricielle

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.

12exem.xlsx (11.57 Ko)

Bonjour,

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

Mais cela ne suffira peut-être pas !

MFerrand a écrit :

Bonjour,

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

Mais cela ne suffira peut-être pas !

[b]Tu n'a pas compris ça ?

Portant c'est clair et limpide mais la boule de cristal n'est pas livrée avec [/b]

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)

6exem.xlsx (11.59 Ko)

C'est pas un jour pour réfléchir !

Il y a d'ailleurs une erreur de ta part sur 215 !

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 !

Merci, on va enlever le 215 à qui aucun code n'est rattaché pour le moment

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.


5mssm16-exem.xlsm (18.83 Ko)

Merci infiniment pour cette aide qui m'est précieuse.

Rechercher des sujets similaires à "formule matricielle"