Afficher une rubrique dans laquelle se trouve un produit en fonction de ses carac.

loukrelh

XLDnaute Nouveau
Bonjour,

Nouveau sur le forum, je suis là pour essayer d’apprendre de nouvelles choses sur Excel.
J’aimerais mettre en place un outil Excel de recherche de Seuil et de calcul dans le cadre de mon travail, mais je n’ai pas « tablé » depuis quelques années...

J’ai défini plusieurs étapes, variables et contraintes.

La première étape est de trouver la ou les rubriques dans laquelle ou lesquelles se trouve un produit chimique en fonction de sa ou ses mentions de danger (Définit par une mention H « … » où « … » est une suite de caractères numériques.
On va donc se concentrer sur deux variables :

-la ou les mentions relatives au produit (à rentrer manuellement dans l’inventaire)
-la ou les rubriques (que l’on recherche) -> liées à des mentions définies dans une Base de données.

Contraintes :
- Catégorie de la mention (Différentes rubriques pour une mention)
- Plusieurs mentions par produit (Chaînes de caractères) et donc par cellule
- Il peut y avoir plusieurs mentions par rubriques
- Un produit peut être dans plusieurs rubriques
- Une mention peut avoir plusieurs catégories (Par exemple, H999 de catégorie 1 mortel pour toto ou de catégorie 2 mortel pour tata)

Voilà, je pense que le plus simple est de comparer une chaîne de caractère (Par exemple : H225-H220-H240) dans une cellule, avec une base de données (Située sur une autre feuille) et de renvoyer une cellule spécifique si l’un des caractères (Par exemple H220) se trouve dans la cellule.

Malheureusement, je ne sais absolument pas comment m’y prendre.
Ce n’est que la première étape du travail, je veux chercher le reste tout seul et reviendrais vers vous si je ne trouve pas (Et si vous acceptez !).

Je vous joins un fichier Excel au cas où mes explications ne seraient pas complètes. (Il y a bien plus de colonnes à la base mais elles ne sont pas utiles pour l’instant)

Merci beaucoup.
 

Pièces jointes

  • Inventaire simplifié.xlsx
    11 KB · Affichages: 82
  • Inventaire simplifié.xlsx
    11 KB · Affichages: 84
  • Inventaire simplifié.xlsx
    11 KB · Affichages: 72
Dernière édition:

loukrelh

XLDnaute Nouveau
Re : Afficher une rubrique dans laquelle se trouve un produit en fonction de ses cara

Merci, je regarde ça aujourd'hui, je vous tiens au courant !

EDIT : Avec la première façon de faire, il y a une erreur de compilation (impossible d'affecter à un tableau)
Je continue !
 
Dernière édition:

loukrelh

XLDnaute Nouveau
Re : Afficher une rubrique dans laquelle se trouve un produit en fonction de ses cara

Bonjour,

A l'aide de formules associées à la macro, le programme fonctionne.

Par contre, il reste des erreurs dans la macro :

- Pourquoi es que parfois, certaines rubriques s'effacent toutes seules (Obligé de revalider chaque cases de mentions pour faire réapparaitre les rubriques en face)
- Un second critère (Dit Numéro CAS) ne fonctionne pas correctement, alors qu'il est codé de la même manière.

Ci-joint le fichier Excel, qui sera sans doute bien plus compréhensible.

Merci !
 

Pièces jointes

  • 02-Liste produits chimiques 2015 - Version de travail.zip
    255.4 KB · Affichages: 46
  • 02-Liste produits chimiques 2015 - Version de travail.zip
    255.4 KB · Affichages: 45
  • 02-Liste produits chimiques 2015 - Version de travail.zip
    255.4 KB · Affichages: 42

Dranreb

XLDnaute Barbatruc
Re : Afficher une rubrique dans laquelle se trouve un produit en fonction de ses cara

Bonjour.
Vote zip ne contient qu'un xlsx, donc sans macro. De plus mon convertisseur en xls semble peiner à l'ouvrir. Ne pourriez vous me le mettre directement en xls, seul compatible avec ma version d'Excel ?
 

loukrelh

XLDnaute Nouveau
Re : Afficher une rubrique dans laquelle se trouve un produit en fonction de ses cara

Je l'ai remis en XLS, ça marche cette fois?

Merci
 

Pièces jointes

  • 02-Liste produits chimiques 2015 - Version de travail.zip
    287 KB · Affichages: 51
  • 02-Liste produits chimiques 2015 - Version de travail.zip
    287 KB · Affichages: 68
  • 02-Liste produits chimiques 2015 - Version de travail.zip
    287 KB · Affichages: 40

loukrelh

XLDnaute Nouveau
Re : Afficher une rubrique dans laquelle se trouve un produit en fonction de ses cara

Toutes mes excuses, chez moi ça marche..

Je l'ai mis en : prend en charge les macros.

J'espère que ça marche cette fois.

Merci
 

Pièces jointes

  • 02-Liste produits chimiques 2015 - Version de travail.zip
    286.8 KB · Affichages: 30
  • 02-Liste produits chimiques 2015 - Version de travail.zip
    286.8 KB · Affichages: 25
  • 02-Liste produits chimiques 2015 - Version de travail.zip
    286.8 KB · Affichages: 18
Dernière édition:

loukrelh

XLDnaute Nouveau
Re : Afficher une rubrique dans laquelle se trouve un produit en fonction de ses cara

Dernier essai, en le repassant en 2003..

Merci
 

Pièces jointes

  • 02-Liste produits chimiques 2015 - Version de travail.zip
    198.2 KB · Affichages: 24
  • 02-Liste produits chimiques 2015 - Version de travail.zip
    198.2 KB · Affichages: 59
  • 02-Liste produits chimiques 2015 - Version de travail.zip
    198.2 KB · Affichages: 28

Dranreb

XLDnaute Barbatruc
Re : Afficher une rubrique dans laquelle se trouve un produit en fonction de ses cara

J'ai pu lire le dernier xls.
Mais j'ai des =_xlfn.SUMIFS(Inventaire!$AW$5:$AW$998;Inventaire!$CB$5:$CB$998;A2) qui correspondent je crois à des SOMME.SI.ENS qui est une fonction qui n'existe pas chez moi. Peut être devrait-ce être la Private Sub Worksheet_Activate qui en profite pour les établir, je ne sais pas.
Bon, c'était quoi déjà la question ?
 

loukrelh

XLDnaute Nouveau
Re : Afficher une rubrique dans laquelle se trouve un produit en fonction de ses cara

Pas besoin de s'occuper des formules, elles marchent.

C'est juste un soucis dans la macro.

Parfois les mentions ne correspondent pas (Par exemple, une mention vide va donner une rubrique sans raison). Il faut retaper dans la case pour que ça marche correctement.

Deuxièmement, j'ai plus ou moins copié/collé la macro pour la réutiliser de la même manière, mais avec un critère de base différents (Numéro CAS donnant des rubriques). Par contre, cette formule semble marcher sur les premières ligne, une fois mais ne remarche plus du tout après, même en revalidant.

J'espère que j'ai été plus ou moins claire..

Merci
 

Dranreb

XLDnaute Barbatruc
Re : Afficher une rubrique dans laquelle se trouve un produit en fonction de ses cara

Non, non. Je n'y comprends rien, tant il y a de choses dans votre classeur. De quelles colonnes parlez vous ?

Ah, j'ai vu un Feuil6 (Base de donnée ND) avec de la programmation qui commence par quelque chose qui ne peut pas marcher : Activate1 n'est pas un évènement d'un objet Worksheet.
En fait je crois que vous devez enlever tous les 1 à la fin des choses.
Un module Worksheet est un module Objet. Tout ce qu'il contient lui est propre. Même si c'est déclaré avec le mot clé Public: Ça en fait juste une propriété ou une méthode accessible dans un autre module à condition de la faire précéder d'une expression qui représente l'objet Worksheet, suivie d'un point, mais ça lui reste propre quand même. Un DicRub de Feuil6 ne serait pas le même Dictionnary que le DicRub de Feuil1. Tout ce qui est dans des modules objets est toujours complètement séparé du reste du projet. Il n'y a que les modules standards qui se partagent tout le projet.
 
Dernière édition:

loukrelh

XLDnaute Nouveau
Re : Afficher une rubrique dans laquelle se trouve un produit en fonction de ses cara

Macro de la feuille 1 :

On écrit une suite de caractère de type "H***" dans la colonne 76 (Toujours 3*, "*" correspondant à un chiffre). Il peut y avoir plusieurs suites de caractères de ce type, séparées par un "-." La macro recherche alors dans la feuille 5 si cette suite de caractère correspond à une rubrique ou plusieurs rubriques. Elle inscrit alors la ou les rubriques correspondantes (séparées par un tiré) dans la colonne 77.

Macro de la feuille 6 :

On écrit une suite de caractère de type "***-***-***" dans la colonne 10. (Le nombre de "*" n'importe pas, * correspondant à un chiffre). Il peut y avoir plusieurs suites de caractères de ce type, séparées par un "/". La macro recherche alors dans la feuille 6 si cette suite de caractère correspond à une rubrique ou plusieurs rubriques. Elle inscrit alors la ou les rubriques correspondantes (séparées par un tiré) dans la colonne 78.

Voilà le but de la macro.

En enlevant les 1, cela ne marchait pas plus. Je pensais que cela créait un conflit entre les deux macros. (Feuille 1 et feuille 6)


Merci
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : Afficher une rubrique dans laquelle se trouve un produit en fonction de ses cara

Par contre si vous deviez avoir d'autres feuilles avec encore la même chose, vous pourriez avoir intérêt à utiliser des Functions et Sub d'un module standard convenablement paramétrées pour constituer leurs différents Dictionary, retrouver une rubrique etc. plutôt que de toujours tout réécrire.
 

loukrelh

XLDnaute Nouveau
Re : Afficher une rubrique dans laquelle se trouve un produit en fonction de ses cara

Utiliser un seul module pour refaire l'opération en changeant juste les critères? Cela peut être judicieux si dans le futur je rajoute d'autres critères.. Je comprend mais je ne sais pas trop comment faire.

Par contre, en enlevant tous les 1 dans la feuille 6, cela ne fonctionne toujours pas.
 

Dranreb

XLDnaute Barbatruc
Re : Afficher une rubrique dans laquelle se trouve un produit en fonction de ses cara

Il faut écrire des procédures auxquelles vous passeriez le DicRub de la feuille ainsi que les valeurs des colonnes à considérer en paramètres. Ou même les cellules de départ.
Sinon peut être auriez vous intérêt à reprendre le code de Feui1 pour être sûr de ne pas en oublier et juste changer ce qui diffère.

C'est curieux, moi j'ai gardé un DicSpcLoukrelh.xls avec une Function RubriquesCorresp écrite un peu différemment, qui garantirait que les rubriques trouvées seraient resituées dans leur ordre.

Mais bon. Sinon le module MRubriques pourrait ressembler à ça :
VB:
Option Explicit

Function DicoRubriques(ByVal RubCléDébut As Range, Optional ByVal Séparateur As String = vbLf) As Dictionary
Dim Te(), L As Long, Rub As String, TMen() As String, M As Long, Men As String, TRub() As String, R As Long
Te = ColUti(RubCléDébut).Value
Set DicoRubriques = New Dictionary
For L = 1 To UBound(Te)
   Rub = Te(L, 1)
   If IsEmpty(Te(L, 2)) Then ReDim TMen(-1 To -1) Else TMen = Split(Te(L, 2), Séparateur)
   For M = 0 To UBound(TMen)
      Men = TMen(M)
      If DicoRubriques.Exists(Men) Then
         TRub = DicoRubriques.Item(Men)
         R = UBound(TRub) + 1: ReDim Preserve TRub(0 To R)
      Else: R = 0: ReDim TRub(0 To 0): End If
      TRub(R) = Rub
      DicoRubriques.Item(Men) = TRub: Next M, L
End Function

Sub MàJRubriques(ByVal DicRub As Dictionary, ByVal ColDest As Range, ByVal PhrDébut As Range, ByVal Séparateur As String)
Dim Te(), Ts(), L As Long
Set PhrDébut = ColUti(PhrDébut): Te = PhrDébut.Value
ReDim Ts(1 To UBound(Te), 1 To 1)
For L = 1 To UBound(Te): Ts(L, 1) = Rubriques(DicRub, Te(L, 1), Séparateur): Next L
Intersect(ColDest.EntireColumn, PhrDébut.EntireRow).Value = Ts
End Sub

Function Rubriques(ByVal DicRub As Dictionary, ByVal Phrases As String, ByVal Séparateur As String) As String
Dim TSpl() As String, M As Long, TRub() As String, Mot As String, N As Long, Dic As New Dictionary
TSpl = Split(Phrases, Séparateur)
For M = 0 To UBound(TSpl): Mot = Trim$(TSpl(M))
   If DicRub.Exists(Mot) Then
      TRub = DicRub(Mot)
      For N = 0 To UBound(TRub): Dic(TRub(N)) = Empty: Next N: End If: Next M
Rubriques = Join(Dic.Keys, "-")
End Function

Je me suis aperçu d'un bogue: une variable "le" au lieu de "L", que j'ai corrigé.
J'ai pu faire fonctionner tout ça avec ce code un peu plus court dans Feuil1, uniquement pour ce qui existait déjà.
VB:
Option Explicit
Dim DicRub As Dictionary ' Type de la bibliothèque Scripting (référence "Microsoft Scripting Runtime")

Private Sub Worksheet_Activate()
ConstitDicRub
MàJRubriques DicRub, Me.Columns(77), Me.Cells(5, 76), "-"
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column <> 76 Or Target.Row < 5 Or Target.Count <> 1 Then Exit Sub
ConstitDicRub
Target.Offset(, 1).Value = Rubriques(DicRub, Target.Value, "-")
End Sub
Private Sub ConstitDicRub()
If DicRub Is Nothing Then Set DicRub = DicoRubriques(Feuil5.[A2:B2], vbLf)
End Sub
Private Sub Worksheet_Deactivate()
Set DicRub = Nothing
End Sub
Ceci paraît intéressant pour la suite :
VB:
Option Explicit
Dim DicMen As Dictionary, DicCas As Dictionary ' Type de la bibliothèque Scripting (référence "Microsoft Scripting Runtime")

Private Sub Worksheet_Activate()
ConstitDicMen
ConstitDicCas
MàJRubriques DicMen, Me.Columns(77), Me.Cells(5, 76), "-"
MàJRubriques DicCas, Me.Columns(78), Me.Cells(5, 10), "/"
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Row < 5 Or Target.Count <> 1 Then Exit Sub
Select Case Target.Column
   Case 76: ConstitDicMen: Target.EntireRow.Columns(77) = Rubriques(DicMen, Target.Value, "-")
   Case 10: ConstitDicCas: Target.EntireRow.Columns(78) = Rubriques(DicCas, Target.Value, "/")
   End Select
End Sub
Private Sub ConstitDicMen()
If DicMen Is Nothing Then Set DicMen = DicoRubriques(Feuil5.[A2:B2], vbLf)
End Sub
Private Sub ConstitDicCas()
If DicCas Is Nothing Then Set DicCas = DicoRubriques(Feuil6.[A2:B2], vbLf)
End Sub

Private Sub Worksheet_Deactivate()
Set DicMen = Nothing
Set DicCas = Nothing
End Sub
Et je m'arrête là pour ce soir…
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 074
Messages
2 085 059
Membres
102 768
dernier inscrit
clem135164