Listbox fonction boutons d'option

Bonjour,

https://www.excel-pratique.com/fr/vba/controles.php

https://www.excel-pratique.com/file/fr/vba/userform3.xls

Bonsoir,

Je voudrais adapter l’exemple des liens ci-dessus à mes besoins mais je bloque.

Je souhaite alimenter une listbox en fonction de 2 groupes de boutons d’option (c-à-d en fonction du caption), dans chacune des frames il y a 2 boutons.

Avec une variante, en cliquant sur les boutons de la frame2, les captions des boutons de la frame1 changent.

En effet, à l’ouverture du formulaire le boutonDepense est actif, son caption est ‘’Depenses’’ et le boutonRecette son caption est ‘’Recettes’’ de la frame1. Pour la frame2, le boutonPrincipal est actif son caption est ‘’Principal’’ et le caption du boutonSecondaire est ‘’Secondaire’’.

Au clic sur le boutonSecondaire, le caption du boutonDepense devient alors ‘’Debit’’ et celui du boutonPrincipal devient ‘’Credit’’.

La listbox s’alimentera en fonction du caption du bouton actif de la frame1, ce caption se trouve en colonne A sur la feuille bd.

Mon gros souci est que je n’arrive pas à utiliser convenablement les 2 fonctions du fichier exemple trouvé sur le forum (lien ci-dessus). J’ai une erreur 91 qui m’empêche d’aller plus loin pour résoudre mon problème.

En espérant que mes explications sont claires. Je vous remercie par avance.

Bonjour et sur le forum,

Je crois que j'ai un peu compris tes explications, mais je ne comprends pas du tout à quoi servent les boutons Principal et Secondaire, dans ta base de données je ne vois que Recettes et Depense, et pas Debit ou Credit, je ne comprends donc pas pourquoi tu as besoin de ces caption, et surtout je ne comprends pas pourquoi tu as besoin de faire ça comme ça, ce ne serait pas plus simple de mettre 4 boutons: Recettes, Depenses, Debit et Credit? C'est pas bien clair pour le moment ton histoire

Bonjour,

Merci pour ta rapide réponse. Si tu jettes un coup d’œil à la fin de la feuille BD, il y a bien quelques lignes 'débit' et 'crédit'.

En fait, je gère un compte principal (achats, frais, etc) et pour ce compte je passe les différentes opérations en 'dépenses' et recettes'. J'ai d'autres comptes et il m'arrive d'effectuer des virements de compte à compte. C'est ce que j'ai appelé 'secondaire' et j'ai opté de passer ces opérations en 'débit' et 'crédit' pour me faciliter ensuite l'extraction des données de cette bd. D'où la modification des captions suivant le choix du compte 'principal' ou 'secondaire'. Voilà, le pourquoi de mon choix.

Merci pour ton intérêt à mon post.

Bonne journée.

Re,

Merci pour ces explications, par contre tu vas me trouver pénible, j'ai encore des questions, quel est le but de ton formulaire? Car pour le moment tu as expliqué qu'il avait des boutons, mais à quoi sert la liste? elle sert à afficher seulement les valeurs de Depenses par exemple?

Re,

Merci pour ton retour. Si je demande de l'aide je ne dois pas être grincheux même si tu penses être pénible.

Je comprends fort bien ton questionnement. J'ai avancé et suis parvenu à quelque chose mais sans réussir à utiliser les fonctions du fichier proposé sur le site.

J'ai monté ce fichier pour illustrer le problème sur mon véritable fichier. L'un des buts est d'alimenter la listbox (voir fichier joint).

Encore merci.

Re,

Je dois t'avouer que je n'ai pas regardé le site que tu as mis en lien...

Mais de ce que je vois, tu as juste filtré tes données, chose que tu peux déjà faire sans VBA, mais je ne comprends toujours pas ce que tu veux faire, filtrer tes données, les sommer suivants certains critères? ou quelque chose d'autre? la réponse se trouve sur un des liens que tu as mis dans ton premier message?

Le site en question est ce site Excel-Pratique.

Etant donné que tu n'as pas compris ma demande, laisse tomber.

J'espère que quelqu'un d'autre comprendra mon problème.

Au début de ton message, tu me dis que tu n'as pas ouvert le lien et à la fin tu me dis que la réponse est donné dans le lien.

Vraiment pas compris ta démarche. Si tu n'as pas compris mon problème c'est autre chose.

Je voudrais utiliser ces 2 fonctions

'Private Function Operation()
''La fonction renvoie comme valeur le texte du bouton choisi (Operation)
   For Each OperationActive In Frame1.Controls
      If OperationActive.Value Then
         Operation = OperationActive.Caption
      End If
   Next
End Function
'
Private Function Compte()
''La fonction renvoie comme valeur le texte du bouton choisi (Compte)
   For Each CompteActif In Frame2.Controls
      If CompteActif.Value Then
         Compte = CompteActif.Caption
      End If
   Next
End Function

au lieu de de ces 2 bouts de code de la procédure Private Sub initUser

For Each Ctrl In Frame1.Controls
      If Ctrl.Object.Value = True Then
         OperationActive = Ctrl.Object.Caption
'         Debug.Print OperationActive
         Exit For
      End If
   Next Ctrl

For Each Ctrl1 In Frame2.Controls
      If Ctrl1.Object.Value = True Then
         CompteActif = Ctrl1.Object.Caption
'         Debug.Print CompteActif
         Exit For
      End If
   Next Ctrl1

En espérant que c'est un peu plus clair.

Merci beaucoup.

Le site en question est ce site Excel-Pratique.

Etant donné que tu n'as pas compris ma demande, laisse tomber.

J'espère que quelqu'un d'autre comprendra mon problème.

Au début de ton message, tu me dis que tu n'as pas ouvert le lien et à la fin tu me dis que la réponse est donné dans le lien.

Vraiment pas compris ta démarche. Si tu n'as pas compris mon problème c'est autre chose.

Bonjour,

Quand tu postes un message sur le forum, tu t'engages à donner suite aux questionnements des membres qui essayent de t'aider, ça fait partie de la charte d'utilisation du forum (https://forum.excel-pratique.com/viewtopic.php?f=2&t=13), de plus tu ne semble pas lire attentivement mes messages, je n'ai pas dis que tu avais la réponse dans le lien que je n'ai pas ouvert, j'ai posé la question: "la réponse se trouve sur un des liens que tu as mis dans ton premier message?" Ce n'est pas une affirmation mais bien une interrogation.

Quand à ma démarche, je vois que tu es partis sur une solution VBA, mais ne comprenant pas pourquoi tu es arrivé à cette solution, je souhaite d'abord t'interroger dessus, sur pourquoi tu utilises une listbox pour juste filtrer, quelle utilisation tu veux en faire, pour bien m'assurer que la solution VBA est celle dont tu as besoin.

Maintenant si tu souhaites rester sur la solution que tu as décidé que tu allais suivre, il faut me le dire, j'arrêterai d'essayer de t'aider comme je le fais et je vais juste m'occuper de faire marcher le bout de code que tu veux utiliser...

Merci pour ton retour. J'ai très bien lu la charte dès mon inscription. Je suis un habitué des forums (oiseaux, informatique, ...).

Je t'avais dit que je serai pas grincheux étant donné que c'est moi qui sollicite de l'aide.

Je suis donc tenu à donner toutes les explications pour éclairer ceux (celles) qui ont l'amabilité de me répondre.

Comme je l'ai déjà signalé précédemment, j'ai monté ce fichier et le formulaire pour illustrer mon problème d'utilisation des 2 fonctions trouvées sur ce site.

Mon véritable formulaire contient beaucoup plus d'objets. J'ai réduit ces derniers pour poster un fichier simplifier.

Effectivement, les données affichées dans la ListBox sont filtrées.

Je voudrais juste parvenir à utiliser les 2 fonctions Private Function Operation et Private Function Compte.

Je souhaite apprendre à utiliser des fonctions pour la suite de mon projet.

Encore merci.

Re,

D'accord, donc c'est à des fins d'apprentissage, je ne vais donc pas essayer de savoir si tu peux faire la même chose avec juste des filtres ou un tableau croisé dynamique (oui c'est ça que j'essayais de savoir depuis le début )

Je vais me pencher sur l'utilisation de ces fonctions et te fais un retour quand j'arriverai à les faire marcher

Me revoilà,

J'ai relu la plupart de tes messages et donc je suis arrivé à faire ce que tu souhaitais je pense

Pour remplacer ce code:

For Each Ctrl In Frame1.Controls
      If Ctrl.Object.Value = True Then
         OperationActive = Ctrl.Object.Caption
'         Debug.Print OperationActive
         Exit For
      End If
   Next Ctrl

For Each Ctrl1 In Frame2.Controls
      If Ctrl1.Object.Value = True Then
         CompteActif = Ctrl1.Object.Caption
'         Debug.Print CompteActif
         Exit For
      End If
   Next Ctrl1

En utilisant les fonctions que tu as codé, il faut juste écrire:

OperationActive = Operation
CompteActif = Compte

et ça fera le même travail

EDIT:

Si tu as besoin d'explications n'hésite pas

Re, merci beaucoup de te pencher sur mon problème.

Cependant, je pense qu'il y a quiproquo sur la terminologie de filtre.

Les TCD ne sont pas mon trucs (à tord ou à raison, je ne les utilise presque jamais).

Ensuite, mon objectif n'est pas de filtrer la feuille bd. Mais d'alimenter la Listbox suivant le caption du bouton actif.

Encore merci. Bonne soirée.

à demain, je dois réviser ce soir.

Me revoilà,

J'ai relu la plupart de tes messages et donc je suis arrivé à faire ce que tu souhaitais je pense

Pour remplacer ce code:

For Each Ctrl In Frame1.Controls
      If Ctrl.Object.Value = True Then
         OperationActive = Ctrl.Object.Caption
'         Debug.Print OperationActive
         Exit For
      End If
   Next Ctrl

For Each Ctrl1 In Frame2.Controls
      If Ctrl1.Object.Value = True Then
         CompteActif = Ctrl1.Object.Caption
'         Debug.Print CompteActif
         Exit For
      End If
   Next Ctrl1

En utilisant les fonctions que tu as codé, il faut juste écrire:

OperationActive = Operation
CompteActif = Compte

et ça fera le même travail

EDIT:

Si tu as besoin d'explications n'hésite pas

Bonjour,

Merci beaucoup. En effet, ta proposition fonctionne bien (si variable variant pas object).

Cependant, je ne sais pas si tu as consulté le fichier du lien. Car dans celui-ci, les boutons sont déclarés en temps qu'objet.

En les déclarant de la même façon le code plante. Mais il fonctionne, s'ils sont déclarés en temps que variant.

Je conclue donc que j'ai fait une erreur en remodelant les fonctions à ma manière.

Vu ton expérience, n'aurais-tu pas décelé mon ou mes erreurs.

Bonne journée.

Bonjour,

J'ai ouvert le fichier du lien mais je ne vois pas une seule ligne de code dessus...

En revanche je pense pouvoir répondre à ta question:

Tu essayes de mettre dans une variable objet du texte, ce qui fait planter VBA car tu as une incompatibilité de type.

Si on regarde de plus près tes fonctions, on pourrait les écrire comme ceci:

Private Function Operation() as String
'La fonction renvoie comme valeur le texte du bouton choisi (Operation)
   For Each OperationActive In Frame1.Controls
      If OperationActive.Value Then
         Operation = OperationActive.Caption
      End If
   Next
End Function
'
Private Function Compte() as String
'La fonction renvoie comme valeur le texte du bouton choisi (Compte)
   For Each CompteActif In Frame2.Controls
      If CompteActif.Value Then
         Compte = CompteActif.Caption
      End If
   Next
End Function

Ici je précise qu'elles renvoient du texte, car c'est ce qu'elles font quand tu écris:

Operation = OperationActive.Caption
Compte = CompteActif.Caption

Si tu cherches les propriétés d'un OptionButton, Caption renvoie une variable de type String, une variable de type Variant accepte plein de valeurs, mais un variable de type objet ne voudra jamais de cette valeur, si tu avais voulu renvoyer un objet, il aurait fallu faire:

Set Operation = OperationActive
Set Compte = CompteActif

dans tes fonctions, ça aurait permis de renvoyer le contrôle

Re, 1000 mercis pour tes explications.

Je comprends mieux la problématique.

Par anticipation, je te souhaite un excellent week-end.

Re,

De rien!

Excellent week-end à toi aussi, merci d'avoir passé le sujet en résolu

Rechercher des sujets similaires à "listbox fonction boutons option"