Remplissage d'un "tableau d'adressage" automatique sans VBA

Bonjour !

Ne trouvant pas de solution à mon problème par mes propres moyens, j'en appelle aux lumières des experts de ce forum...

J'ai résumé mon problème sous la forme de deux tableaux

Ce que j'appelle mon "tableau des campagnes", qui décrit les codes affectés aux différentes campagnes :

Campagne | Code

A | 1

A | 2

A | 3

B | 1

B | 3

C | 1

C | 2

C | 3

C | 4

D | 5

Et mon tableau d'adressage, qui décrit en ligne les code et en colonnes les campagnes et à l'intersection une croix selon que le code est vu par la campagne ou non. Dans mon exemple, je dois arriver au résultat suivant.

Code | A | B | C | D

1 | X | X | X | |

2 | X | X | | |

3 | X | X | X | |

4 | | X | X | |

5 | | | | X |

Sauf que ça, c'est mon tableau de référence, mais je ne sais pas comment y arriver. Je pense qu'il faut réussir à combiner un SI sur une recherchev et une rechercheh en simultanée, mais je n'y parviens pas. Une autre façon d'arriver à ce résultat est d'utiliser un TCD avec le code en ligne, la campagne en colonne et, par exemple, "nombre de campagne" en valeurs, mais j'aimerais faire sans...

En pièce-jointe, je vous mets le fichier associé pour que vous puissiez vous rendre compte plus directement de la chose ; si une belle âme sait me sortir de ce soucis, cela serait fort aimable !

Merci beaucoup par avance,

Pharamond

7probleme.xlsx (14.88 Ko)

Bonjour et bienvenue sur le forum pharamond,

Une solution avec cette formule à mettre en F11 et à tirer vers la droite et le bas :

=SI(SOMME.SI.ENS($C$3:$C$12;$B$3:$B$12;Tableau_adressage[[#En-têtes];[A]];$C$3:$C$12;$E11)<>0;"X";"")

Bonjour,

Merci pour votre réponse, mais même si je reconnais que cela fonctionne dans le cas que j'ai envoyé, cela fonctionne parce que les codes sont bien des nombres... or dans mon cas réel, ce sont des assemblages nombres et caractères spéciaux. Exemple : A.1.2. Et dans ce cas, ça ne fonctionne plus car on ne peut plus sommer.

C'est pour ça que je m'orientais davantage vers une combinaison compliquée à coup de recherchev + rechercheh + index... mais je n'arrive pas à retomber sur mes pieds... :/

Peux-tu envoyer un tableau correspondant un peu plus à la réalité ?


Une solution avec SOMMEPROD si j'ai bien compris :

=SI(SOMMEPROD(($C$3:$C$12=$E11)*($B$3:$B$12=F$10))<>0;"X";"")
Pharamond a écrit :

Bonjour,

Merci pour votre réponse, mais même si je reconnais que cela fonctionne dans le cas que j'ai envoyé, cela fonctionne parce que les codes sont bien des nombres... or dans mon cas réel, ce sont des assemblages nombres et caractères spéciaux. Exemple : A.1.2. Et dans ce cas, ça ne fonctionne plus car on ne peut plus sommer.

C'est pour ça que je m'orientais davantage vers une combinaison compliquée à coup de recherchev + rechercheh + index... mais je n'arrive pas à retomber sur mes pieds... :/

Comme quoi, il faut toujours envoyer une copie anonymisée de son vrai fichier

P.

Pardonnez-moi, je pensais avoir justement correctement retranscrit la situation réelle, mais c'est vrai que mes formats de données n'étaient pas iso...

Ci-joint une nouvelle version plus proche de la réalité.

Merci encore pour votre aide !

9probleme-v2.xlsx (15.08 Ko)

re,

un essai

P.

18probleme-v2.xlsx (15.22 Ko)

Bonjour le fil,

Sans VBA, j'ai pas pu résister, désolé

Option Explicit

Sub test()
Dim a, i As Long, x As Long, AL As Object
    Set AL = CreateObject("System.Collections.ArrayList")
    With CreateObject("Scripting.Dictionary")
        '1ère feuille du classeur : source
        a = Sheets(1).Range("b2").CurrentRegion.Value
        For i = 2 To UBound(a, 1)
            If Not AL.Contains(a(i, 1)) Then AL.Add a(i, 1)
            If Not .exists(a(i, 2)) Then
                Set .Item(a(i, 2)) = _
                CreateObject("Scripting.Dictionary")
                .Item(a(i, 2)).CompareMode = 1
            End If
            .Item(a(i, 2))(a(i, 1)) = "x"
        Next
        x = .Count + 1
        ReDim a(1 To x, 1 To AL.Count + 1)
        a(1, 1) = "Code"
        For i = 0 To AL.Count - 1
            a(1, i + 2) = AL(i)
        Next
        For i = 0 To .Count - 1
            a(i + 2, 1) = .keys()(i)
            For j = 0 To .items()(i).Count - 1
                a(i + 2, AL.IndexOf(.items()(i).keys()(j), 0) + 2) = .items()(i).items()(j)
            Next
        Next
    End With
    Application.ScreenUpdating = False
    'restitution sur la 2ème feuille du classeur
    With Sheets(2).Cells(1).Resize(UBound(a, 1), UBound(a, 2))
        .CurrentRegion.Clear
        .Value = a
        With .Rows(1)
            With .Offset(, 1).Resize(, .Columns.Count - 1)
                .Interior.ColorIndex = 36
            End With
            .BorderAround Weight:=xlThin
        End With
        With .Columns(1)
            With .Offset(1).Resize(.Rows.Count - 1)
                .Interior.ColorIndex = 43
            End With
        End With
        .BorderAround Weight:=xlThin
        .Borders(xlInsideVertical).Weight = xlThin
        .Font.Name = "calibri"
        .Font.Size = 10
        .VerticalAlignment = xlCenter
        .HorizontalAlignment = xlCenter
        .Columns.ColumnWidth = 15
        .Parent.Activate
    End With
    Application.ScreenUpdating = True
End Sub

klin89

patrick1957 a écrit :

re,

un essai

P.

Alors, merci infiniment, ça fonctionne.

J'ai du faire 2 ou 3 fois une Évaluation de la formule pour comprendre l'astuce et c'est très malin !

Je testerai lundi au bureau sur mon fichier de production.

Merci encore !

Rechercher des sujets similaires à "remplissage tableau adressage automatique vba"