Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Valeur ComboBox imbriquée qui ne s'affiche pas du UserForm au tableau

DelfD

XLDnaute Nouveau
Bonjour tout le monde et merci d'avance pour votre aide. Je n'ai pas trouvé de solution sur ce forum ni ailleurs.
Voici mon pb :
j'ai créé une base de données excel avec un Userform que l'on peut utiliser ou saisir direct ds le tableau.
Dans ma bdd, j'ai inséré des listes déroulantes imbriquées(avec validation des données=indirect.. pour Colonne K de l'onglet "SOCIOTYPE")
La liste DETAIL dépend de la liste TITRE
J'ai aussi donné des noms à mes plages de listes.
Et en saisie dans le tableau tout fonctionne .

Mais, lorsque j'utilise le formulaire de saisie, et que je valide, je n'arrive pas à ajouter la valeur de DETAIL dans la cellule correspondante de ma bdd (elle reste vide)
Voici la partie du code pour ajouter les valeurs du formulaire ds la bdd (j'ai raccourci et enlevé les lignes identiques) :

Sheets("SOCIO-TYPES").Select
Dim L As Integer
L = Sheets("SOCIO-TYPES").Range("A1500").End(xlUp).Row + 1
Range("J" & L).Value = ComboBoxTITRE.Value
Range("K" & L).Value = ComboBoxDETAIL.Value


Il faudrait que je mette une formule du style "si la valeur de la combobox TITRE="COULEUR" alors la valeur de DETAIL est égale à la liste "couleur" sachant que j'ai 6 titres possibles.
C'est peut être tout simple mais ça me prend la tête pour l'écrire en VBA !!
Avez-vous une idée? ou sinon une formule pour imbriquer les 2 comboBox dans le formulaire qui simplifierait la chose.
Merci pour vos réponses
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Pour les ComboBox liées il y a mon objet ComboBoxLiées qui s'occupe de tout.
Mais il s'appuye sur le contenu des colonnes de la base et non sur des tables annexes.
Voulez vous que j'équipe votre classeur de modules de services nécessaires ?
 

Dranreb

XLDnaute Barbatruc
Remarque: Plusieurs ComboBoxLiées peuvent être utilisés dans un UserForm s'ils s’appuient sur des tables différentes. La forme lui convenant le mieux pour le système des PROBLEMATIQUE serait un tableau à deux colonnes, la première répétant à chaque ligne la catégorie de problématique correspondant à chaque détail. Mais si vous tenez à garder votre système il serait possible d'en déduire la forme requise dans un tableau interne déterminé au début.
Dans l'hypothèse ou l'UserForm devrait permettre aussi la modification et la suppression, et quelles sont les colonnes formant la combinaison identificatrice de la ligne existante ?
Le nom seul me parait un peu léger vu qu'il est porté par plusieurs personnes d'une même famille …
 
Dernière édition:

DelfD

XLDnaute Nouveau
 

AtTheOne

XLDnaute Accro
Supporter XLD
Bonjour à toutes & à tous,
bonjour @DelfD, bonjour @Dranreb,

@Dranreb, je ne maitrise pas assez ta ressource pour la proposer
du coup j'y vais de ma solution un peu plus rustique ...

@DelfD, j'ai transformé tes listes en tableaux structurés, j'y ai laissé (comme tu l'avais fait) une valeur vide, ce qui à inconvénient (ou l'avantage ?) de permettre de rentrer n'importe quoi dans les cellules ayant ces listes comme validation de données ... A toi de voir
J'ai créé un module "mdl_Constantes dans lequel j'ai mis les N° de colonne de ton tableau BdD.
VB:
'Colonnes du tableau BDD
Public Const C_N° As Byte = 0
Public Const C_Nom As Byte = 1
Public Const C_Sexe As Byte = 2
Public Const C_SF As Byte = 3
Public Const C_AGE As Byte = 4
Public Const C_TITRE_PB As Byte = 5
Public Const C_DETAIL_PB As Byte = 6
J'ai simplifié "UserForm_Initialize"
VB:
Private Sub UserForm_Initialize()
        
          tb = Sh_BdD.[TableauBDD]
          With Me.ComboBoxNOM
               .List = tb
          End With
End Sub
J'ai ajouté "ComboBoxNOM_Change" et "ComboBoxTITREPB_Change"
VB:
Private Sub ComboBoxNOM_Change()
     'Lecture de l'état de la Combo
     With Me.ComboBoxNOM
          idxN = .ListIndex
          Nom = .Text
          liste = .List
     End With
  
     With Me
          If idxN = -1 Then
               'Cas d'une nouvelle valeur ou d'un effacement
               .OptionButtonHOMME = False
               .OptionButtonFEMME = False
               .ComboBoxSITFAM = ""
               .ComboBoxAGE = ""
               .ComboBoxTITREPB = ""
          Else
               'Cas d'une nouvelle sélection dans la liste
               Select Case liste(idxN, C_Sexe)
                    Case "Homme"
                        .OptionButtonHOMME = True
                    Case "Femme"
                         .OptionButtonFEMME = True
                    Case Else
                         'Pas de sexe défini
                         .OptionButtonHOMME = False
                         .OptionButtonFEMME = False
               End Select
               .ComboBoxSITFAM = liste(idxN, C_SF)
               .ComboBoxTITREPB = liste(idxN, C_TITRE_PB)
               .ComboBoxDETAILPB.RowSource = liste(idxN, C_TITRE_PB)
               .ComboBoxDETAILPB = liste(idxN, C_DETAIL_PB)
          End If
     End With
End Sub

VB:
Private Sub ComboBoxTITREPB_Change()
     With Me.ComboBoxNOM
          IdxT = .ListIndex
          Titre = .Text
          liste = .List
     End With
     With Me.ComboBoxDETAILPB
          .Text = ""
          .RowSource = Titre
     End With
End Sub
j'ai modifié CommandButtonAJOUTER_Click()
VB:
Private Sub CommandButtonAJOUTER_Click() 'commande du bouton ajouter
     Dim Rg As Range
     'message de confirmation
     If MsgBox("Confirmation l'ajout?", vbYesNo, "Demande de confirmation d'ajout") = vbYes Then
  
     'Mise à jour de la base de données
        
          ReDim tb(0 To 0, 0 To UBound(Me.ComboBoxNOM.List, 2)) 'tableau pour recevoir les valeur modifiées
          'Chargement du tableau
          tb(0, C_N°) = ""
          tb(0, C_Nom) = UCase(ComboBoxNOM.Value)
          If OptionButtonHOMME.Value Then tb(0, C_Sexe) = "Homme"
          If OptionButtonFEMME.Value Then tb(0, C_Sexe) = "Femme"
          tb(0, C_AGE) = ComboBoxAGE.Value
          tb(0, C_SF) = ComboBoxSITFAM.Value
          tb(0, C_TITRE_PB) = ComboBoxTITREPB.Value
          tb(0, C_DETAIL_PB) = ComboBoxDETAILPB.Value
          'Identification de la ligne à modifier
          With Sh_BdD.[TableauBDD]
               If WorksheetFunction.CountA(.Cells) = 0 Then
                    Set Rg = .Rows(1)                                               'Cas du tableau vide
               Else
                    Set Rg = .Rows(.Rows.Count).Offset(1)
               End If
          End With
          'Ecriture des données
          Rg.Value = tb
     End If
  
     'trier par ordre alphabétique
     Call Tri_Noms
     UserForm_Initialize

End Sub
Dans la "ComboBoxNOM" j'ai mis la totalité du tableau dans la liste en n'affichant que la colonne "Nom", (ColumnCount=7, BoundColumn=2,TextColumn=2,ColumnWidth="0 pt;235 pt;0 pt;0 pt;0 pt;0 pt;0 pt")
Je récupère grâce à ListiIndex rapidement les autres valeurs pour les autres contrôles.
 

Pièces jointes

  • Tableau PB.xlsm
    36.4 KB · Affichages: 4
Dernière édition:

Discussions similaires

Réponses
4
Affichages
398
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…