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 :

UserForm_Initialize semble ne pas s'exécuter lors du premier lancement de l'UserForm


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Avril 2014
    Messages : 16
    Par défaut UserForm_Initialize semble ne pas s'exécuter lors du premier lancement de l'UserForm
    Bonjour,

    Je rencontre un petit souci sur un UserForm (qui s'appelle AjoutMoyenAcces) que je cherche à la placer au centre de la fenêtre lors de son lancement. Le code pour effectuer un tel placement est le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Sub AjoutMoyenAcces_Initialize()
        ' Détermination de la largeur et de la hauteur de la fenêtre courante
        LargeurFenêtre = ActiveWindow.Width
        HauteurFenêtre = ActiveWindow.Height
        ' Détermination des positions gauche et droite de Excel
        PositionGauche = Application.Left
        PositionHaut = Application.Top
        ' Affectation de la position à l'UserForm
        AjoutMoyenAcces.Left = PositionGauche + LargeurFenêtre / 2 - AjoutMoyenAcces.Width / 2
        AjoutMoyenAcces.Top = PositionHaut + HauteurFenêtre / 2 - AjoutMoyenAcces.Height / 2
    End Sub
    Le problème, c'est que ce placement fonctionne de façon un peu aléatoire surtout lors du premier lancement de mon UserForm où ce dernier s'entête à apparaître dans le coin supérieur gauche.

    Par ailleurs, lorsque je redimensionne ma fenêtre Excel, la première fois que je lance l'UserForm, celui-ci se place comme s'il n'avait pas encore compris que la fenêtre était redimensionnée. Il faut attendre le second lancement pour qu'il se positionne conformément à la nouvelle fenêtre.
    Un peu comme si il fallait un premier lancement pour que le Initialize ait analysé la géométrie de ma fenêtre et qu'il fonctionne correctement...

    Je précise que je travaille en multi-écrans.

    Merci d'avance de votre aide !

  2. #2
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour,
    Ton aide vba t'apprend que l'évènement Initialize se produit lorsqu'une feuille est chargée et avant que celle-ci ne s'affiche.
    Tu ferais bien d'utiliser plutôt l'évènement Activate (en prenant la précaution d'afficher ton UserForm par la méthode Show et non Load)

  3. #3
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 678
    Par défaut
    Salut,

    le bon evenement de chargement est surtout
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Private Sub UserForm_Initialize()
    End Sub
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Migrer les applications VBA Access et VBA Excel vers la Power Platform
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Avril 2014
    Messages : 16
    Par défaut
    Merci de vos réponses.

    unparia : Concernant la méthode Activate, je crois pourtant avoir bien compris de quoi il s'agit : elle s'applique quand on réaffiche un UserForm après qu'il a été masqué. Ce n'est jamais le cas dans mon fichier : j'ouvre le UserForm par la méthode Show et le referme par la méthode Unload (sans jamais utiliser Hide ou ouvrir un UserForm par-dessus).
    Du coup j'utilise Initialize pour paramétrer mon UserForm avant de l'afficher (Show).
    J'ai tout de même essayé ta méthode et ça ne corrige pas le problème.
    C'est même devenu pire ! Maintenant la fenêtre s'affiche en permanence dans le coin supérieur gauche malgré mes directives dans le Initialize.

    jpcheck : Lorsque je mets UserForm_Initialize, j'ai une erreur 424 "Objet requis". Le pas à pas détaillé semble m'indiquer que la procédure Initialize est lancée et se déroule correctement jusqu'à là (cf. première image) où le F8 suivant m'occasionne une erreur (cf. deuxième image).

    Nom : Capture.PNG
Affichages : 4589
Taille : 8,5 Ko

    Nom : Capture2.PNG
Affichages : 4522
Taille : 1,7 Ko

    Tu peux m'expliquer pourquoi mettre nom_du_userforme_Initialize peut poser problème ?

    Merci encore de votre aide.

  5. #5
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 678
    Par défaut
    Pour la simple raison que si demain tu changes le nom de ton formulaire, le code VBA ne sera pas mis a jour, contrairement aux noms de controles. Tu peux nommer comme bon te semble (dans la limite impartie par VBE), mais seul la procedure UserFom_Initialize s'executera lors du chargement>

    Pour ton code, corrige comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Sub UserForm_Initialize()
        ' Détermination de la largeur et de la hauteur de la fenêtre courante
        LargeurFenêtre = ActiveWindow.Width
        HauteurFenêtre = ActiveWindow.Height
        ' Détermination des positions gauche et droite de Excel
        PositionGauche = Application.Left
        PositionHaut = Application.Top
        ' Affectation de la position à l'UserForm
        AjoutMoyenAcces.Left = PositionGauche + LargeurFenêtre / 2 - AjoutMoyenAcces.Width / 2
        AjoutMoyenAcces.Top = PositionHaut + HauteurFenêtre / 2 - AjoutMoyenAcces.Height / 2
    End Sub
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Migrer les applications VBA Access et VBA Excel vers la Power Platform
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  6. #6
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    à noter qu'un Userform peut être manipulé par son nom, comme te l'a montré jpcheck, mais peut également être manipulé (au sein de son propre module) par l'instruction Me

    ainsi, pour un userform appelé MonUserform, les deux lignes suivantes sont équivalentes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MonUserform.Left = PositionGauche + LargeurFenêtre / 2 - AjoutMoyenAcces.Width / 2
    Me.Left = PositionGauche + LargeurFenêtre / 2 - AjoutMoyenAcces.Width / 2

    Attention également, un nom de Userform écrit en "dur" t'obligera à modifier son nom dans le code, si tu modifies son nom

    cette ligne de code devrait porter le nom contractuel de ton Userform :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MsgBox MonUserform.Name
    Si MonUserform est renommé en MonNouveauUserform, ce code ne fonctionne plus

    chose qui n'arrive pas avec Me, qui représente en fait l'objet en tant que tel, plutôt qu'une simple de ses propriétés

  7. #7
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Concernant la méthode Activate, je crois pourtant avoir bien compris de quoi il s'agit : elle s'applique quand on réaffiche un UserForm après qu'il a été masqué. Ce n'est jamais le cas dans mon fichier : j'ouvre le UserForm par la méthode Show et le referme par la méthode Unload (sans jamais utiliser Hide ou ouvrir un UserForm par-dessus).
    Du coup j'utilise Initialize pour paramétrer mon UserForm avant de l'afficher (Show).
    NON !
    Initialize ne saurait agir sur une fenêtre non encore affichée !
    J'insiste donc : montre par la méthode Show (pas besoin du Load si Show est utilisé) et utilise l'évènement Activate (qui vient APRES Initialize)
    Tu veux la preuve du bien fondé de ce que je dis ?
    Sur un bouton placé sur ta feuille de calcul :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub CommandButton1_Click()
      UserForm1.Show
    End Sub
    Bien. passons maintenant aux test suivants :
    Test 1 (utilisation de l'évènement Activate) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub UserForm_Activate()
     Me.Move 0, 0
    End Sub
    Le userform réagit parfaitement (va en haut et à gauche de ton ECRAN, comme demandé)
    Test 2 (on efface le Activate et on utilise le Initialize)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub UserForm_Activate()
     Me.Move 0, 0
    End Sub
    Ton userform ignore totalement cette instruction.

    Je reviendrai vers vous tous lorsque ce premier point aura bien été assimilé.
    Et nous parlerons alors d'autres aspects, dont l'échelle utilisée
    Je dis bien "dont", car ce sera l'aspect le moins difficile, parmi d'autres aspects bien plus complexes.

  8. #8
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut
    Bonjour !

    Citation Envoyé par joe.levrai Voir le message
    avec Me qui représente en fait l'objet en tant que tel, plutôt qu'une simple de ses propriétés
    Et même sans Me car au sein du module de classe d'un UserForm
    de facto tous ses objets sont déjà référencés ! MsgBox Name !

    _________________________________________________________________________________________________________

    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion …

    _________________________________________________________________________________________________________
    Je suis Paris, Charlie, Bruxelles, …

  9. #9
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 903
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    Là, je vis un découragement énorme

    Tant de chichis pour placer un UserForm au centre de l'écran, alors que Microsoft a déjà mâché le travail et l'a mis dans Excel.

    Une petite recherche dans l'aide de VBA

    Méthode courte:

    StartUpPosition, propriété

    Méthode longue:

    UserForm ==> UserForm, objet et UserForms, collection ==> propriétés

  10. #10
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 678
    Par défaut
    Ca ne me choque pas outre mesure, vu que la logique est bonne, et permet meme de passer outre le multi ecran.
    Sauf erreur de manipulation de mon cote, la methode que tu suggeres clement ne fonctionne que sur du simple ecran, pas du multi ecran
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Migrer les applications VBA Access et VBA Excel vers la Power Platform
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  11. #11
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Ah ! ...
    Pouvons-nous revenir à nos moutons (tout au moins ceux du demandeur) ?
    Relisons sa demande : elle n'est pas celle d'un centrage par rapport à l'écran, ni même par rapport à la fenêtre de l'application Excel, mais ... par rapport à la fenêtre active (ActiveWindows)...
    Et ce sont là trois "choses" très très très loin d'être la même chose.
    Autant il est assez aisé de faire cela avec un contrôle activex, autant (nous le verrons si le demandeur insiste) il faudra se relever les manches pour placer ainsi un userform.
    Commencez donc par vous demander ce qu'est exactement ActiveWindows. Faites quelques petits essais de déplacement de cette fenêtre ... ce sera un bon début.

  12. #12
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    Bonsoir
    pour compléter la reponse de unparia d'abords se poser la question quoiqu'estce en VBA activewindow
    pour repondre avotre question voir la capture

    Nom : Capture.JPG
Affichages : 4515
Taille : 70,0 Ko
    maintenant que vous savez ce que c'est posez vous la deuxième question qui va vous faire pleurer

    quelle est active window l'ors du initialise ou activate de l'userform

    maintenant que vous savez si vous vous avez pas de mouchoir prenez du Pcu



    remerciez unparia
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  13. #13
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    re

    voir ma contribution sur cette question Ici!! http://www.developpez.net/forums/d94...ution-l-ecran/
    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
    #If win64 Then
    Private Declare ptrsafe Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long
    #Else
    Private Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long
    #End If
    Private Sub UserForm_Activate()
        L = GetSystemMetrics(0): H = GetSystemMetrics(1)
        MsgBox "la résolution de mon ecran est de :" & L & " Pixels de largeur sur " & H & " Pixel de hauteur "
     
    End Sub
    Private Sub UserForm_Initialize()
     ' on peut le mettre ici aussi
      ' L = GetSystemMetrics(0): H = GetSystemMetrics(1)
        'MsgBox "la résolution de mon ecran est de :" & L & " Pixels de largeur sur " & H & " Pixel de hauteur "
     
      End Sub
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  14. #14
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    re
    j oubliais!!
    il arrive parfois sur un double affichage selon le mode ( extention/separé)
    l'api donne la largeur des deux écrans pour le premier
    dans ce cas la faire un test
    2000 etant aujourd'hui pas loin d'un ecran 24 pouce(ecran tv 80cm)
    a vérifier
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  15. #15
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    petite image, sur laquelle j'ai volontairement déplacé et redimensionné (ce que le demandeur semble d'ailleurs vouloir pouvoir faire en gérant la position de l'userform) :
    - la fenêtre Application
    - la fenêtre ActiveWindows
    les flèches montrent Ce que sont, lorsque l'on clique sur CommanButton1 :
    ActiveWindow (flèche rouge)
    Fenêtre Application (flèche verte)
    La bleue montre l'écran.
    Une petite précision : les coordonnées de ActiveWindows sont en points et par rapport à une autre fenêtre, qui n'est pas non plus ActiveWindows
    Les coordonnées de l'Userform devront, elles, être exprimées en pixels et par rapport au coin supérieur gauche de l'écran. Je vous laisse déjà imaginer tous les autres calculs arithmétiques à faire , faisant intervenir différentes échelles d'unités graphiques.
    Ce ne sera pas UNE, mais plusieurs fonctions de l'Api de Windows, qu'il faudra utiliser.

    Nom : Sans titre.JPG
Affichages : 4653
Taille : 156,7 Ko

  16. #16
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Avril 2014
    Messages : 16
    Par défaut
    Beaucoup de réponses en une nuit ; merci infiniment !
    Et mon problème semble être résolu !

    jpcheck : La correction que tu as apportée sur mon code fonctionne parfaitement : l'UserForm se place correctement et dès son premier lancement avec la procédure Initialize.

    joe.levrai et Marc-L : Merci pour vos ajouts : j'ai intégré le Me dans mon Initialize : ça allège et c'est vrai que si jamais je devais renommer mon UserForm et bien ça m'évitera des retouches au code.

    clementmarcotte : Effectivement on peut régler certaines options dans les propriétés de l'UserForm mais c'est parce que ça ne fonctionnait pas en multi-écrans que j'ai fait des "chichis" ! ;-)

    unparia et patricktoulon : Je vous remercie de m'avoir fait voir la différence entre la fenêtre active et la fenêtre application : elle m'avait totalement échappé. Dans mon cas, la différence n'est pas énorme puisque je compte bien n'avoir qu'une seule fenêtre active en "plein écran" (je ne sais pas si le terme est adapté) dans mon application Excel. Mais c'est une notion importante que vous avez super bien fait de souligner !
    J'ai donc adapté mon code pour que l'UserForm soit centré dans la fenêtre application.
    Concernant vos trois derniers messages, j'avoue que ça se complexifie beaucoup pour moi. Vu que mon problème est résolu je ne vais pas me pencher sur toutes ces subtilités (mais peut-être qu'un jour j'en aurai besoin donc je les garde sous le bras !).

    Voici mon code final pour placer mon UserForm au centre de la fenêtre Excel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Sub UserForm_Initialize()
        ' Détermination de la largeur et de la hauteur de la fenêtre courante
        LargeurFenêtre = Application.Width
        HauteurFenêtre = Application.Height
        ' Détermination des positions gauche et droite de Excel
        PositionGauche = Application.Left
        PositionHaut = Application.Top
        ' Affectation de la position à l'UserForm
        Me.Left = PositionGauche + LargeurFenêtre / 2 - Me.Width / 2
        Me.Top = PositionHaut + HauteurFenêtre / 2 - Me.Height / 2
    End Sub
    unparia (attention, gros aparté !) :
    La différence entre Initialize et Activate, je dois le reconnaître, reste assez floue pour moi au vu de ce que tu expliques et de ton exemple pourant édifiant.
    L'aide VBA dit que Initialize "se produit après le chargement d’un objet, et avant son affichage". J'en conclus donc que quand j'ouvre un UF par Show, il se passe chronologiquement les choses suivantes :
    • L'UF est chargé (c'est un Load implicite : si je veut Show un UF encore faut-il qu'il soit chargé au préalable). Cf. un peu plus bas.
    • Après avoir été chargé, il est paramétré selon ce qui est écrit dans Initialize (dans mon cas, sa position est réglée).
    • Puis il est affiché à l'écran (c'est Show qui s'exprime).

    Du coup,

    Initialize ne saurait agir sur une fenêtre non encore affichée !
    si, c'est précisément ce qu'il fait : il agit sur un fenêtre avant son affichage.

    Concernant ceci,

    (pas besoin du Load si Show est utilisé)
    je suis tout à fait d'accord : quand un UF n'est pas encore chargé, l'afficher (Show) implique nécessairement de la charger (Load) avant. Faire Show sur un UF non Load au préalable reviens exactement pareil que faire Load puis Show. Par contre de toute évidence ou peut Load un UF sans pour autant l'afficher.

    Ton exemple est parlant : je l'ai testé et effectivement, seul le Activate fonctionne et le Initialize est ignoré. Mais alors du coup ça démonte tout ce que je pensais avoir compris !

    Je serai quand même tenté de dire que le Initialize est au Load ce que le Activate est au Show. Du coup quand je Show un UF non chargé, le Load se fait donc appelle le Initialize quand même.
    Par contre quand je Show un UF déjà chargé mais mis en arrière-plan pour une raison ou une autre, seul le Activate s'exprime.

    Mais ceci va en contradiction avec l'exemple que tu donnes et là je suis bien embêté parce que ça veut dire que j'ai raté un truc !
    Si tu as encore la patience de m'expliquer, je suis preneur.

  17. #17
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Je vais te répondre avec patience, mais sagesse.
    Pour chacun des évènements du userform :
    écris l'instruction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    msgbox "nom_de_l'évènement"
    exemple , donc, pour l'évènement initialize :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub UserForm_Initialize()
     msgbox "initialize"
    End Sub
    l'ordre dans le quel tes msgboxes s'afficheront t'indiquera de manière claire et sans la moindre ambiguïté l'ordre dans lequel se produisent ces évènements, non ?
    Je te laisse en déduire tout le reste.

  18. #18
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Avril 2014
    Messages : 16
    Par défaut
    Si je définis à la fois les événements Initialize et Activate, alors sans ambiguïté, grâce aux messages témoins, c'est le Initialize qui se produit avant le Activate.

    Du coup, voici ce que j'en déduis :
    1. Un Load implicite a lieu (pour montrer un UserForm, il faut qu'il soit chargé).
    2. Couplé à ce Load, l'événement Initialize se lance et applique des réglages.
    3. Le Show (explicitement demandé) se lance.
    4. Couplé à ce Show, l'événement Activate se lance et applique des réglages.

    Si je ne définis que l'événement Initialize, alors le message témoin s'affiche bien mais les paramètres de position définis dans Initialize ne sont pas appliqués.

    Si je ne définis que l'événement Activate, alors le message témoin s'affiche et les paramètres de position définis dans Initialize sont appliqués.

    Conclusion : La procédure Initialize n'a pas de pouvoir sur la géométrie d'un UserForm car elle se rapporte à l'affichage ?
    Pourtant, dans le fichier pour lequel je posais la question, j'ai réussi à résoudre le problème tout en restant avec Initialize.

    Désolé d'insister, c'est pas pour le plaisir de tout remettre en question, mais j'aimerais vraiment comprendre !

  19. #19
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bon ...
    Je me suis beaucoup ,"tâté", jespscej, avant d'accepter de répondre à tes interrogations. J'avais mes raisons : une très mauvaise expérience remontant à plus de 10 ans, sur un forum anglophone. J'avais à l'époque pris le soin (et la peine) d'expliquer beaucoup de choses à ce propos. C'était sans compter avec l'existence d'une "floppée" de "moineaux" habituellement silencieux, mais qui d'un seul coup, sans rien y connaître, mais croyant qu'ils "tenaient" là un sujet à leur "portée", disaient tout, n'importe quoi, etc ...
    J'avais donc fini par supprimer carrément une discussion qui devenait totalement illisible.
    Je vais essayer d'éviter ici la répétition d'une telle mésaventure (et d'une telle cacophonie)
    On y va, point par point :
    1) le seul fait d'invoquer un userform (ou même un objet de cet userform) fait que cet userform est chargé en mémoire (sans nécessité de le charger expressément).
    Et cela est vrai quel que soit l'endroit de l'appli depuis lequel on évoque (par son nom) le userform concerné. Y compris, donc, depuis n'importe quelle procédure évènementielle du dit Userform ...
    Voilà un aspect que bien peu nombreux sont ceux qui l'ont cerné. Les "autres" continuent à croire que l'on peut tirer un bénéfice du déchargement d'un Userform (idem, d'ailleurs, en VB6, avec les Forms) alors que ce n'est vrai que si l'appli n'a vraiment plus à utiliser cet objet.
    2) Quelle est la vocation de l'évènement Initialize ? Elle n'est autre que l'utilisation des propriétés déjà arrêtées de l'Userform, que ces propriétés aient été arrêtées en mode création ou qu'elles l'aient été dynamiquement. Intialize n'affiche rien. Initialize "interprête" et utilise ces propriétés. Tu pourrais d'ailleurs le constater par une simple msgbox dans cet évènement, sans autre instruction ===>> le Userform n'est pas affiché du tout à ce stade !
    Initialize, donc, lit, en vue de les appliquer, les propriétés définies. Il ne saurait être question (sinon il jouerait au "poker javanais") de modifier en même temps !
    3) Il y a une énorme différence entre le handle (hwnd) octroyé à une fenêtre à ouvrir (qui lui reste fixe durant toute la durée de vie de l'appli) et celui du dessin de cette fenêtre dans un dispositif : le hdc, qui lui, n'est pas fixe et renouvelé à chaque recréation graphique de ladite fenêtre
    4) il y a également une énorme différence entre la modification a priori des propriétés à utiliser d'un userform et celle des propriétés à appliquer à la fenêtre (au hdc, donc).
    Je ne veux pas aller au delà, pour éviter un "cours" (ce n'est pas la vocation d'une discussion et ce serait très très très long)
    Je vais donc t'inviter à faire ceci, dans un classeur vierge avec un userform userform1 et un contrôle commandButton1 sur une feuille de calcul :

    code du commandbutton :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub CommandButton1_Click()
      MsgBox UserForms.Count
      UserForm1.StartUpPosition = 3 ' pour nous laisser la liberté
      UserForm1.Left = 0
      UserForm1.Top = 0
      MsgBox UserForms.Count & "   : " & UserForms(0).Name & " (passé automatiquement en mémoire du seul fait de son évocation)"
      UserForm1.Show
      MsgBox "tu vois ? Il a suffi de modifier les proprétés"
    End Sub
    code du userform : ben ... aucun, carrément !
    Lance
    Et que faisais-tu, toi, sinon, dans l'évènement initialize, modifier les propriétés du userform lui-même ?
    Ben ... c'est bel et bien cela, que tu faisais ---->>> et ma foi, au prochain Show, elles étaient alors tout simplement prises en compte ces nouvelles propriétés (elles étaient différentes au 1er)
    Voilà ...
    Je m'arrête maintenant là, considérant que les choses qui devaient être dites l'ont pour l'essentiel été.

    EDIT : ah oui ... j'ai oublié d'expliquer pourquoi le problème était autre avec Activate.
    Tout simplement parce qu'à l'étape Activate, la fenêtre (le hdc, donc) est déjà là et que tes instructions y agissent directement. C'est alors la fenêtre, que tu déplaces.

    Il est à observer qu'un Form VB6 répond à deux évènements supplémentaires : Load et Paint
    Et on voit bien, sous VB6, que le Initialize arrive avant même le Load (donc avant même le chargement)

  20. #20
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Avril 2014
    Messages : 16
    Par défaut
    unparia,
    Je suis en vacances jusqu'à mercredi prochain avec seulement mon smartphone donc sans Excel.
    J'étudierai avec soin ta réponse au retour. J'ai déjà des questions, d'ailleurs... ^^
    Merci infiniment de prendre tant de temps.

Discussions similaires

  1. Echec lors du premier lancement
    Par courdi95 dans le forum Installation, migration et administration
    Réponses: 3
    Dernier message: 27/05/2015, 17h20
  2. Problème de code lors du premier lancement après OK
    Par Vincent32 dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 21/01/2012, 09h17
  3. Réponses: 8
    Dernier message: 02/11/2011, 10h48
  4. [AC-2007] Lenteur d'une requête lors du premier lancement
    Par Bamban dans le forum Access
    Réponses: 4
    Dernier message: 27/10/2011, 16h15
  5. Semble ne pas passer en 32 bits, il s'exécute comme du 16 bits
    Par daniel06600 dans le forum x86 32-bits / 64-bits
    Réponses: 15
    Dernier message: 24/01/2008, 23h56

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