Zone de menu déroulante conditionnel sans UseForm

Bonjour,

J'essai de faire deux "zones de menu déroulantes" (Via Formulaires) le second étant en condition de sélection du premier.

J'ai vu des solutions et des fichiers Excel sur ce forum et ailleurs via UseForm pour les menu déroulant conditionnel, mais pas selon ce que je souhaite faire.

J'ai créer aussi une liste de nom pour les cibler plus facilement par macro.

Je souhaite que ma série de "machines" menu déroulant de gauche face du conditionnel sur son "numéro", menu déroulant de droite.

Ex Série "BB 60.000" Ne m'affiche que les numéros machine "BB60.001,BB60.002,..." et pas les 75.000

Je choisi BB 75.000" cela ne m'affiche que "BB75.001,BB75.002,..." et pas les 60.000

Comment faire? Sachant qu'au final j'aurait 7 types de machines différentes avec chacun leurs "numéros"

25classeur1.xlsx (16.20 Ko)

Bonsoir,

Pour ce faire, il faut utiliser des listes déroulantes de type ActiveX et non de type Formulaire.

ci-jointe une solution en créant des références de nom pour les colonnes B et C de la feuille2, ces références correspondant à celles de la colonne A.

73test1.xlsm (27.67 Ko)

C'est tout a fait ce que je cherche mais par contre je ne sais pas en créer par ActiveX.

Je connait la méthode de création par "formulaire", "données" mais pas par ActiveX.

Comment as tu défini la plage de combobox1 et combobox2? Si j'ai à rajouter d'autre série en box 1 (case en +) qui conditionnera la box 2 (colonne en plus)?

ActiveX se fait il que par Ruban-Dévellopeur-Visual Basic?

Pourrais-t-on ensuite extraire la valeur présent dans la case combobox 2 dans une cellule simple? Genre A1.

Nevasane a écrit :

ActiveX se fait il que par Ruban-Dévellopeur-Visual Basic?

Onglet Développeur --> Bouton Insérer
Nevasane a écrit :

Comment as tu défini la plage de combobox1 et combobox2

1- plage Combobox1

Onglet Développeur --> cliquer sur Bouton Mode Création

a- cliquer sur le contrôle Combobox1 pour le sélectionner

b- cliquer sur le bouton Propriétés pour afficher les propriétés du contrôle

c- propriété ListFillRange = Titre (Titre correspond au nom défini pour la colonne A de la Feuille2, cette définition intégrant toute modification ultérieure de la colonne A)

d- cliquer une nouvelle fois sur le Bouton Mode Création pour revenir au mode normal.

2 plage Combobox2

définie dans le code de la Feuille1 par l'événement change du contrôle Combobox1.

Nevasane a écrit :

Pourrais-t-on ensuite extraire la valeur présent dans la case combobox 2 dans une cellule simple? Genre A1.

Oui.

Il suffit de rajouter dans le code de la Feuille1, les lignes suivantes

Private Sub ComboBox2_Change()

    Range("A1") = ComboBox2.Value

End Sub

Y aurait il une macro VBA pour enregistrer un fichier (pdf,jpeg,...) dans une cellule ou autre?

J'ai trouver par: "Insertion - Texte - Objet" Mais c'est un peu long. Genre, je souhaite créer un bouton formulaire et hop sa m'ouvre une fenêtre exploration Windows allant chercher le fichier PDF (par exemple) et le sauvegardant avec mon classeur Excel.

Même si le fichier PDF et sur clé USB et que la clé USB n'est plus connecter, je peut encore ouvrir mon fichier sur mon classeur Excel.

Un truc VBA pas compliquer sinon je ferais par la voie classique.

J'arrive pas à voir sur quel ligne du programme est défini les "colonnes" ou leur "nom"

Le nom de la colonne est donné par ComboBox1.Value car j'ai donné aux colonnes B et C, les noms figurant dans la colonne A.
Nevasane a écrit :

Si je traduit bien le programme le "nb_lignes =

Application.CountA est la fonction "nbval" sous Excel qui compte le nombre de lignes non vides d'une plage. Ici, nb_lignes représente donc le nombre de lignes utilisées de la colonne B ou C moins celle de l'entête.

Ce qui permet de définir dans la colonne B ou C, la plage des lignes utilisées. L'instruction "set table =" définit cette plage.

"ComboxBox2.list = ..." lecture de la table et la valeur.

ComboxBox2.list = table.value

table.value représente les valeurs de la plage "table", c'est à dire un tableau à 2 dimensions dont la première représente la ligne et la seconde la colonne.

thev a écrit :

Le nom de la colonne est donné par ComboBox1.Value car j'ai donné aux colonnes B et C, les noms figurant dans la colonne A.

J'ai vu en effet, j'ai pu reproduire cette copie en rajoutant un troisième nom dans la colonne A et reporter ce nom en nom de colonne. En effet sur la combobox1 j'ai bien eu le nom rajouter, et en combobox2 la liste qui en est rattachée.

Mais ou est la variable combobox1.Value si je veut mettre une autre colonne. Dans Ruban-Contrôle-Propriétés-ComboBox1 et dans le tableau de variables la case Value? (Comme la variable: ListFillRange).

Nevasane a écrit :

Mais ou est la variable combobox1.Value si je veut mettre une autre colonne

Cette variable dépend du choix effectué dans combobox1. Pour mettre une autre colonne, il suffit de cliquer sur combobox1 et d'effectuer un autre choix.

Je crois avoir trouver comment: On donne un nom à une colonne et se nom on le met dans combobox1 Propriétés-ListFillRange.

Nevasane a écrit :

Je crois avoir trouver comment: On donne un nom à une colonne et se nom on le met dans combobox1 Propriétés-ListFillRange.

Oui.

Mais pour adapter la liste à toute modification de la colonne,

1- le nom doit être défini ainsi : "=DECALER(Feuil2!$A:$A;1;0;NBVAL(Feuil2!$A:$A)-1;1)" (exemple pour la colonne A)

2- la propriété ListFillRange doit aussi être réinitialisée via l'événement Worksheet_Activate, comme ceci:

Private Sub Worksheet_Activate()

    'initialisation Combobox
    ComboBox1.ListFillRange = <nom_colonne>
    ComboBox1.Value = Empty
    ComboBox2.Value = Empty

End Sub

NB : Il faut savoir que les Contrôles ActiveX rattachés à une feuille conservent toujours leurs valeurs contrairement à ceux rattachés à un UserForm qui eux sont systématiquement réinitialisés à son déchargement.

=DECALER(Feuil2!$A:$A;1;0;NBVAL(Feuil2!$A:$A)-1;1)

C'est le code que j'ai mis sur la sélection de la colonne D quand j'ai créer le nom dans le "Gestionnaire de nom"soit:

=DECALER(Feuil2!$D:$D;1;0;NBVAL(Feuil2!$D:$D)-1;1) dans la case "Fait référence à :" pour sélectionner la colonne.

Par contre j'ai pas rajouter la ligne: ComboBox1.ListFillRange = <nom_colonne> dans le programme, il fonctionne quand même, même si je rajoute des lignes dans ma colonne D. Il s'actualise bien et dans la ComboBox2 il met bien ma liste conditionnel.

Edit:

Alors sa marche quand même, mais sans la commande "ComboBox1.ListFillRange = <nom_colonne>" je suis obliger de quitter Excel pour que sa valide mes modifications. Surement quitter/démarrer réinitialise "ListFillRange".

Nevasane a écrit :

C'est le code que j'ai mis sur la sélection de la colonne D quand j'ai créer le nom dans le "Gestionnaire de nom"soit:=DECALER(Feuil2!$D:$D;1;0;NBVAL(Feuil2!$D:$D)-1;1) dans la case "Fait référence à :" pour sélectionner la colonne.

Forcément , car j'ai programmé l'équivalent de cette formule en VBA pour éviter de mettre cette formule à chaque fois pour toutes les colonnes concernées

   
    'définition table à partir de la valeur de Combobox1 et selon le nombre de lignes utilisées
    nb_lignes = Application.CountA(Feuil2.Range(ComboBox1.Value)) - 1
    Set table = Feuil2.Range(ComboBox1.Value).Resize(nb_lignes).Offset(1)

Mais si tu t'astreints à le faire pour chaque colonne et à modifier en conséquence les noms des colonnes B et C, alors tu peux largement simplifier le code VBA comme ceci :

Private Sub ComboBox1_Change()

    ComboBox2.ListFillRange = ComboBox1.Value

End Sub

Ok donc je replace ceci:

(

'définition table à partir de la valeur de Combobox1 et selon le nombre de lignes utilisées

nb_lignes = Application.CountA(Feuil2.Range(ComboBox1.Value)) - 1

Set table = Feuil2.Range(ComboBox1.Value).Resize(nb_lignes).Offset(1)

)

Par:

(

Private Sub ComboBox1_Change()

ComboBox2.ListFillRange = ComboBox1.Value

End Sub

)

Comme ça dans "comboBox2" sur sa ligne "ListFillRange" présent dans propriété on verra toujours la valeur de comboBox1, Après si j'ai bien suivi j'aurais juste à bien nommé mes titres de colonnes par la fonction "Gestionnaire des noms" et le tour est jouer.

Mon projet est lié a la maintenance, je voudrais faire du conditionnel a deux étages.

"Série machine" (ComboBox1) ---------->>>>> le "N° machine" (ComboBox2)

v

v

v-->>>>>ET "l'Organe" (ComboBox3) qui conditionne lui le "code défaut" (ComboBox4)

Est ce possible d'avoir deux conditionnel box 2et box 3 conditionner selon box1?

Nevasane a écrit :

Ok donc je remplace ceci:

Oui. mais ne pas oublier de modifier ceci

Private Sub Worksheet_Activate()
    'initialisation Combobox
    ComboBox1.ListFillRange = Titre
    ComboBox1.Value = Empty
    ComboBox2.Value = Empty
End Sub

et de conserver cette instruction :

Private Sub ComboBox1_Change()

    If ComboBox1.Value = Empty Then Exit Sub
    ComboBox2.ListFillRange = ComboBox1.Value

End Sub
Nevasane a écrit :

Est ce possible d'avoir deux conditionnel box 2et box 3 conditionner selon box1?

Oui. En assignant 2 colonnes au lieu d'une à Combobox1. Mais le choix sera fait sur la colonne 1 et la valeur de la colonne 2 sera forcément celle associée à la ligne de la colonne 1 choisie.

Ok donc si j'ai bien compris

Admettons que je choisi ma série 60.000 sur ComboBox1 et je choisi la machine 60.005 sur ComboBox2 (donc 5 lignes de ma première colonne) cela fera aussi valider la 5ème ligne de ma 2ème colonne sur ComboBox3?

Ce qui est possible, si je prends cet exemple,

Titre***** organe

BB60.000 organe1

BB75.000 organe2

Si BB60.000 est sélectionné via Combobox1, alors organe1 l'est également et la combobox3 peut être remplie avec le contenu d'une colonne nommée organe1.

Si BB75.000 est sélectionné via Combobox1, alors organe2 l'est également et la combobox3 peut être remplie avec le contenu d'une colonne nommée organe2.

J'aimerai savoir s'il est possible de mettre un fichier (pdf,jpeg,...) dans un fichier excel?

J'ai vu que l'on peut mettre un lien vers un fichier par "Insertion - Texte - Objet - Créer à partir du fichier". Mais si jamais le fichier est sur clé USB le lien sera couper donc l'accès au fichier aussi.

Peut-on mettre une macro VBA sur un bouton formulaire pour qu'un fichier pdf de quelques octets soit dans le fichier excel?

Car ce fichier servira la maintenance et je peut être amener un mettre dans mon fichier Excel, un relevé code défaut.

Sub ExportTxt()
Dim CheminFichierTxt As String
Dim Tablo() As Variant

Tablo = Range("A89:A101").Value
CheminFichierTxt = "C:\Users\Flo\Desktop\Astuce.txt"
NumFichier = FreeFile()

Open CheminFichierTxt For Output As #NumFichier

'tu parcours le tableau
For i = 1 To UBound(Tablo)
    For j = 1 To UBound(Tablo, 2)
        Print #NumFichier, Tablo(i, j)
    Next j
Next i

Close #NumFichier ' Ferme le fichier.
End Sub

J'aimerai rajouter dans cette macro la date du jour au moment de la sauvegarde. Ou bien extraire le contenu d'une cellule en format txt sur un chemin spécifique selon le nom de 2 cellules

J'ai créer un autre sujet lié à mon autre problème, Mais celui-ci est résolu.

Rechercher des sujets similaires à "zone menu deroulante conditionnel useform"