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 :

[E-02] Comment garder un Userform non Modal affiché ?


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 12
    Points : 6
    Points
    6
    Par défaut [E-02] Comment garder un Userform non Modal affiché ?
    Bonsoir,

    J'ai l'impression de passer à côté de quelque chose qui m'a l'air d'être simple mais que je ne trouve pas.

    J'ai un UserForm défini en ShowModal False car je veux pouvoir accéder aux feuilles EXCEL, indépendamment du UserForm.

    Je lance ce UserForm dans ThisWorkBook, à l'ouverture du classeur.
    Le UserForm contient plusieurs boutons.
    Un de ces boutons déclenche une procédure d'initialisation qui copie des feuilles, etc.
    Tout fonctionne impeccablement, sauf que je n'ai pas trouvé comment GARDER le UserForm affiché à la fin de la procédure d'initialisation.

    Évidemment, le ShowModal True est une solution mais elle bloque mes feuilles, ce n'est donc pas ce que je recherche.
    Je veux simplement qu'à la fin de la procédure le UserForm reste affiché pour que l'on puisse (mais sans que ce soit une obligation) utiliser un des autres boutons ultérieurement.

    J'ai essayé avec Load et Show, en jouant sur la Propriété ShowModal mais rien n'y fait. Elle disparaît à la fin de la procédure que le bouton a déclenchée.

    J'ai actuellement une solution de contournement qui est de rappeler manuellement le UserForm avec une macro qui ne contient que "Show" du Userform et que j'appelle avec un raccourci Ctrl + touche. Mais c'est peu satisfaisant.

    Il doit bien y avoir un moyen de garder ce truc affiché, non ?

    Merci d'avance pour vos lumières !

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    491
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 491
    Points : 542
    Points
    542
    Par défaut
    bonjour,

    Tu dois pouvoir garder le user en premier plan si tu n ' utilises pas de select ou activate pour travailler sur tes feuilles.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    Merci de vos idées fraîches (à 5h50 tout de même !), mais hélas, justement j'en fais plein, des Select et des Activate.

    Ces feuilles sont les vraies feuilles de travail, remplis de macros, alors que le Userform ne sert qu'à initialiser et positionner certains paramètres.

  4. #4
    Membre émérite Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 392
    Points : 2 985
    Points
    2 985
    Par défaut
    Salut,
    pour une idée moins fraîche, il serait pratique que tu montres ton code en précisant bien ce qui se trouve dans les modules, les feuilles..... etc....

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    OK.

    On y va.

    Mais après tout, je me demande si ce comportement n'est pas "Par design". Qu'il est normal qu'un UserForm (Modal ou pas) disparaisse à la fin de l'exécution d'une des procédures déclenchées par un de ses contrôles. Autrement dit : Si l'on veut que le UserForm apparaisse à nouveau, il faut le relancer, d'une façon ou d'une autre, de préférence en automatique, et il restera visible jusqu'à ce que l'on utilise un de ses contrôles qui exécute une procédure.

    Une copie du Userform est en pièce jointe, avec ses Propriétés.

    Le UserForm est lancé depuis le code événementiel de la procédure ThisWorkBook Open, dont voici la fin :

    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
    ' je réactive l'affichage des messages d'alertes
    Application.DisplayAlerts = True
     
    If changement = 0 Then
        Sheets("Devis-Facture").Select
        Range("K8").Select
    Else
        Range("B3").Select
        MsgBox "Veuillez vérifier les autres paramètres :" & Chr(13) & Chr(10) & _
                "- chrono (numéro d'ordre des factures et devis)" & Chr(13) & Chr(10) & _
                "- noms des imprimantes PDF" & Chr(13) & Chr(10) & _
                "- chemins pour enregistrer les factures et PDF avec agrément, etc."
        changement = 0
    End If
    ACTIONS.Devis_ou_Facture.Caption = "FACTURE"
    ACTIONS.Devis_ou_Facture.ForeColor = RGB(0, 0, 0)
    ACTIONS.Devis_ou_Facture.BackColor = RGB(0, 255, 0)
    ACTIONS.Facturer.Caption = "POUR FACTURER"
    ACTIONS.Facturer.ForeColor = RGB(0, 0, 0)
    ACTIONS.Facturer.BackColor = RGB(0, 255, 0)
    ACTIONS.Agrément.Caption = "SANS AGRÉMENT"
    ACTIONS.Agrément.ForeColor = RGB(0, 0, 0)
    ACTIONS.Agrément.BackColor = RGB(0, 255, 0)
    ACTIONS.ListeChrono.visible = False
    ACTIONS.Show
    End Sub
    Le bouton "Initialiser" contient le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Private Sub Action_Initialiser_Click()
    Initialiser
    End Sub
    Et la fin de la procédure (dans un Module) "Initialiser" est celle-ci :
    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
    If ACTIONS.Facturer.Caption = "POUR FACTURER" Then
        If Range("A1") = "A" Then
            Range("N3").FormulaR1C1 = "=paramètres!R16C5"
            Range("M3").FormulaR1C1 = "=paramètres!R17C5"
            Range("L3").FormulaR1C1 = "=paramètres!R18C5"
            Range("K3").FormulaR1C1 = "=RC[3]&TEXT(RC[2],""00"")&TEXT(RC[1],""000"")"
        Else
            Range("N3").FormulaR1C1 = "=paramètres!R16C2"
            Range("L3").FormulaR1C1 = "=paramètres!R18C2"
            Range("K3").FormulaR1C1 = "=RC[3]&TEXT(RC[1],""0000"")"
        End If
    Else
        If Range("A1") = "A" Then
            Range("N3").FormulaR1C1 = "=paramètres!R11C5"
            Range("L3").FormulaR1C1 = "=paramètres!R12C5"
            Range("K3").FormulaR1C1 = "=RC[3]&TEXT(RC[1],""0000"")"
        Else
            Range("N3").FormulaR1C1 = "=paramètres!R11C2"
            Range("L3").FormulaR1C1 = "=paramètres!R12C2"
            Range("K3").FormulaR1C1 = "=RC[3]&TEXT(RC[1],""0000"")"
        End If
    End If
    ActiveWorkbook.Sheets("Devis-Facture").Tab.ColorIndex = 4
    If choix = 0 Or choix = 2 Then
        Range("G2").Select
        Selection.Copy
        Range("B18").Select
            Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
                :=False, Transpose:=False
    End If
    Range("K8").Select
    ActiveSheet.Protect
     
    ' ACTIONS.Show vbModeless ' (ou "O" (sans les "") ou False)
    End Sub
    Ce qui donne :
    - à l'ouverture du classeur, après d'autres actions, le UserForm s'affiche.
    - On clique sur un des boutons, par exemple Initialiser.
    - Initialiser déclenche la proc du même nom.
    Après quoi, le UserForm disparaît.
    Alors que j'aurais voulu qu'il reste affiché pour que l'on puisse se servir des autres boutons, tout en travaillant sur les feuilles dans le classeur.

    J'ai aussi essayé de relancer le UserForm à la fin de la procédure (d'où encore le code en commentaire) mais évidemment ça ne marche pas puisqu'à ce moment précis le UserForm est encore affiché !

    Précision : Je suis sous EXCEL XP (v 2002).

    Merci d'avance !
    Images attachées Images attachées  

  6. #6
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut
    Tu peux éviter les Select de cette manière:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        Range("G2").Copy
        Range("B18").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
                :=False, Transpose:=False
    Si tu dois travailler sur plusieurs feuilles, je te conseille de créer des instances de chacune de ces feuilles.
    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Dim wksSource As Worksheet
    Dim wksDest As Worksheet
    Set wksSource = ThisWorkbook.Sheets("Source")
    Set wksDest = ThisWorkbook.Sheets("Destination")
    wksSource.Range("G2").Copy
    wksDest.Range("B18").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
                :=False, Transpose:=False

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par AlainTech Voir le message
    Tu peux éviter les Select de cette manière:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        Range("G2").Copy
        Range("B18").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
                :=False, Transpose:=False
    Si tu dois travailler sur plusieurs feuilles, je te conseille de créer des instances de chacune de ces feuilles.
    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Dim wksSource As Worksheet
    Dim wksDest As Worksheet
    Set wksSource = ThisWorkbook.Sheets("Source")
    Set wksDest = ThisWorkbook.Sheets("Destination")
    wksSource.Range("G2").Copy
    wksDest.Range("B18").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
                :=False, Transpose:=False

    Merci AlainTech pour ces bons conseils, j'en prends note !
    Il est vrai que j'ai appris VB sur le tas et que je n'ai pas toujours lu la doc que je trouve très mal fichue (en tout cas dans EXCEL 2002). Et ce genre de subtilités n'existait pas en COBOL !

    Ceci dit, la présence de Select ou le travail sur plusieurs feuilles n'a apparemment pas de rapport avec le problème.

    Je viens de découvrir qu'un autre bouton sur le même UserForm (et c'est même le bouton principal qui appelle LA procédure principale du système) est défini de la même façon que le bouton initialiser et qu'à la fin de cette procédure le UserForm reste affiché !

    Alors que la procédure appelée en fait bien plus que celle du bouton Initialiser : J'y jongle avec et entre les feuilles, j'y crée, entre autres, un nouveau classeur, que je sélectionne, que j'imprime, que j'enregistre, etc.

    Les propriétés des 2 boutons sur le UserForm sont identiques et
    pourtant après l'utilisation de l'un le UserForm disparaît alors qu'il reste après l'autre !

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 12
    Points : 6
    Points
    6
    Par défaut Je progresse...
    J'ai trouvé dans quel cas le UserForm disparaît :
    C'est lorsque la procédure que l'on déclenche par un bouton sur le UserForm supprime une feuille (n'importe laquelle) dans le classeur qui est actif au moment du clic !

    Je ne vois pas le rapport, mais c'est ainsi !
    Tant que l'on ne supprime pas de feuille, tout va bien, le UserForm reste affiché en permanence.

    Mon problème est donc à moitié résolu : Car je supprime une feuille, la "feuille de travail" on va dire, pour la remplacer par une autre contenant un modèle "vierge".

    Maintenant, je m'attèle à la tâche de ne plus initialiser la feuille de travail par une bête copie de feuille (entrainant donc la fatidique suppression de la feuille "utilisée"), mais on copiant une partie du contenu des feuilles "modèles".

    Mais les lignes d'un modèle à l'autre peuvent avoir des hauteurs de ligne différentes, donc je suis obligé d'utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sheets(feuille).Rows("1:57").Copy
    Sheets("feuilledetravail").Rows("1:1").Select
    ActiveSheet.Paste
    selon les bons conseils d'AlainTech, plus de Select pour sélectionner l'origine de la copie. C'est un progrès !

    Reste qu'il y a quelques zones de texte et Pictures par-çi, par-là sur ces feuilles. Qui sont copiées avec les lignes.

    Pour ne pas avoir 36 fois les mêmes superposées sur la feuille de travail, je souhaite les supprimer.

    MAIS : A chaque copie, leur nom change, donc aucun moyen de savoir comment s'appelent ces images pour les supprimer automatiquement dans ma feuille de travail.

    J'avais trouvé une commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ActiveSheet.Shapes.SelectAll
    pour toutes les sélectionner, mais cela me génère une erreur 7 "Mémoire insuffisante". J'ai trouvé sur Internet que cela pouvait venir d'une présence de Commentaires auprès des cellules mais je n'en ai pas.

    Y a-t-il une solution pour ce nouveau problème ?

    Je précise que je sais éviter la copie des Shapes en mettant la feuille "modèle" en Protégée, mais cela ne m'arrange pas car j'ai quand-même besoin de ces Shapes et Zones de texte.

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 12
    Points : 6
    Points
    6
    Par défaut Problème résolu !
    Pas la peine de chercher Midi à 14 h:
    Pour supprimer toutes les zones de texte, images, etc. sans en connaître le nom ou numéro, etc :
    ActiveSheet.DrawingObjects.Delete (trouvé simplement avec l'enregistreur de Macro, quelle honte...)

    Bref, problème résolu, même si je ne trouve pas logique que le fait de supprimer une feuille dans une procédure déclenchée par un UserForm (en affichage non Modal) arrête l'affichage de celui-ci...

    En plus, j'ai testé (Excel 2002) : C'est bien la suppression de n'importe quelle feuille.
    Pas nécessairement celle qui est active au moment où le Userform est affiché pour la première fois.

  10. #10
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 537
    Points
    5 537
    Par défaut
    Bonjour, Frutchy,

    Je ne suis pas certain d'avoir tout compris...
    Mais si j'ai compris l'essentiel, je ne vais pas non plus chercher midi à 14 heures...

    Et me contenter de ceci :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    'tout en haut de ta page de code du UserForm
    Private Declare Sub SetWindowPos Lib "user32" (ByVal hWnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long)
    Private Declare Function GetForegroundWindow Lib "user32" () As Long
     
    'et dans la section des procédures
    Private Sub UserForm_Activate()
      SetWindowPos GetForegroundWindow, -1, 0, 0, 0, 0, &H10 Or &H40 Or &H2 Or &H1
    End Sub
    Et je doute qu'il ne reste ainsi pas affiché en dépit de toutes les manoeuvres...

  11. #11
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 124
    Points : 55 921
    Points
    55 921
    Billets dans le blog
    131
    Par défaut
    Salut.

    Sur mon XL2003, je n'ai aucun problème pour laisser affiché un userform non modal, quelque soit l'action réalisée par code ou manuellement (feuille: suppression, déplacement, ajout, modification du nom, ...)

  12. #12
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 12
    Points : 6
    Points
    6
    Par défaut En réponse à Pierre Fauconnier et Ucfoutu (qui en dit long !)
    Bonsoir,

    Je viens de tester le code d'Ucfoutu. Le début du code de ma Userform est donc comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Private Declare Sub SetWindowPos Lib "user32" (ByVal hWnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long)
    Private Declare Function GetForegroundWindow Lib "user32" () As Long
    Private Sub UserForm_Activate()
      SetWindowPos GetForegroundWindow, -1, 0, 0, 0, 0, &H10 Or &H40 Or &H2 Or &H1
    End Sub
    Private Sub CommandButton1_Click()
    Initialiserold
    End Sub
    J'ai préféré le publier car pour moi ce type de code est du chinois.
    Et ma procédure Initialiserold fait toujours disparaître le Userform dès que j'y active la suppression d'une feuille.
    Hélas, aucun changement donc...
    Je crains que la piste de Pierre soit la bonne :
    Il s'agit bel et bien d'un bug d'EXCEL 2002 (et ce n'est pas le premier auquel je me heurte...).
    Il paraît en effet pas normal qu'une fenêtre reste au disparaisse selon que la procédure appelée supprime une feuille ou pas...
    Merci pour vos lumières !

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 12
    Points : 14
    Points
    14
    Par défaut
    J'ai eu le même problème avec un userform dont le showmodal était à FALSE.

    J'ai réglé le problème en terminant ma procédure ainsi.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    unload userform3
    load userform2
    userform2.show vbmodal = false

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

Discussions similaires

  1. [XL-2007] Userform non-modal & Accès au modèle objet du projet VBA
    Par JackIsJack dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 08/06/2010, 10h23
  2. [XL-2007] Userform non modale vide !
    Par Gloubi99 dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 14/04/2010, 18h40
  3. Pb référence / userform non-modal
    Par DARKALANE dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 01/09/2009, 21h03
  4. [Toutes versions] Userform non modal = plantage d'excel
    Par youn1096 dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 14/05/2009, 16h39
  5. UserForm non modal mais arrêtant la macro
    Par oohcalme dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 28/11/2008, 11h11

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