IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Comment afficher un userForm non modal sur une autre fenêtre ? [XL-2016]


Sujet :

Macros et VBA Excel

  1. #1
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 475
    Points : 5 630
    Points
    5 630
    Par défaut Comment afficher un userForm non modal sur une autre fenêtre ?
    Bonjour le Forum

    J'ai à nouveau un problème d'affichage avec Excel 2016 que je n'avais pas avec Excel 2007, très probablement lié au changement de l'interface MDI vers SDI.

    J’utilise un UserForm non modal pour travailler avec plusieurs classeurs ouverts, sur les informations sélectionnées dans le classeur actif.
    Cela fonctionne parfaitement avec les versions Excel 2002 à 2010.

    Avec 2016 (et probablement avec 2013) lorsque j'ouvre un nouveau classeur depuis l'usf (Créer fichier), mon UserForm non modal disparaît !

    Ci-joint un fichier réduit au plus simple pour exemple.
    Fichiers attachés Fichiers attachés
    Cordialement,
    Patrice
    Personne ne peut détenir tout le savoir, c'est pour ça qu'on le partage.

    Pour dire merci, cliquer sur et quand la discussion est finie, penser à cliquer sur

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 617
    Points : 5 912
    Points
    5 912
    Par défaut
    Bonjour,

    Comme le Userform "fait partie" du classeur appelant, ça risque d'être compliqué sans donner le focus à ce fichier.
    Tu peux peut-être regarder du côté de l'API SetWindowPos
    MPi²

  3. #3
    Membre confirmé
    Homme Profil pro
    conseiller
    Inscrit en
    Janvier 2013
    Messages
    367
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : conseiller
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2013
    Messages : 367
    Points : 649
    Points
    649
    Par défaut
    Teste l'utilisation de la méthode AppActivate.
    A+

  4. #4
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 475
    Points : 5 630
    Points
    5 630
    Par défaut
    Re,

    Citation Envoyé par parmi Voir le message
    Bonjour,

    Comme le Userform "fait partie" du classeur appelant, ça risque d'être compliqué sans donner le focus à ce fichier.
    Tu peux peut-être regarder du côté de l'API SetWindowPos
    En effet, il semble que même non modal, le Userform fasse partie du classeur appelant, pourtant Microsoft prétend qu'on peut travailler sur un autre classeur !

    J'ai trouvé une solution sur net qui utilises l'API et qui fonctionne aussi très bien avec Excel 2016 :
    http://www.jkp-ads.com/Articles/keepuserformontop02.asp

    Edit : en résumé il suffit d'ajouter le code suivant au début du module du formulaire non modal :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    Option Explicit
    '
    ' Code à ajouter en début du module du formulaire pour rendre celui-ci nonModal multi-fenêtre
    '————————————————————————————————————————————————————————————————————————————————————————————
    ' By Jan Karel Pieterse - info@jkp-ads.com - http://www.jkp-ads.com/
    '
    Private Const GWL_HWNDPARENT As Long = -8
    'Variable objet pour déclencher des événements d'application
    Private WithEvents XLApp As Excel.Application
     
    #If VBA7 Then
      'Pour VBA 7 : Excel 2010 et après
      Dim mXLHwnd As LongPtr        'handle de la fenêtre Excel
      Dim mhwndForm As LongPtr      'handle de la fenêtre de cet userform
      Private Declare PtrSafe Function FindWindowA Lib "user32" _
          (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
      #If Win64 Then
        Private Declare PtrSafe Function SetWindowLongA Lib "user32" Alias "SetWindowLongPtrA" _
            (ByVal hwnd As LongPtr, ByVal nIndex As Long, ByVal dwNewLong As LongPtr) As LongPtr
      #Else
        Private Declare PtrSafe Function SetWindowLongA Lib "user32" _
            (ByVal hwnd As LongPtr, ByVal nIndex As Long, ByVal dwNewLong As LongPtr) As LongPtr
      #End If
      Private Declare PtrSafe Function SetForegroundWindow Lib "user32" (ByVal hwnd As LongPtr) As Long
    #Else
      'Pour VBA 6 : jusqu'à Excel 2007
      Dim mXLHwnd As Long         'handle de la fenêtre Excel
      Dim mhwndForm As Long       'handle de la fenêtre de cet userform
      Private Declare Function FindWindowA Lib "user32" _
        (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
      Private Declare Function SetWindowLongA Lib "user32" _
        (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
      Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long
    #End If
     
    Private Sub XLApp_WindowActivate(ByVal Wb As Workbook, ByVal Wn As Window)
        If Val(Application.Version) >= 15 And mhwndForm <> 0 Then  'Formulaire créé dans la fenêtre active Excel.
            mXLHwnd = Application.hwnd         'Défini systématiquement car en SDI chaque wb a sa propre fenêtre.
            SetWindowLongA mhwndForm, GWL_HWNDPARENT, mXLHwnd
            SetForegroundWindow mhwndForm
        End If
    End Sub
     
    Private Sub XLApp_WindowResize(ByVal Wb As Workbook, ByVal Wn As Window)
        If Not Me.Visible Then Me.Show vbModeless
    End Sub
     
    Private Sub XLApp_WorkbookBeforeClose(ByVal Wb As Workbook, Cancel As Boolean)
        SetWindowLongA mhwndForm, GWL_HWNDPARENT, 0&
    End Sub
     
    Private Sub UserForm_Initialize()
        If Val(Application.Version) >= 15 Then        'Excel 2013 et après
            Set XLApp = Application
            mhwndForm = FindWindowA("ThunderDFrame", Caption)
        End If
    '
    ' Fin du code à ajouter en début du module du formulaire
    '————————————————————————————————————————————————————————————————————————————————————————————
    '
    ' Ajouter ici votre initialisation
     
    End Sub
    Cordialement,
    Patrice
    Personne ne peut détenir tout le savoir, c'est pour ça qu'on le partage.

    Pour dire merci, cliquer sur et quand la discussion est finie, penser à cliquer sur

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [WM18] Comment afficher un element non visible d'une zone multiligne ?
    Par nico78 dans le forum Windev Mobile
    Réponses: 3
    Dernier message: 19/09/2013, 12h01
  2. [XL-2003] Erreur code:copie de données non vides sur une autre feuille
    Par Razekiel_ dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 29/04/2013, 08h08
  3. [XL-2010] Afficher/Masquer un TDC présent sur une autre feuille
    Par QGRdev dans le forum Excel
    Réponses: 4
    Dernier message: 03/01/2013, 14h59
  4. [E-02] Comment garder un Userform non Modal affiché ?
    Par Frutchy dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 23/12/2008, 02h36
  5. Réponses: 3
    Dernier message: 25/09/2008, 19h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo