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

Y compris Power BI, Power Query et toute autre question en lien avec Excel
P
Pharamond
Nouveau venu
Nouveau venu
Messages : 6
Inscrit le : 3 juin 2016
Version d'Excel : 2013 FR

Message par Pharamond » 3 juin 2016, 16:13

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
probleme.xlsx
(14.88 Kio) Téléchargé 6 fois
v
vba-new
Passionné d'Excel
Passionné d'Excel
Messages : 3'003
Appréciations reçues : 2
Inscrit le : 13 mai 2009
Version d'Excel : 2010 FR - 2013 FR

Message par vba-new » 3 juin 2016, 16:32

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";"")
vba-new
P
Pharamond
Nouveau venu
Nouveau venu
Messages : 6
Inscrit le : 3 juin 2016
Version d'Excel : 2013 FR

Message par Pharamond » 3 juin 2016, 17:12

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... :/
v
vba-new
Passionné d'Excel
Passionné d'Excel
Messages : 3'003
Appréciations reçues : 2
Inscrit le : 13 mai 2009
Version d'Excel : 2010 FR - 2013 FR

Message par vba-new » 3 juin 2016, 17:37

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";"")
vba-new
p
patrick1957
Passionné d'Excel
Passionné d'Excel
Messages : 3'159
Appréciations reçues : 31
Inscrit le : 24 août 2015
Version d'Excel : 2007-2010-2016 PC

Message par patrick1957 » 3 juin 2016, 18:23

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.
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/
P
Pharamond
Nouveau venu
Nouveau venu
Messages : 6
Inscrit le : 3 juin 2016
Version d'Excel : 2013 FR

Message par Pharamond » 3 juin 2016, 19:16

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 !
probleme_v2.xlsx
(15.08 Kio) Téléchargé 7 fois
p
patrick1957
Passionné d'Excel
Passionné d'Excel
Messages : 3'159
Appréciations reçues : 31
Inscrit le : 24 août 2015
Version d'Excel : 2007-2010-2016 PC

Message par patrick1957 » 3 juin 2016, 19:43

re,

un essai :)

P.
probleme_v2.xlsx
(15.22 Kio) Téléchargé 13 fois
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/
Avatar du membre
Klin89
Membre dévoué
Membre dévoué
Messages : 595
Appréciations reçues : 21
Inscrit le : 28 mai 2011
Version d'Excel : 2003 FR

Message par Klin89 » 3 juin 2016, 21:10

Bonjour le fil, :)

Sans VBA, j'ai pas pu résister, désolé ::D
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
P
Pharamond
Nouveau venu
Nouveau venu
Messages : 6
Inscrit le : 3 juin 2016
Version d'Excel : 2013 FR

Message par Pharamond » 3 juin 2016, 21:23

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 !
Répondre Sujet précédentSujet suivant
  • Sujets similaires
    Réponses
    Vues
    Dernier message