Famille article
J'ai un fichier Excel qui contient les articles sur la feuille TOUTPublicDL et une autre feuille famille qui contient les familles et sous familles tout 2 sont liés par un code famille.
Je souhaiterais dans mon fichier article indique le nom de famille, sous famille et sous sous famille.
Le code famille est composé des niveaux familles.
Exple : le code famille est le suivant A.00.01.DOM.
A. correspond à la famille qui est CHAUFFAGE
A.00 correspond à la sous famille qui est CHAUDIERES
A.00.01. correspond à la sous sous famille qui est CHAUDIERE FONTE FUEL
A.00.01.DOM correspond à la sous sous sous famille qui est DOMUSA
D'avance merci
Bonjour Quirion,
Ce que tu veux faire est assez classique, sauf une information manquante, qui est la suivante : le nombre de niveaux dans l'arborescence est-il le même pour tous les articles ?
Si oui, alors on va pouvoir proposer une liste déroulante pour attribuer la classification à un produit, et récupérer toutes les caractéristiques de cette classification...
C'est cela que tu souhaites ?
A+ Daniel
Bonjour DAn42153,
Avec RECHERCHEV et l'onglet "FAMILLE" correctement renseigner (c'est à dire les données élatées), voici ce que ça peut donner.... en espérant que c'est cela que tu recherches.
Bonjour Dan42153,
Pour répondre à ta question, la séparation des niveaux sont fait par les "." (A.00.01.DOM)
A. 00. 01. DOM
Famille Sous famille Sous famille Niv2 Sous famille Niv3
Bonjour et1000lio,
Avec la formule RECHECHEV, ce n'est pas possible car dès fois y à 3 ou 2 caractères.
On le voit bien sur la première ligne (qui est un article), la sous famille est sur 3 caractères (D.D09.C.) alors que d'autre non (A.00.01.DOM).
J'en déduis que le nombre de niveaux de l'arborescence n'est pas homogène : le code "A.CO.DAN." a 3 niveaux, et le code "A.06.601.DAN." en a 4.
Mais tes exemples ne me sont pas suffisants pour pouvoir t'aider : as-tu une liste des sous-familles de chaque niveau ? Ces niveaux sont -ils dépendants ou interdépendants ? En d'autres termes, si on choisi une sous-famille 4, est-ce-que ça indique automatiquement la 3, la 2, et la 1 ?
Ou bien, au moment de la classification des articles, faut-il analyser chaque partie de son code de classification pour remonter les infos ?
Ces deux problématiques différentes supposent une organisation différentes des données, à mon avis, d'où ces questions...
A+ Daniel
Une première hypothèse en PJ :
- tous les niveaux de classification sont indépendants les uns des autres (par d'arborescence) : un article peut appartenir à n'importe lequel des 4 niveaux
- on saisit chaque code de niveau, et on obtient en retour le code complet et le libellé de chaque niveau (ou d'autres informations des niveaux)
- on pourra totaliser les articles pour chaque niveaux, et faire des stat tous azimuts sur toutes ces codifications...
Mais ça c'est une première hypothèse : est-ce-qu'on est loin ?
A+ Daniel
paS d'arborescence, voulais-je dire...
Désolé Dan42153, je n'ai pas pu te répondre.
Voilà ce que j'ai besoin, c'est de savoir pour l'article 12095008417 TRANSFO POUR BANDEAU LED 50 W REF:5008417 qui à le code famille D.D09.C. que sa famille c'est ELECTRICITE (D.) puis sa sous famille c'est ECLAIRAGE (D09C.) puis sa sous famille niv2 c'est CONSTRUCTEURS (C.) etc...
Le but derrière c'est pour importer cette base dans un logiciel de gestion.
A ce moment là, avant le travail que je t'ai posté, il faudrait une bonne âme sur VBA (je vais pas avoir le temps de le faire cet après-midi), qui découpe la colonne C grâce au point dans les 4 colonnes suivantes. Ces dernières contiennent des formules récupérant les caractéristiques des classifications...
Bonjour Dan42153 et quirion , pour le découpage voici la macro dont tu pourras te servir qui ira chercher les noms des familles et sous familles
Sub famille()
Dim table() As String, i%, quoi As Variant, trouve As Range
i = 2
With Feuil1
While .Range("c" & i) <> ""
table = Split(.Range("c" & i), ".")
For j = 0 To 5
On Error Resume Next
If Len(table(j) & ".") > 1 Then .Cells(i, j + 4) = table(j) & "."
quoi = table(j) & "."
If Len(quoi) > 1 Then
Set trouve = Feuil2.Range("a1:a" & Range("a" & Rows.Count).End(xlUp).Row).Find(quoi, lookat:=xlPart)
If Not trouve Is Nothing Then .Cells(i, j + 4) = trouve.Offset(0, 2)
End If
Next
i = i + 1
Wend
End With
End Sub
et si les résultats ne sont pas probant (je n'ai pas tout vérifié) tu peux utiliser cette marco là pour simplement récuperer les appélations (A., CO....)
Sub famille()
Dim table() As String, i%, quoi As Variant, trouve As Range
i = 2
With Feuil1
While .Range("c" & i) <> ""
table = Split(.Range("c" & i), ".")
For j = 0 To 5
On Error Resume Next
If Len(table(j) & ".") > 1 Then .Cells(i, j + 4) = table(j) & "."
Next
i = i + 1
Wend
End With
End Sub
J'sais pas pourquoi j'ai fait une fixation sur les points et je les laissé dans les recherches...C't'un bug de mon cerveau j'crois...
Bonjour,
J'ai trouvé la solution avec un script VBA.
Voici le script :
Sub Report()
Dim Chemin As String, Référence_1 As String, Référence_2 As String, Référence_3 As String, Référence_4 As String, Suite As String
Dim Point_1 As Byte, Point_2 As Byte, Point_3 As Byte
Dim Famille_1 As Integer, Famille_2 As Integer, Famille_3 As Integer, Famille_4 As Integer
Dim i As Integer, DerLig As Integer
Application.ScreenUpdating = False
Chemin = ThisWorkbook.Path
DerLig = Range("A" & Rows.Count).End(xlUp).Row
ActiveWorkbook.Sheets("Famille").Copy After:=ActiveWorkbook.Sheets("Famille")
Sheets("Famille (2)").Name = "Feuille_provisoire"
Sheets("Feuille_provisoire").Move Before:=ThisWorkbook.Sheets(1)
Application.DisplayAlerts = False
Application.DisplayAlerts = True
Sheets("TOUTPublicDL").Select
For i = 2 To DerLig
Point_1 = WorksheetFunction.Search(".", Range("C" & i))
Référence_1 = Left(Range("C" & i), Point_1)
Suite = Right(Range("C" & i), Len(Range("C" & i)) - Point_1)
Point_2 = WorksheetFunction.Search(".", Suite)
Référence_2 = Left(Range("C" & i), Point_1 + Point_2)
Suite = Right(Range("C" & i), Len(Range("C" & i)) - (Point_1 + Point_2))
Point_3 = WorksheetFunction.Search(".", Suite)
If Left(Range("C" & i), Point_1 + Point_2 + Point_3) = Référence_2 Then
Référence_3 = ""
Else
Référence_3 = Left(Range("C" & i), Point_1 + Point_2 + Point_3)
End If
If Range("C" & i) = Référence_3 Then
Référence_4 = ""
Else
Référence_4 = Range("C" & i)
End If
'Reports
On Error Resume Next
Famille_1 = WorksheetFunction.Match(Référence_1, Sheets("Feuille_provisoire").Range("A:A"), 0)
Famille_2 = WorksheetFunction.Match(Référence_2, Sheets("Feuille_provisoire").Range("A:A"), 0)
Famille_3 = WorksheetFunction.Match(Référence_3, Sheets("Feuille_provisoire").Range("A:A"), 0)
Famille_4 = WorksheetFunction.Match(Référence_4, Sheets("Feuille_provisoire").Range("A:A"), 0)
Range("E" & i) = Sheets("Feuille_provisoire").Range("C" & Famille_1)
Range("F" & i) = Sheets("Feuille_provisoire").Range("C" & Famille_2)
If Famille_3 > 0 Then Range("G" & i) = Sheets("Feuille_provisoire").Range("C" & Famille_3)
If Famille_4 > 0 Then Range("H" & i) = Sheets("Feuille_provisoire").Range("C" & Famille_4)
Famille_1 = 0
Famille_2 = 0
Famille_3 = 0
Famille_4 = 0
Next i
Application.DisplayAlerts = False
Sheets("Feuille_provisoire").Delete
Application.DisplayAlerts = True
End Sub
Merci en tout cas pour vos réponses.
Bye