[Résolu] Concatenation automatique selon critères

  • Initiateur de la discussion Initiateur de la discussion Polobe36
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Polobe36

XLDnaute Occasionnel
Bonjour à tous, le forum,

Je retravaille actuellement une base article d'environ 5000 références. Pour ce faire, nous avons défini des caractéristiques à renseigner selon divers types d'articles, ce qui nous permettra d'en structurer la désignation par des règles d'écritures.

Exemple: pour un distributeur dont les caractéristiques sont 3 positions 5 orifices en position centre ouvert de taille iso2 cela donne la désignation suivante DISTRIBUTEUR 5/3-CO-ISO2

La difficulté maintenant pour moi est d'appliquer la règle d'écriture de façon automatique selon l'article concerné.

Je vous joins un exemple (j'avoue la lourdeur du truc) en essayant de préciser ma demande.

Merci de votre aide, de vos idées. Bonne journée
 

Pièces jointes

Dernière édition:
Re : Concatenation automatique selon critères

Bonjour,

un début :
en Y4
=Z4&" "&DECALER(A4;0;RECHERCHEV(Catalogue!$Z5;Règles!$A$4:$H$16;2;FAUX)-1+26)&RECHERCHEV(Catalogue!$Z5;Règles!$A$4:$H$16;3;FAUX)

et continuer la formule pour la suite de la référence ...

Caillou
 
Re : Concatenation automatique selon critères

Salut..
la formule est longue.. très longue...

Code:
=Tableau_Catalogue[[#Cette ligne];[Colonne8]] &" "
& INDEX($1:$1048576;LIGNE();DECALER(Règles!$A$3;EQUIV(Tableau_Catalogue[[#Cette ligne];[Colonne8]];Règles!$A$4:$A$16;0);1))
& DECALER(Règles!$A$3;EQUIV(Tableau_Catalogue[[#Cette ligne];[Colonne8]];Règles!$A$4:$A$16;0);2)
& INDEX($1:$1048576;LIGNE();DECALER(Règles!$A$3;EQUIV(Tableau_Catalogue[[#Cette ligne];[Colonne8]];Règles!$A$4:$A$16;0);3))
& DECALER(Règles!$A$3;EQUIV(Tableau_Catalogue[[#Cette ligne];[Colonne8]];Règles!$A$4:$A$16;0);4)
& INDEX($1:$1048576;LIGNE();DECALER(Règles!$A$3;EQUIV(Tableau_Catalogue[[#Cette ligne];[Colonne8]];Règles!$A$4:$A$16;0);5))
& DECALER(Règles!$A$3;EQUIV(Tableau_Catalogue[[#Cette ligne];[Colonne8]];Règles!$A$4:$A$16;0);6)
& INDEX($1:$1048576;LIGNE();DECALER(Règles!$A$3;EQUIV(Tableau_Catalogue[[#Cette ligne];[Colonne8]];Règles!$A$4:$A$16;0);7))

PS: en A1 de la feuille Règles. j'ai remis 0.. sinon, la colonne 114 ne correspond pas à la colonne qu'on cherche.. et du coup. cette longue formule ne fonctionne plus..
pour la comprendre. il faut juste la décomposer..
il y a deux "membres" importants
Code:
& INDEX($1:$1048576;LIGNE();DECALER(Règles!$A$3;EQUIV(Tableau_Catalogue[[#Cette ligne];[Colonne8]];Règles!$A$4:$A$16;0);1))
récupère le numéro de la colonne associé au produit de la ligne en cours (décaler..
index: récupère le contenu de la cellule en ("ligne en cours" ; Numéro de colonne)

Code:
& DECALER(Règles!$A$3;EQUIV(Tableau_Catalogue[[#Cette ligne];[Colonne8]];Règles!$A$4:$A$16;0);2)

récupère l'opérateur / ou - dans l'onglet règle, associé au produit de la ligne en cours..


Edit: Salut Caillou et Modeste
 
Dernière édition:
Re : Concatenation automatique selon critères

Bonjour Polobe36, Caillou,

Plus que d'habitude encore, je m'interroge: "Ai-je bien compris?" Il faut dire, à ma décharge, que les explications auraient pu être un peu plus détaillées, concernant le tableau des règles.
En tout cas, si je me suis planté, je ne recommence pas 😉

Dans le cas contraire, je laisse le soin à Polobe36 de tester et de vérifier ...
En Y4, essayer:
Code:
=$Z4&" "&INDEX($DU4:$FO4;1;EQUIV(INDEX(Règles!$B$4:$H$16;EQUIV($Z4;Règles!$A$4:$A$16;0);1);$DU$2:$FO$2;0))&SI(INDEX(Règles!$B$4:$H$16;EQUIV($Z4;Règles!$A$4:$A$16;0);2)<>"";INDEX(Règles!$B$4:$H$16;EQUIV($Z4;Règles!$A$4:$A$16;0);2)&INDEX($DU4:$FO4;1;EQUIV(INDEX(Règles!$B$4:$H$16;EQUIV($Z4;Règles!$A$4:$A$16;0);3);$DU$2:$FO$2;0));"")&SI(INDEX(Règles!$B$4:$H$16;EQUIV($Z4;Règles!$A$4:$A$16;0);4)<>"";INDEX(Règles!$B$4:$H$16;EQUIV($Z4;Règles!$A$4:$A$16;0);4)&INDEX($DU4:$FO4;1;EQUIV(INDEX(Règles!$B$4:$H$16;EQUIV($Z4;Règles!$A$4:$A$16;0);5);$DU$2:$FO$2;0)))&SI(INDEX(Règles!$B$4:$H$16;EQUIV($Z4;Règles!$A$4:$A$16;0);6)<>"";INDEX(Règles!$B$4:$H$16;EQUIV($Z4;Règles!$A$4:$A$16;0);6)&INDEX($DU4:$FO4;1;EQUIV(INDEX(Règles!$B$4:$H$16;EQUIV($Z4;Règles!$A$4:$A$16;0);7);$DU$2:$FO$2;0));"")

[Edit] Salut aussi à vgendron
 
Re : Concatenation automatique selon critères

Bonjour à tous,
Et merci de vos réponses.
Effectivement Modeste et je m'en excuse auprès de chacun d'entres vous, j'ai franchement eu du mal à exprimer mon besoin mais en tout cas tu as apporté une bonne solution à mon problème.

vgendron, je n'arrive pas à appliquer ton code, j'ai une erreur pour reconnaitre INDEX($1:$1048576).

Je vérifie toutes vos propositions et vous tiens au courant
 
Re : Concatenation automatique selon critères

Bonjour à tous

une solution par macro ,
Code:
Sub Polobe36()
Dim DerLig1 As Long, DerLig2 As Long, DerCol As Byte
Dim WS1 As Worksheet, WS2 As Worksheet
Dim MonDico, Tableau, i, c, montab, art, TabFin
Dim MaConcat As String, MaClé As String, EtatDefaut As String
Dim Deb, Fin

Deb = Timer()
Set WS1 = Worksheets("Catalogue")
Set WS2 = Worksheets("Règles")

DerLig1 = WS1.Range("A" & Rows.Count).End(xlUp).Row

Set MonDico = CreateObject("Scripting.Dictionary")
DerLig2 = WS2.Range("A" & Rows.Count).End(xlUp).Row

Tableau = WS2.Range("A4:A" & DerLig2)
  For i = LBound(Tableau) To UBound(Tableau)
    DerCol = WS2.Cells(i + 3, Columns.Count).End(xlToLeft).Column
    montab = WS2.Range(WS2.Cells(i + 3, 2), WS2.Cells(i + 3, DerCol))
     MonDico.Item(Tableau(i, 1)) = montab
  Next i
  
TabFin = WS1.Range("Y4:Z" & DerLig1)
For i = LBound(TabFin) To UBound(TabFin)
    MaClé = TabFin(i, 2)


    If MonDico.exists(MaClé) Then
        MaConcat = MaClé & " "
        For Each art In MonDico.Item(MaClé)
            If IsNumeric(art) Then MaConcat = MaConcat & WS1.Cells(i + 3, 26 + art)
            If Not IsNumeric(art) Then MaConcat = MaConcat & art
        Next
        TabFin(i, 1) = MaConcat
        
    Else
        EtatDefaut = EtatDefaut & "DEFAUT REGLE " & TabFin(i, 2) & Chr(10)
        TabFin(i, 1) = "DEFAUT  de REGLE : " & TabFin(i, 2)
    End If
    MaConcat = ""
Next i
WS1.Range("Y4").Resize(UBound(TabFin, 1)) = Application.Index(TabFin, , 1)
Fin = Timer()
EtatDefaut = EtatDefaut & "Traitement réalisé en : " & Fin - Deb & " secondes"
MsgBox EtatDefaut
End Sub

Les articles n'ayant pas de règle définie sont affichés dans un message en fin de traitement et la désignation dans la feuille catalogue est faite ainsi :DEFAUT de REGLE : KIT

A+
 
Re : Concatenation automatique selon critères

Bonjour Paf, le Forum,

Merci de ton aide, çà fonctionne très bien. Bonne idée le message d'erreur.

Si la valeur d'une cellule est égale à "x" ou "N.C.", serait-il possible:
1- de ne pas en récupérer la valeur et passer à celle de la colonne suivante dans la même règle,
2- de ne pas récupérer la valeur de la colonne précédente (généralement c'est un séparateur genre "-") ?

Exemple: DISTRIBUTEUR 5/2-x-ISO1 donnerait DISTRIBUTEUR 5/2-ISO1

Merci par avance de ton/votre aide... toujours aussi précieuse.

Bonne journée
 
Re : Concatenation automatique selon critères

Re,

la partie du code modifiée :

Code:
 If MonDico.exists(MaClé) Then
        MaConcat = MaClé & " "
        For Each art In MonDico.Item(MaClé)
            If IsNumeric(art) Then
                ValCol = WS1.Cells(i + 3, 26 + art)
                If ValCol <> "x" And ValCol <> "N.C." Then
                    MaConcat = MaConcat & ValCol
                Else
                    MaConcat = Left(MaConcat, Len(MaConcat) - LongValPrec)
                End If
                LongValPrec = 0
            End If
            If Not IsNumeric(art) Then
                MaConcat = MaConcat & art
                LongValPrec = Len(art)
            End If
        Next
        TabFin(i, 1) = MaConcat
        
    Else

Bonne suite
 
Re,

Merci Paf pour ton aide, çà fonctionne parfaitement, j'ai juste rajouté une autre condition (autre que "x" ou "N.C.") à savoir la cellule vide.
Cà c'était donc pour créer la désignation première, je vais pouvoir (je l'espère) adapter ton modèle pour créer une désignation complémentaire selon d'autres règles d'écriture.

Merci encore à chacun pour votre attention.

Problème une nouvelle fois résolu grâce à vous, bonne journée.
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD
Retour