[VBA] Liste déroulante conditionnelle complexe

Layoli1

XLDnaute Nouveau
Chers Excelcticien(ne)s,

Un problème qui une fois surmonté simplifierait ma vie :cool:
Merci d'avance à ceux qui vont s'y pencher.

L'onglet Maquette a 3 tables : Air, Hotel et Deroule positionnées les unes en dessous des autres.
L'onglet Tariff a 3 tables : TariffAir, TariffHotel et Tariff.

L'objectif est de créer un formulaire qui se lance lorsque l'on double clic dans une cellule de la colonne D a l'interieur de chaque table de l'onglet Maquette.

Le formulaire doit aider à remplir les colonnes D, E et F en fonction des informations dans les tables Tariff correspondantes sur le principe d'une liste déroulante conditionnelle. Ça serait aussi très utile de pouvoir rentrer plusieurs lignes consécutives avec le même formulaire.

Merci pour tout aide que vous pourriez m'apporter.
[sachant que mes connaissances en VBA sont proches de zero :D]

Bonne journée,

Layoli1
 

Pièces jointes

  • Nouveau Modele de Cotation Excel Forum 2.xls
    47.5 KB · Affichages: 337
C

Compte Supprimé 979

Guest
Re : [VBA] Liste déroulante conditionnelle complexe

Salut Layoli1,

Si je peux me permettre, merci de relire la Lien supprimé et notamment le paragraphe 6
Ils / elles sont là pour vous aider mais en aucun cas faire votre travail à votre place
Si tes connaissances sont proche de ZERO, merci d'utiliser d'autres méthodes que le VBA, ou alors documente toi, il y a un tas de bouquins très explicatifs ..

Montargis :) ne c'est pas fait un 1 jour

Enfin, moi ce que j'en dis ...
 

Layoli1

XLDnaute Nouveau
Re : [VBA] Liste déroulante conditionnelle complexe

Salut BrunoM45,

C'est vrai que je demande beaucoup dans ce post :eek:
Merci quand même de m'avoir répondu avec tact. Très urbain comme on pourrait l'attendre d'un Montargissois ;)

Je réside au Laos et les bouquins sur VBA ne sont disponibles qu'en Thailande et... en thailandais. Impatient de rentrer chez un bon libraire Parisien pour acheter "VBA pour les nuls".

Le problème peut se résoudre avec des listes déroulantes classiques mais la définition de tous les noms est très très laborieuse, oblige à supprimer les espaces et est difficile à faire évoluer.

Pour essayer de mieux poser le problème :
Il faudrait adapter le code (récupéré chez Formation Excel VBA JB) et testé :

Code:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
  If Target.Column = 3 Then
    UserForm1.Show
  End If
  Cancel = True
End Sub

Comment ajouter une condition du type "la ligne doit être comprise dans le tableau xx" ou "le numéro de ligne doit être entre 10 et 30" ? Aussi il semble que cette fonction désactive le double clic classique sur l'ensemble du classeur. Est ce le cas ?

Voici le code du formulaire :
Les choix1, choix2, choix3 sont les noms donnés aux colonnes d'un unique tableau base de données. J'ai exactement la même problématique à la différence qu'elle est répétée 3 fois en ne faisant pas référence aux mêmes tableaux base de données. La bonne stratégie est elle de faire 3 formulaires ou d'adapter le code ci dessous pour modifier le "Scripting.Dictionary".

Code:
Private Sub Label1_Click()

End Sub

Private Sub Label2_Click()

End Sub

Private Sub UserForm_Initialize()
  Set MonDico = CreateObject("Scripting.Dictionary")
  For Each c In [choix1]
    If Not MonDico.Exists(c.Value) Then MonDico.Add c.Value, c.Value
  Next c
  Me.ComboBox1.List = MonDico.items
  If ActiveCell <> "" Then Me.ComboBox1.Value = ActiveCell.Value
  If ActiveCell.Offset(0, 1) <> "" Then Me.ComboBox2.Value = ActiveCell.Offset(0, 1).Value
  If ActiveCell.Offset(0, 2) <> "" Then Me.ComboBox3.Value = ActiveCell.Offset(0, 2).Value
  Me.Left = ActiveCell.Left
  Me.Top = ActiveCell.Top + 60
End Sub
Private Sub ComboBox1_Change()
  Set MonDico = CreateObject("Scripting.Dictionary")
  For Each c In [choix2]
   If c.Offset(0, -1) = Me.ComboBox1 Then
    If Not MonDico.Exists(c.Value) Then MonDico.Add c.Value, c.Value
   End If
  Next c
  Me.ComboBox2.List = MonDico.items
  On Error Resume Next
  Me.ComboBox2.ListIndex = 0
End Sub
Private Sub ComboBox2_Change()
   Set MonDico = CreateObject("Scripting.Dictionary")
   For Each c In [choix3]
    If c.Offset(0, -1) = Me.ComboBox2 And c.Offset(0, -2) = Me.ComboBox1 Then
      If Not MonDico.Exists(c.Value) Then MonDico.Add c.Value, c.Value
    End If
   Next c
   Me.ComboBox3.List = MonDico.items
   On Error Resume Next
   Me.ComboBox3.ListIndex = 0
End Sub
Private Sub B_ok_Click()
  ActiveCell = Me.ComboBox1
  ActiveCell.Offset(0, 1) = Me.ComboBox2
  ActiveCell.Offset(0, 2) = Me.ComboBox3
  Unload Me
End Sub

Voilà, j'en demande encore beaucoup mais quelques commentaires du code VBA ci-dessus m'aideraient grandement. Par exemple m'expliquer ce qu'est ce Private Sub Label1_Click() qui semble ne rien faire.

Merci encore,

Layoli1
 
C

Compte Supprimé 979

Guest
Re : [VBA] Liste déroulante conditionnelle complexe

Salut,

Comment ajouter une condition du type "la ligne doit être comprise dans le tableau xx" ou "le numéro de ligne doit être entre 10 et 30" ?
Code:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
  ' Vérifie si le double clique a été effectué
  ' dans une cellule de la plage C10:C30
  If Intersect(Target, Range("C10:C30")) Then
    UserForm1.Show
    Cancel = True
  End If
End Sub
Aussi il semble que cette fonction désactive le double clic classique sur l'ensemble du classeur. Est ce le cas ?
Nom, pas du tout, simplement dans la feuille ou est placé le code ...
De plus intercepte seulement le double clique dans la plage de cellule indiquée ;)

Les choix1, choix2, choix3 sont les noms donnés aux colonnes d'un unique tableau base de données. J'ai exactement la même problématique à la différence qu'elle est répétée 3 fois en ne faisant pas référence aux mêmes tableaux base de données. La bonne stratégie est elle de faire 3 formulaires ou d'adapter le code ci dessous pour modifier le "Scripting.Dictionary".
Pour Dictionnary, voir le fil de notre ami Hervé ;)
https://www.excel-downloads.com/threads/vba-mystere-sur-dictionary.72981/

Début d'explication du code
Code:
[COLOR=DarkGreen]' A l'initialisation du formulaire
' avant qu'il soit visible à l'écran[/COLOR]
Private Sub UserForm_Initialize()
[COLOR=DarkGreen]  ' Définir l'objet MonDico pour une nouvelle collection dictionnaire[/COLOR]
  Set MonDico = CreateObject("Scripting.Dictionary")
[COLOR=DarkGreen]  ' Pour chaque valeur contenu dans le nom "choix1"
  ' choix doit définir une plage de donnée
[/COLOR]  For Each c In [choix1]
[COLOR=DarkGreen]    ' Si la valeur n'existe pas dans mon dictionnaire, alors on l'ajoute à celui-ci
[/COLOR]    If Not MonDico.Exists(c.Value) Then MonDico.Add c.Value, c.Value
  Next c
[COLOR=DarkGreen]  ' Les valeurs du Combobo sont les données de mon dictionnaire
[/COLOR]  Me.ComboBox1.List = MonDico.items
[COLOR=DarkGreen]  ' Si la cellule active n'est pas vide, alors le choix de mon combobox1 est la valeur de la cellule
[/COLOR]  If ActiveCell <> "" Then Me.ComboBox1.Value = ActiveCell.Value
[COLOR=DarkGreen]  ' Si la cellule active de la colonne +1 n'est pas vide
  ' alors le choix de mon combobox2 est la valeur de cette cellule
[/COLOR]  If ActiveCell.Offset(0, 1) <> "" Then Me.ComboBox2.Value = ActiveCell.Offset(0, 1).Value
[COLOR=DarkGreen]  ' Si la cellule active de la colonne +2 n'est pas vide
  ' alors le choix de mon combobox3 est la valeur de cette cellule
[/COLOR]  If ActiveCell.Offset(0, 2) <> "" Then Me.ComboBox3.Value = ActiveCell.Offset(0, 2).Value
[COLOR=DarkGreen]  ' La position gauche de mon USF = la position gauche de la cellule active
[/COLOR]  Me.Left = ActiveCell.Left
[COLOR=DarkGreen]  ' La position haute de mon USF = la position haute de la cellule
[/COLOR]  Me.Top = ActiveCell.Top + 60
End Sub
A+
 

Discussions similaires

Statistiques des forums

Discussions
312 493
Messages
2 088 956
Membres
103 990
dernier inscrit
lamiadebz