Combo dépendant d'optionbutton [Resolu par Robert]

cp4

XLDnaute Barbatruc
Bonjour,:)

Je fais appelle à vos compétences pour résoudre certains problèmes.

J’ai trouvé sur le forum une astuce pour ne pouvoir modifier les feuilles que via une userform (le password est : 'Secret'). C'est ce qui me conviens pour ne pas toucher aux cellules.

Des libellés sont répertoriés sur une feuille (Libellés), dans 2 colonnes (crédit et débit).

Je voudrais dans une combobox récupérer des libellés suivant le bouton d’option activé (OpCredit/OpDebit).

Ensuite, transférer les données sur la feuille ‘Base’ (le montant doit aller dans la bonne colonne).

En vous remerciant par avance.
 

Pièces jointes

  • Copie - MesComptes.xlsm
    28 KB · Affichages: 29

Robert

XLDnaute Barbatruc
Repose en paix
Bonjour CP4, bonjour le forum,

Je ne vois pas trop l'intérêt mais essaie comme ça (remplace ton code par celui-ci) :

VB:
Option Explicit
Private O As Worksheet 'décalre la variable O (Onglet)
Private TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Private I As Integer 'décalre la variable I (Incrément)

Private Sub UserForm_Initialize()
Set O = Worksheets("Base") 'définit l'onglet O
TV = O.Range("B8").CurrentRegion 'définit le tableau des valeur TV
Me.TxtSolde = O.Range("E4").Value
Me.TxtSolde.Text = Format(Me.TxtSolde.Text, "#,##0.00")
End Sub

Private Sub OpCredit_Click()
Dim D As Object 'déclare la variable D (Dictionnaire)

Me.ComboBox1.Clear 'vide la ComboBox1
Set D = CreateObject("Scripting.Dictionary") 'définit le dictionnaire D
If OpCredit = True Then 'si l'option [Crédit] est choisie
  For I = 2 To UBound(TV, 1) 'boucle sur toutes les lignes I du tableau des valeur TV
  'si la donnée ligne I colonne 3 de TV (=> Colonne D) ne'est pas vide,
  'alimente le dictionnaire D avec la donnée en colonne 2 de TV (=> Colonne C)
  If TV(I, 3) <> "" Then D(TV(I, 2)) = ""
  Next I 'prochaine ligne de la boucle
End If 'fin de la condition
If D.Count > 1 Then Me.ComboBox1.List = D.keys 'alimente la ComboBox1 avec la liste des éléments du dictionnaire D sans doublon
End Sub

Private Sub OpDebit_Click()
Dim D As Object 'déclare la variable D (Dictionnaire)

Me.ComboBox1.Clear 'vide la ComboBox1
Set D = CreateObject("Scripting.Dictionary") 'définit le dictionnaire D
If OpDebit = True Then 'si l'option [Débit] est choisie
  For I = 2 To UBound(TV, 1) 'boucle sur toutes les lignes I du tableau des valeur TV
  'si la donnée ligne I colonne 4 de TV (=> Colonne E) ne'est pas vide,
  'alimente le dictionnaire D avec la donnée en colonne 2 de TV (=> Colonne C)
  If TV(I, 4) <> "" Then D(TV(I, 2)) = ""
  Next I 'prochaine ligne de la boucle
End If 'fin de la condition
If D.Count > 1 Then Me.ComboBox1.List = D.keys 'alimente la ComboBox1 avec la liste des éléments du dictionnaire D sans doublon
End Sub

Private Sub CmdCancel_Click()
Unload Me
End Sub
 

Robert

XLDnaute Barbatruc
Repose en paix
Re,

J'avais oublié la fin !... Rajoute le code de validation :

VB:
Private Sub CmdValider_Click() 'bouton "Valider"
Dim LI As Integer 'déclare la variable LI (LIgne)
Dim COL As Byte 'décarae la variable COL (COLonne)

'Il te faudra rajouter les conditions si les TextBoxes et la ComboBox1 ne sont pas remplies !...

If Me.OpCredit = False And Me.OpDebit = False Then 'condition : si aucune case n'est cochée
  MsgBox "Vous devez choisir l'option Crédit ou Débit !" 'message
  Exit Sub 'sort de la procédure
End If 'fin de la condition

LI = IIf(O.Range("B9") = "", 9, O.Range("B8").End(xlDown).Row + 1) 'définit la ligne LI (première ligne vide du tabelau)
O.Cells(LI, 2).Value = CDate(cas1.Value) 'renvoie la date
O.Cells(LI, 3).Value = Me.ComboBox1.Value 'renvoie le libellé
COL = IIf(Me.OpDebit.Value = True, 4, 5) 'définit la colonne COL
O.Cells(LI, COL).Value = Me.TextBox2.Value 'renvoie le montant
Unload Me 'vide et ferme l'userform en cours
End Sub
 

cp4

XLDnaute Barbatruc
Je ne vois pas trop l'intérêt mais essaie comme ça (remplace ton code par celui-ci) :

Merci pour ton retour. Le code plante, message d'erreur "L'indice n'appartient pas à la selection" la ligne userform1.show est en jaune.

Il me semble que je me suis mal exprimer. L'idée est ne pouvoir sélectionner dans la combobox que les libellés crédit ou débit suivant le bouton activé. J'ai délibérément réduit les libellés, en réalité il y en a beaucoup plus.

Si tu as une autre idée, je suis preneur.

Je suis sur cette voie mais plante ou combobox est vide
VB:
Private Sub OpDebit_Click()
Dim dl As Long, plage As Range

With Feuil2
        dl = .Cells(.Rows.Count, 2).End(xlUp).Row
        Set plage = .Range("B2:B" & dl)
End With
''ComboBox1.RowSource = plage.Address '*ne plante pas mais combo est vide
'ComboBox1.RowSource = plage '* erreur13, incompatibilité de type

Set plage = Nothing
End Sub


Merci et bon dimanche.
 

cp4

XLDnaute Barbatruc
Rebonjour Robert,

Effectivement, avec ton fichier aucun bug. Pas compris pourquoi vu mon niveau.
Cependant, ne fonctionne pas correctement.

Au choix crédit c'est les libellés débits qui s'affichent dans la combobox.
et au choix debit la combobox est vide.

Je me plonge dans ton code pour essayer de comprendre.

Merci beaucoup pour ton aide.:)
 

cp4

XLDnaute Barbatruc
Re,;)

Avec les commentaires que tu as mis (merci), ça a été plus facile à comprendre.

En fait, ce n'est exactement ça. La source qui alimente la combobox est le tableau qui se trouve sur la feuille "libellés". Alors que ton code alimente la combobox à partir des libellés existants sur la feuille "base".

Si je rajoute des libellés sur la feuille "libellés", ils n'apparaitront jamais dans la combobox.

Je comprends pourquoi la combo est vide pour les crédits. Il n'y a aucun libellé credit sur la feuille "base".

Encore merci.
 

cp4

XLDnaute Barbatruc
Avec un petit réaménagement de la feuille "libellés". Je suis parvenu à mes fins.

Sauf que l'userform met un retard pour s'afficher. Auriez-vous une idée pour y remédier?

Merci beaucoup.
 

Pièces jointes

  • Copie - MesComptes.xlsm
    34.5 KB · Affichages: 31

Robert

XLDnaute Barbatruc
Repose en paix
Re,

Oui en effet je n'avais pas compris ça et tu as rectifié mon erreur. Par ma part je n'utilise jamais RowSource car je le trouve peu fiable... En revanche, aucune lenteur significative au lancement de l'UserForm1 chez moi.
 

cp4

XLDnaute Barbatruc
Merci pour ton aide Robert.

En fait, je n'ai pas beaucoup d'expérience surtout en userform.
Je me suis inspiré de certains codes trouvés sur le forum ou le net (je ne me souviens plus).

J'ai utilisé RowSource et tu me dis qu'il est peu fiable.
Pourrais-tu me dire qu'est-ce qui est plus fiable? Merci.

ps: pour l'affichage malgré le retard chez-moi, ça n'influe pas sur le fonctionnement.
 

Robert

XLDnaute Barbatruc
Repose en paix
Re,

C'est pas qu'il et peu fiable mais dans certains cas, et je ne me souviens plus lesquels, il fonctionne mal. Je préfère, adapté a ton cas :

VB:
ComboBox1.List = Range("Tableau2").Value
ou, quand il n'y a pas de tableau :
VB:
ComboBox1.List = Range("A2:A" & Cells(Application.Rows.Count, "A").End(xlUp).Row).Value
 

Statistiques des forums

Discussions
312 294
Messages
2 086 894
Membres
103 404
dernier inscrit
sultan87