Comment fermer une forme lorsqu'on clique en dehors

Bonjour,

Afin d'émuler un dropdown à plusieurs colonnes et avec entête, j'ai une forme (modale) qui apparait lorsque je clique sur un bouton placé à côté d'un Editbox. Cette forme contient justement une ListView qui me permet d'afficher plusieurs colonnes, sur la largeur que l'utilisateur choisit. Voir images:

im1 im2

Cette forme disparait lorsque l'utilisateur double-clique sur une ligne, ou lorsqu'il appuye sur ESC.

Cependant j'aimerais, à l'instar des dropdowns, que lorsque l'utilisateur clique en dehors de cette forme, la forme disparaisse.

Malheureusement l'EVENT LostFocus n'existe pas dans Excel-VBA (alors que je crois qu'il existe dans Access-VBA).

Quelqu'un saurait comment faire disparaitre cette forme, lorsque l'utilisateur clique en dehors de la forme?

Merci!

Bonjour stefano

Il existe l'évènement "Exit" dans une ListView

image

A+

Bonjour BrunoM45 et merci beaucoup pour votre suggestion, mais comme la forme qui contient le ListView est affiché en mode "modal", j'imagine que l'event Exit n'est même pas déclenché, lorsqu'on clique en dehors de cette forme (ou de ce Listview, car leur emprise sur l'écran se confondent)...

Il me semble qu'il faut recourir à l'API de Windows. Quelqu'un connait ce domaine?

Je ne joins pas la macro car elle tourne avec une base Access et il faut créer un compte utilisateur qui est propre à votre installation d'Excel. Je pensais que c'est trop laborieux, mais si vous avez le temps de regarder, je vous l'envoie volontier en message privé.

Bonjour Stefano

Avant d'imaginer quoique ce soit essayez donc et partager nous votre fichier que l'on puisse essayer

Windows n'a pas une API mais "des", et il est vrai qu'on peut toujours sortir un canon de 50 pour essayer de tuer une mouche

je suppose qu'on peut utiliser un "SelectionChange" ou un autre event

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
     UserForm1.Show 0     'modal
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
     On Error Resume Next
     Unload UserForm1
     On Error GoTo 0
End Sub

BONJOUR BsALV...
Tu ne connais toujours pas les formules de politesses

De plus tu es hors sujet, on parle d'USF

bonjour BrunoM45, Stefano, le fil,

Apparament nous ne couchons pas ensemble, mais j'attends la réaction de Stefano.gatto pour savoir si j'étais hors sujet.

Bonjour Stefano.gatto, Le Fil,

Dans le cas d'un formulaire modal il est prioritaire. Donc on ne peut pas cliquer ni sur un autre formulaire, ni sur une feuille.

Par contre il est toujours possible d'utiliser le geste et ensuite le clic sera utilisable.

Voir le fichier vite fait ci-dessous et ses notes en rouge.

On pourrait aussi sortir par le haut de la forme mais cela demande un peu plus de code.

Merci BsAlv, mais j'ai déjà essayé Worksheet_SelectionChange. Cet EVENT ne peut pas se déclencher non plus, car tout est bloqué vu que ma forme est modale. Donc tous les events d'autres formes (Excel y compris) sont bloqués.

Au fait, je ne demande rien d'autre que la même fonctionalité d'un drop down: lorsqu'il est déployé il se ferme lorsqu'on clique en dehors. Or comme les utilisateurs sont habitués à ce comportement, ils me demandent souvent pourquoi ça ne marche pas de la même manière que les autres dropdowns, et ils ont raison!

Je pense que le drop down de Windows utilise une primitive Windows qui retourne la coordonnée du click et ferme le dropdown si c'est en dehors. Sinon je ne vois pas comment ça marcherait...

Merci XCellus, je vais essayer ta solution demain ou après demain suivant le temps que j'aurai!

BrunoM45 - je t'envoie ma macro avec la DB dès que possible

bonjour, si le USF est modeless au lieu de modal ?

Voici la macro avec sa DB.

1ere chose il faut renommer KAProtoCRM.xlsx en KAProtoCRM.accdb.

Ensuite il faut créer un utilisateur racine dans la db elle même, avec Access (table useraccount - le champ useraccount doit être identique à ce que répond ?application.username dans la fenêtre Immediate comme ceci:

image

). Ensuite il faut ouvrir le fichier KAProtoCRM_V3.14.xlsm dans Excel 32bits, sorry!

image

La forme en question est frmACList. Elle est appelée en modal dans frmAccount2 et dans frmActivity2.

  • frmAccount2 peut être appelée en lançant Accounts et ensuite en double-cliquant sur un account.
  • frmActivity2 peut être appelée en lançant Activities et ensuite en cliquant sur New...

A dispo pour toute question.

Merci pour votre expertise!

2kaprotocrm.zip (69.12 Ko)

"bonjour, si le USF est modeless au lieu de modal ?"

Pas trop exploré cette voie, cependant j'aimerais que le comportement soit le même que lorsqu'on sauve un fichier dans Excel etc... Si c'est modeless et je clique à côté alors jenvoie en background les autres fenêtres de la macro (frmAccounts et autres) et l'utlisateur se désoriente... Il y a des exceptions bien sûr comme la fenêtre FIND ou la TOOLBOX dans l'IDE de VBA, mais elles nécessitent de rester toujours par dessus les autres, ce qui n'est pas dispo dans VBA, je pense.

Merci pour ta macro, X Cellus, qui m'a permis d'apprendre quelque chose que je ne connaissais pas à savoir l'event MouseMove()!

Cependant ce n'est pas ce que je recherche, car il faut rentrer dans la forme avec la souris, pour déclencher ce MouseMove(), alors qu'un dropdown "normal" ou classique ne l'exige pas. De plus il suffit de sortir de la forme contenant la liste pour la faire disparaitre, alors qu'un dropdown "normal" nécessite aussi un click externe. J'ai aussi trouvé hasardeux rentrer dans la forme à des vitesses variées, car je risque de la faire disparaitre, suivant le moment de l'exécution du handler MouseMove().

Il est clair que la fenetre d'un drop-down classique "entend" le click qui a lieu en dehors d'elle-même.

Il me semble avoir lu qu'il existe une fonction qui restitue justement les coordonnées de ce click externe, mais je ne sais pas comment l'utiliser.

Bonjour Stefano, superbe dev.

Edit : Il faut aussi ajouter les droits dans la table "Appright"

A+

oops, j'oubliais... il faut te donner les droits de LIRE et ECRIRE Accounts et Activities, en renseignant la table userright, avec le userid que tu viens de créer et 23 enregistrements (tous les droits), comme ceci:

image

Et merci pour ton compliment BrunoM45! C'est en production et les utilisateurs en sont contents, cependant il y a encore tant à faire...

Re,

Je sens que ça va être galère j'ai aucun "account" qui remonte l'USF est vide...

Il faut aussi mettre le chemin d'où se trouve le fichier DB dans la cellule C2 de la feuille Settings:

image

Pardon, je pensais que la macro t'aurait invité à le faire...

PS: ça veut dire quoi USF?

A nouveau,

car il faut rentrer dans la forme avec la souris, pour déclencher ce MouseMove(), alors qu'un dropdown "normal" ou classique ne l'exige pas.

Un dropdown ne l'exige pas si on inscrit une des valeurs appartenant la liste. Sinon on passe obligatoirement par une recherche dans la fenêtre ouverte.

Maintenant plutôt qu'utiliser une ListView passer par un ComboBox résoudrait mieux le besoin.

Rechercher des sujets similaires à "comment fermer forme lorsqu clique dehors"