IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

problème divers et combobox conditionnelle


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Dessinateur
    Inscrit en
    Février 2020
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Dessinateur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Février 2020
    Messages : 16
    Par défaut problème divers et combobox conditionnelle
    Bonjour à tous,

    Tout d'abord je viens de découvrir le langage "Vba" il y a deux semaines environ.

    J'ai fait des recherches sur le net pour essayer de comprendre le langage et j'ai eu la chance de trouver ce forum ainsi que le document "DVSaisieIntuitiveComboBox" de http://boisgontierjacques.free.fr qui m'a vraiment aidé à un mettre les mains dans le cambouis...

    - Le fichier d'origine n'avait qu'une seule combobox.

    - je me suis basé sur les réglages de ce fichier et je les ai dupliqué deux fois pour paramétrer les deux autres combobox.

    - J'ai rajouté et modifié certaines variables, ainsi que les plages de saisie propre à chaque combobox, et les liens vers les listes de données à faire apparaître dans le menu déroulant ce ces dernières.

    plusieurs questions que je n'ai pas pu résoudre malgré mes recherches:

    - mes combobox n'acceptent pas les données 10,11,12,ect... même si elles sont les l'onglet le menu déroulant... elle ne les prennent pas en compte.
    ( peut être que c'est une histoire de choix de type de données, mais je ne vois pas comment changer cela)

    - Si l'utilisateur veut saisir une valeur n'étant pas dans la base de donnée, cette dernière n'est pas prise en compte, la combobox reste vide...

    - Je n'arrive pas à ce que la touche entrée ou Tab renvoie vers la cellule de droite, lors de la validation d'une combobox...
    (J'ai pourtant essayé de régler la direction du mouvement dans le propriétés Excel.)

    Et le gros morceau :

    J'aimerais si cela est possible , que la liste de la combobox "Chant" varie en fonction d'une ou plusieurs Checkbox...

    Par exemple,

    Chekbox 1 seule coché --- liste 1
    Chekbox 2 seule coché---liste 2
    Chekbox 1 et 2 coché en même temps -------> liste 1 + 2

    J'ai essayé un code, mais cela ne fonctionne pas...

    Le message d'erreur est " erreur de compilation Erreur de Syntaxe"

    Si il existait des exemples simples que je pourrais essayer de comprendre pour les modifié et appliqué par le suite comme je l'ai fait pour les combobox simples cela m'aiderai beaucoup...

    Vous remerciant d'avance pour votre aide afin de m'aider à comprendre...

    Damien.
    Fichiers attachés Fichiers attachés

  2. #2
    Membre extrêmement actif
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    1 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 1 369
    Par défaut
    Bonsoir,

    Je n'ai pas bien compris.
    Je te propose de commencer par un combobox intuitif pour les produits.
    Nous verrons ensuite pour un second combobox intuitif.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    Option Compare Text
    Dim a()
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
      Set zSaisie = Range("A10:A30")
      If Not Intersect(zSaisie, Target) Is Nothing And Target.Count = 1 Then
        a = Application.Transpose([produits])
        Me.ComboBox1.List = a
        Me.ComboBox1.Height = Target.Height + 3
        Me.ComboBox1.Width = Target.Width
        Me.ComboBox1.Top = Target.Top
        Me.ComboBox1.Left = Target.Left
        Me.ComboBox1 = Target
        Me.ComboBox1.Visible = True
        Me.ComboBox1.Activate
      Else
        Me.ComboBox1.Visible = False
      End If
    End Sub
     
    Private Sub ComboBox1_Change()
      If Me.ComboBox1 <> "" Then
        Set d1 = CreateObject("Scripting.Dictionary")
        tmp = UCase(Me.ComboBox1) & "*"
        For Each c In a
          If UCase(c) Like tmp Then d1(c) = ""
        Next c
        Me.ComboBox1.List = d1.keys
        Me.ComboBox1.DropDown
      End If
      ActiveCell.Value = Me.ComboBox1
    End Sub
     
    Private Sub ComboBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
      ComboBox1.List = Application.Transpose([produits])
      Me.ComboBox1.DropDown
    End Sub
     
    Private Sub ComboBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
      If KeyCode = 13 Then
        If IsError(Application.Match(ActiveCell, a, 0)) Then ActiveCell = Mémo
        ActiveCell.Offset(1).Select
      End If
    End Sub
    Boisgontier
    Fichiers attachés Fichiers attachés

  3. #3
    Membre averti
    Homme Profil pro
    Dessinateur
    Inscrit en
    Février 2020
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Dessinateur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Février 2020
    Messages : 16
    Par défaut
    Bonjour,

    Tout d'abord merci pour la rapidité de la réponse et pour le temps consacré.

    J'ai regardé le fichier que vous m'avez joint et le code ressemble beaucoup à celui sur lequel je m'étais basé.

    Je viens de modifier le programme en :

    - insérant l'objet Combobox2 dans ma feuille.
    - Créer un tableau pour les données "Pieces" sur le même principe que les données "produits"
    - Insérer les lignes de codes pour la combobox2.
    - Modifier la valeur de ActiveCell.Offset en ActiveCell.Offset(0, 1).Select, qui me permet de me déplacer sur la cellule de droite en validant avec "ENTER"

    Cela semble fonctionner à part quelques détails :

    - Je ne peux pas descendre dans le menu déroulant avec la touche bas pour sélectionner une ligne ( ce qui fonctionnait sur le fichier DVSaisieIntuitiveComboBox ) //RESOLU VOIR PLUS BAS//
    - Les données sous forme de nombres ne sont pas pris en compte, même si elles figurent dans la base de données de la liste
    - Si je saisie une donnée hors base de données de laliste, elle n'est pas prise en compte.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    Option Compare Text
    Dim a()
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
      Set zSaisie = Range("A10:A30")
      If Not Intersect(zSaisie, Target) Is Nothing And Target.Count = 1 Then
        a = Application.Transpose([produits])
        Me.ComboBox1.List = a
        Me.ComboBox1.Height = Target.Height + 3
        Me.ComboBox1.Width = Target.Width
        Me.ComboBox1.Top = Target.Top
        Me.ComboBox1.Left = Target.Left
        Me.ComboBox1 = Target
        Me.ComboBox1.Visible = True
        Me.ComboBox1.Activate
      Else
        Me.ComboBox1.Visible = False
      End If
     
      Set z2Saisie = Range("B10:B30")
      If Not Intersect(z2Saisie, Target) Is Nothing And Target.Count = 1 Then
        a = Application.Transpose([Pieces])
        Me.ComboBox2.List = a
        Me.ComboBox2.Height = Target.Height + 3
        Me.ComboBox2.Width = Target.Width
        Me.ComboBox2.Top = Target.Top
        Me.ComboBox2.Left = Target.Left
        Me.ComboBox2 = Target
        Me.ComboBox2.Visible = True
        Me.ComboBox2.Activate
      Else
        Me.ComboBox2.Visible = False
      End If
     
    End Sub
    Private Sub ComboBox1_Change()
      If Me.ComboBox1 <> "" Then
        Set d1 = CreateObject("Scripting.Dictionary")
        tmp = UCase(Me.ComboBox1) & "*"
        For Each c In a
          If UCase(c) Like tmp Then d1(c) = ""
        Next c
        Me.ComboBox1.List = d1.keys
        Me.ComboBox1.DropDown
      End If
      ActiveCell.Value = Me.ComboBox1
    End Sub
    Private Sub ComboBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
      ComboBox1.List = Application.Transpose([produits])
      Me.ComboBox1.DropDown
    End Sub
    Private Sub ComboBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
      If KeyCode = 13 Then
        If IsError(Application.Match(ActiveCell, a, 0)) Then ActiveCell = Mémo
        ActiveCell.Offset(0, 1).Select
      End If
    End Sub
    Private Sub ComboBox2_Change()
      If Me.ComboBox2 <> "" Then
        Set d1 = CreateObject("Scripting.Dictionary")
        tmp = UCase(Me.ComboBox2) & "*"
        For Each c In a
          If UCase(c) Like tmp Then d1(c) = ""
        Next c
        Me.ComboBox2.List = d1.keys
        Me.ComboBox2.DropDown
      End If
      ActiveCell.Value = Me.ComboBox2
    End Sub
    Private Sub ComboBox2_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
      ComboBox2.List = Application.Transpose([Pieces])
      Me.ComboBox2.DropDown
    End Sub
    Private Sub ComboBox2_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
      If KeyCode = 13 Then
        If IsError(Application.Match(ActiveCell, a, 0)) Then ActiveCell = Mémo
        ActiveCell.Offset(0, 1).Select
      End If
    End Sub
    Cordialement.
    Fichiers attachés Fichiers attachés

  4. #4
    Membre averti
    Homme Profil pro
    Dessinateur
    Inscrit en
    Février 2020
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Dessinateur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Février 2020
    Messages : 16
    Par défaut
    A force de comparer les codes et en faisant des essaies, j'ai réussi à faire fonctionner la touche bas pour descendre dans le menu déroulant.

    J'ai rajouté le le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       And IsError(Application.Match(Me.ComboBox1, a, 0))
    Ce qui donne pour la Combobox1 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Private Sub ComboBox1_Change()
      If Me.ComboBox1 <> "" And IsError(Application.Match(Me.ComboBox1, a, 0)) Then ' rajout de And IsError(Application.Match(Me.ComboBox1, a, 0)) pour le defilement avec touche bas
        Set d1 = CreateObject("Scripting.Dictionary")
        tmp = UCase(Me.ComboBox1) & "*"
        For Each c In a
          If UCase(c) Like tmp Then d1(c) = ""
        Next c
        Me.ComboBox1.List = d1.keys
        Me.ComboBox1.DropDown
      End If
      ActiveCell.Value = Me.ComboBox1
    End Sub

    Mais je ne comprend pas le code... c'est vraiment du hasard et de la déduction.

  5. #5
    Membre extrêmement actif
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    1 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 1 369
    Par défaut
    Bonjour,

    - Les données sous forme de nombres ne sont pas pris en compte, même si elles figurent dans la base de données de la liste
    - Si je saisie une donnée hors base de données de laliste, elle n'est pas prise en compte.


    C'est quoi Liste1 et Liste2?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    Option Compare Text
    Dim a()
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
      Set zSaisie = Range("A10:A30")
      If Not Intersect(zSaisie, Target) Is Nothing And Target.Count = 1 Then
        a = Application.Transpose([produits])
        Me.ComboBox1.List = a
        Me.ComboBox1.Height = Target.Height + 3
        Me.ComboBox1.Width = Target.Width
        Me.ComboBox1.Top = Target.Top
        Me.ComboBox1.Left = Target.Left
        Me.ComboBox1 = Target
        Me.ComboBox1.Visible = True
        Me.ComboBox1.Activate
      Else
        Me.ComboBox1.Visible = False
      End If
     
      Set z2Saisie = Range("B10:B30")
      If Not Intersect(z2Saisie, Target) Is Nothing And Target.Count = 1 Then
        a = Application.Transpose([Pieces])
        Me.ComboBox2.List = a
        Me.ComboBox2.Height = Target.Height + 3
        Me.ComboBox2.Width = Target.Width
        Me.ComboBox2.Top = Target.Top
        Me.ComboBox2.Left = Target.Left
        Me.ComboBox2 = Target
        Me.ComboBox2.Visible = True
        Me.ComboBox2.Activate
      Else
        Me.ComboBox2.Visible = False
      End If
     
    End Sub
    Private Sub ComboBox1_Change()
      If Me.ComboBox1 <> "" And IsError(Application.Match(Me.ComboBox1, a, 0)) Then
        Set d1 = CreateObject("Scripting.Dictionary")
        tmp = UCase(Me.ComboBox1) & "*"
        For Each c In a
          If UCase(c) Like tmp Then d1(c) = ""
        Next c
        Me.ComboBox1.List = d1.keys
        Me.ComboBox1.DropDown
      End If
      ActiveCell.Value = Me.ComboBox1
    End Sub
    Private Sub ComboBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
      ComboBox1.List = Application.Transpose([produits])
      Me.ComboBox1.DropDown
    End Sub
    Private Sub ComboBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
      If KeyCode = 13 Then
     '   If IsError(Application.Match(ActiveCell, a, 0)) Then ActiveCell = Mémo
        ActiveCell.Offset(0, 1).Select
      End If
    End Sub
    Private Sub ComboBox2_Change()
      If Me.ComboBox2 <> "" And IsError(Application.Match(Me.ComboBox2, a, 0)) Then
        Set d1 = CreateObject("Scripting.Dictionary")
        tmp = UCase(Me.ComboBox2) & "*"
        For Each c In a
          If UCase(c) Like tmp Then d1(c) = ""
        Next c
        Me.ComboBox2.List = d1.keys
        Me.ComboBox2.DropDown
      End If
      ActiveCell.Value = Me.ComboBox2
    End Sub
    Private Sub ComboBox2_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
      ComboBox2.List = Application.Transpose([Pieces])
      Me.ComboBox2.DropDown
    End Sub
    Private Sub ComboBox2_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
      If KeyCode = 13 Then
       ' If IsError(Application.Match(ActiveCell, a, 0)) Then ActiveCell = Mémo
        ActiveCell.Offset(0, 1).Select
      End If
    End Sub
    Boisgontier
    Fichiers attachés Fichiers attachés

  6. #6
    Membre averti
    Homme Profil pro
    Dessinateur
    Inscrit en
    Février 2020
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Dessinateur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Février 2020
    Messages : 16
    Par défaut
    Bonjour,

    merci pour les infos.

    Il est effectivement question des listes "Produits" et "Pièces" dans la feuille "DATA".

    Je regarde si tout semble ok, mais pourriez-vous m'expliquez rapidement à quoi sert cette syntaxe , car je ne comprend pas pourquoi :

    - d'une part en la rajoutant dans Private Sub ComboBox1_Change() j'ai résolu mon problème avec la touche bas pour descendre dans le menu déroulant.
    - d'autre part en la supprimant de Private Sub ComboBox2_KeyDown cela a permis saisir des données qui ne sont pas dans mes listes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If IsError(Application.Match(ActiveCell, a, 0)) Then ActiveCell = Mémo

  7. #7
    Membre averti
    Homme Profil pro
    Dessinateur
    Inscrit en
    Février 2020
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Dessinateur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Février 2020
    Messages : 16
    Par défaut
    Bonjour,

    Effectivement il était bien question des listes "Produits" et "Pièces".


    Serait-il possible de m'expliquer rapidement à quoi sert les ligne suivantes car je ne comprend vraiment pas :

    La ligne rajoutée ci dessous qui a réactivé le défilement de la combobox avec la touche bas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Me.ComboBox1 <> "" And IsError(Application.Match(Me.ComboBox1, a, 0))

    La ligne supprimée ci dessous qui permet d'autoriser les saisies hors base de données :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     Private Sub ComboBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
      If KeyCode = 13 Then
     '   If IsError(Application.Match(ActiveCell, a, 0)) Then ActiveCell = Mémo
        ActiveCell.Offset(0, 1).Select
      End If
    End Sub

    Merci d'avance.

Discussions similaires

  1. [javamail]Problèmes divers...
    Par Baptiste Wicht dans le forum API standards et tierces
    Réponses: 22
    Dernier message: 14/12/2006, 14h00
  2. [JTable] problèmes divers
    Par Tentative dans le forum Composants
    Réponses: 6
    Dernier message: 05/12/2005, 19h00
  3. Réponses: 1
    Dernier message: 08/03/2005, 15h19
  4. [Info] Insert/Update si problèmes divers
    Par portu dans le forum Bases de données
    Réponses: 4
    Dernier message: 15/07/2004, 10h17
  5. [VB.NET] Problème sur composant comboBox hérité
    Par SergeF dans le forum Windows Forms
    Réponses: 3
    Dernier message: 08/06/2004, 14h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo