Choix VBA

Bonjour à tous,

J'ai une "petite" question.

Tout d'abord je m'explique,

j'ai une base avec des marques, des produits et des origines. (et pleins d'autres choses qui ne m'intéressent pas)

j'aimerais que lorsque je choisis une marque puis un produit, il me propose les origines correspondantes.

Je ne peux pas le faire via une liste car j'ai beaucoup trop de données

j'aurais donc voulu savoir si c'était possible via une macro (sachant que je débute dans les macros).

En sachant que j'ai des doublons pour les marques et produits et que seul l'origine change. Par exemple :

capture2

Alors je me demande si je fais du VBA, il ne va pas s'arrêter aux premières valeurs qu'il trouve et me mettre du coup la première origine trouvée dans la base...

Je ne sais pas si je suis claire...

Cdlt,

Clem

Bonjour,

En VBA on peut retourner des tableaux, il suffit de n'y renseigner que les origines pour lesquelles on a les deux critères qui sont vérifiés.

Bonjour cleiiim ainsi que Ausecour,

sinon un Tableau Croisé Dynamique avec des segments c'est pas mal aussi.

Bonne journée.

5cleiiim.xlsx (15.76 Ko)

Re,

Pour être plus claire et précise je vous joint un extrait du fichier

Donc dans la feuille TRAME, j'ai en B13 une liste

Je fais donc mon choix

Ensuite en B14 j'ai une liste en cascade où je fais mon choix également

Ensuite j'ai créé une macro pour ma cellule B15 qui va chercher mes infos en fonction de ces choix. Ma macro est la suivante :

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Application.Intersect(Target, Cells(13, 2)) Is Nothing Then Call Origine_MP
If Not Application.Intersect(Target, Cells(14, 2)) Is Nothing Then Call Origine_MP
End Sub

Sub Origine_MP()
Dim Réf As String
Dim x As Long, y As Long, z As Long
Cells(15, 2).ClearContents
Réf = Sheets("TRAME").Cells(14, 2) & Sheets("TRAME").Cells(13, 2)
For x = 5 To Sheets("Base Qualité").Range("A" & Rows.Count).End(xlUp).Row
    If Sheets("Base Qualité").Cells(x, 4) & Sheets("Base Qualité").Cells(x, 6) = Réf Then
        For y = 7 To 7
        If Sheets("Base Qualité").Cells(x, y).Value <> "" Then
                            Sheets("TRAME").Cells(15, 2) = Sheets("Base Qualité").Cells(x, y)
                                               End If
                                               Next
                                               End If
                                               Next

End Sub

Le problème c'est que dans ma cellule B15, il peut y avoir 2 possibilités que j'aimerais pouvoir choisir.

Sauf que la ma macro écrase le premier choix et met le deuxième choix (on le voit bien quand on lance la macro)

Avez-vous des idées ?

Clem

5base-forum.xlsm (507.92 Ko)

Bonjour,

Je te retourne ton fichier après correction

Merci du retour,

Le problème c'est que je ne peux pas mettre une simple liste.

Car dans mon fichier réel, j'ai + de 200 produits.

Et il peut y avoir 5 origines différentes.

Et en fait moi j'aimerais que pour un produit choisi il me propose les origines correspondantes. et non toutes les origines possibles...

Clem

Bonjour,

Je ne suis pas sûr que tu aies suffisament regardé ma solution

Ton code est devenu :

Sub Origine_MP()
Dim Réf As String, formule As String
Dim x As Long
Cells(15, 2).ClearContents
Sheets("TRAME").Cells(15, 2).Validation.Delete
If Sheets("TRAME").Range("b14") = "" Or Sheets("TRAME").Range("b13") = "" Then Exit Sub
With Sheets("Base Qualité")
    Réf = Sheets("TRAME").Cells(14, 2) & Sheets("TRAME").Cells(13, 2)
    For x = 5 To .Range("A" & Rows.Count).End(xlUp).Row
        If .Cells(x, 4) & .Cells(x, 6) = Réf Then
            If .Cells(x, 7).Value <> "" Then
                formule = formule & IIf(formule = "", "", ",") & .Cells(x, 7)
            End If
        End If
    Next x
End With

If formule <> "" Then
    With Sheets("TRAME").Cells(15, 2).Validation
        .Delete
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
        xlBetween, Formula1:=formule
        .IgnoreBlank = True
        .InCellDropdown = True
        .InputTitle = ""
        .ErrorTitle = ""
        .InputMessage = ""
        .ErrorMessage = ""
        .ShowInput = True
        .ShowError = True
    End With
    With Sheets("TRAME").Cells(15, 2)
        If InStr(1, formule, ",") = 0 Then
            .Value = formule
        Else
            .Value = ""
        End If
    End With
End If
End Sub

Cette partie

        If .Cells(x, 4) & .Cells(x, 6) = Réf Then
            If .Cells(x, 7).Value <> "" Then
                formule = formule & IIf(formule = "", "", ",") & .Cells(x, 7)
            End If
        End If

Vérifie toujours que les valeurs des colonnes 4 et 6 matchent toujours ta référence, sans quoi, la variable formule ne change pas de valeur.

C'est cette variable qui alimente ensuite ta liste, ce n'est donc pas une simple liste, c'est une liste générée par VBA à partir des lignes qui remplissent ton critère, si tu prends le temps de tester en ajoutant des valeurs qui ne devront pas être dans la liste, tu devrais voir qu'elles n'apparaissent pas...

Tu voulais pouvoir choisir parmis les origines qui correspondent à tes critères, j'appelle ça une liste, je t'ai donc fait une liste

oh youps !

Je vais regarder à ça tranquillement

Merci

Sorry

Bonjour Ausecour,

Alors j'ai testé ton code dans mon fichier et ça marche nickel.

J'ai ajouté des "origines" et lorsque le produit n'est pas concerné par ces "origines", elles ne s'affichent pas et vice versa

C'est top ! Merci

Par contre je ne comprends pas trop cette ligne de code :

formule = formule & IIf(formule = "", "", ",") & .Cells(x, 7)

Clem

Bonjour,

super alors

Je vais rapidement t'expliquer:

formule = formule & IIf(formule = "", "", ",") & .Cells(x, 7)

En fait ici formule va stocker les différentes valeurs que je vais mettre dans ma liste, du coup je dois déjà reprendre les anciennes valeurs, formule, et j'y ajoute la prochaine valeur que j'ai jugée bonne d'ajouter : .cells(x,7)

Au milieu c'est un peu un OVNI:

IIf(formule = "", "", ",")

c'est une fonction SI, mais en VBA, elle vérifie si formule contient déjà quelque chose ou non, si elle ne contient rien, on ajoute rien, sinon, on ajoute une virgule pour séparer les valeurs.

Les & servent juste à rassembler deux chaînes de texte en une seule

Encore merci et merci pour l'explication !

Clem

Bonjour,

De rien

Rechercher des sujets similaires à "choix vba"