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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    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 : 84
    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 683
    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 683
    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 (3e édition)
    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 : 33
    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 : 4788
Taille : 8,5 Ko

    Nom : Capture2.PNG
Affichages : 4715
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 683
    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 683
    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 (3e édition)
    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

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, 18h20
  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, 10h17
  3. Réponses: 8
    Dernier message: 02/11/2011, 11h48
  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, 17h15
  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: 25/01/2008, 00h56

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