Code vba signifiant qu'un userform est ouvert.

13GIBE59

XLDnaute Accro
Bonjour les p’tits loups,

Vous vous souvenez peut-être de mon fichier « Comptes », disponible ici. Je l’ai modifié en ajoutant une colonne après la colonne « Date », intitulée « Date d’encaissement ». J’ai modifié tous les codes, et tout fonctionne à peu près à 95 % (quelques retouches à apporter).


L’objet de ma demande est celui-ci : lorsqu’on ouvre le userform « Filtre » (bouton du même nom), celui-ci contient une listview alimentée par une partie des lignes du fichier, et par des images correspondant aux infos de la colonne J (coche ou non coche).

Ce UserFormfiltre est non modal, on peut donc impacter la feuille quand il est ouvert. Je souhaite pouvoir agir sur la colonne J (cocher ou décocher une cellule) et récupérer ces informations sur la listview sans fermer et rouvrir le userformfiltre.


Je cherche donc un code du genre à insérer dans la feuille « Comptes » :


Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Column = 10 And Target.Count = 1 And Target.Row > 8 Then
If UserFormFiltre est ouvert
Réinitialiser/recalculer/reremplir le UserFormFiltre
End If
End If
End Sub


Vous savez faire ça ?
Merci d'avance.

JB

PS : dans le fichier joint, j'ai dû supprimer quelques onglets pour cause de poids, mais la macro "Filtre" fonctionne.
 

Pièces jointes

  • Essai comptes allégé.zip
    663.6 KB · Affichages: 77

Dranreb

XLDnaute Barbatruc
Re : Code vba signifiant qu'un userform est ouvert.

Bonjour.

Il n'y a pas de moyen commode de savoir s'il est chargé, à moins de l'utiliser en tant que type de donnée, car toute référence à l'UserForm en tant qu'exemplaire par défaut provoque son chargement et donc l'exécution, s'il ne l'était pas, de la UserForm_Initialize. En revanche on peut savoir s'il est affiché en testant sa propriété Visible.
Une piste à creuser: une Dim WithEvents F As Worksheet globale dans l'UserForm.
Après vérification, ça permet effectivement d'y installer une Private Sub F_SelectionChange(ByVal Target As Range)
Comme ça plus de problème, c'est lui qui sait qu'il est là puisqu'il prend lui même en charge l'évènement !
(Faire naturellement Set F = LExpressionWorksheet dans l'UserForm_Initialize)
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : Code vba signifiant qu'un userform est ouvert.

C'est sans doute seulement le début de mes explications, j'espère, qui vous a paru mystérieux. Normal: c'est très peu utilisé.
Il faut savoir que le nom d'un UserForm ne représente pas seulement à lui seul un seul exemplaire possible de lui même. C'est aussi un type de donnée objet. Vous pouvez le faire précéder de As dans une déclaration, et de = New dans un Set pour l'initialiser. Dans cette optique il est facile de savoir si une telle variable exemplaire de l'UserForm est chargée, expression: Not … Is Nothing.
 

job75

XLDnaute Barbatruc
Re : Code vba signifiant qu'un userform est ouvert.

Bonjour 13GIBE59, Bernard,

Pas compris ce que nous dit Bernard car il est bien simple de tester :

Code:
Sub test()
MsgBox USFOuvert("UserFormFiltre")
End Sub

Function USFOuvert(nom$) As Boolean
Dim u As Object
For Each u In UserForms
  If u.Name = nom Then USFOuvert = True
Next
End Function
A+
 

Modeste

XLDnaute Barbatruc
Re : Code vba signifiant qu'un userform est ouvert.

Bonjour Jean-Bernard, Dranreb,

Je vais peut-être dire une ânerie, mais ne peut-on pas utiliser une variable (booléenne) qu'on "bascule" d'un état à l'autre lors du 'show' et du 'unload'?

Salut Job
 

Dranreb

XLDnaute Barbatruc
Re : Code vba signifiant qu'un userform est ouvert.

En tout cas le plus simple dans ce cas de figure c'est de prendre en charge l'évènement dans l'Userform lui même.
C'est aussi le plus orthodoxe, puisque cet évènement doit justement entrainer des changement dans celui ci, et que c'est à lui et non à un code extérieur de les effectuer. Apprenez à vos objets à se débrouiller tout seuls dans leur coin, sans intervention extérieure.
Note: Dans un test que j'ai effectué, il est exécuté avant une Worksheet_SelectionChange du module de la feuille.
 
Dernière édition:

Paf

XLDnaute Barbatruc
Re : Code vba signifiant qu'un userform est ouvert.

Bonjour 13GIBE59, Dranreb, job75, Modeste

une suggestion basée sur l'idée de Modeste

Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
 If Target.Column = 10 And Target.Count = 1 And Target.Row > 8 Then
    If FlagUSF = True Then
        If UserForm1.Visible = True Then UserForm1.Hide 'sinon UserForm_Activate() ne sera pas déclenché
        UserForm1.Show 0 'déclenche Sub UserForm_Activate() si l'USF est non visible
    End If
 End If
End Sub

Tout le code de mise à jour doit se trouver dans UserForm_Activate
Un défaut : on décèle l'affichage-désafichage à l'écran

une autre solution : intégrer le code de mise à jour dans Worksheet_SelectionChange

A+
 

13GIBE59

XLDnaute Accro
Re : Code vba signifiant qu'un userform est ouvert.

Bonjour Job, bonjour Paf,

Paf, tu as quasiment mis dans le mille, et je t'en remercie.
Ta procédure marche impec, j'ai dû juste enlever "If FlagUSF = true then" (et le End If, bien sûr).

A ce propos, l'aide F1 de vba est muette sur FlagUSF (ou Flag, tout simplement) : c'est quoi cette bête ?

A plus.

JB
 

Dranreb

XLDnaute Barbatruc
Re : Code vba signifiant qu'un userform est ouvert.

Évitez de comparer des Boolean à True, c'est inutile, voire absurde.
If FlagUSF Then suffit, inutile de mettre If FlagUSF = True = True = True = True = True = True Then !
Et mettez juste Not devant au lieu de les comparer à False.
 
Dernière édition:

Paf

XLDnaute Barbatruc
Re : Code vba signifiant qu'un userform est ouvert.

Re

@ 13GIBE59:

suivant l'idée de Modeste:
mais ne peut-on pas utiliser une variable (booléenne) qu'on "bascule" d'un état à l'autre lors du 'show' et du 'unload'?
FlagUSF est une variable booléenne, à initialiser à True dans Private Sub UserForm_Initialize() et à False dans Private Sub UserForm_QueryClose

Puisque le sujet de la discussion est Code vba signifiant qu'un userform est ouvert. , If FlagUSF = True Then heu.. plutôt If FlagUSF Then ( merci Dranreb) permet de savoir si l'USF est ouvert .

A+
 

job75

XLDnaute Barbatruc
Re : Code vba signifiant qu'un userform est ouvert.

Re,

Mon post #5 ayant été superbement ignoré j'en remets une couche avec ma collection "UserForms" :

Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim u As Object
If Target.Column = 10 And Target.Count = 1 And Target.Row > 8 Then
  For Each u In UserForms
    If u.Name = "UserFormFiltre" Then
      UserFormFiltre.Hide
      UserFormFiltre.Show 0
      Exit For
    End If
  Next
End If
End Sub
A+
 

Discussions similaires

Réponses
8
Affichages
667
Réponses
6
Affichages
1 K

Statistiques des forums

Discussions
312 337
Messages
2 087 392
Membres
103 536
dernier inscrit
komivi