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 :

vba - Excel invisible et userform visible


Sujet :

Macros et VBA Excel

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    306
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 306
    Points : 164
    Points
    164
    Par défaut vba - Excel invisible et userform visible
    Bonjour,

    Je rencontre un problème d'affichage un peu particulier qu j'aimerais vous soumettre :

    J'ai une macro enregistrée dans un fichier Excel.
    Elle est appelée par une application (.exe) et récupère des infos dans plusieurs fichiers excel puis les formate dans ppt.

    Le but est de masquer Excel tout au long de la procédure tout en laissant s'afficher des userforms successifs permettant à l'utilisateur de faire des choix.

    Cela fonctionne très bien sauf si un document Excel (qui n'a rien à voir, peu importe lequel) est déjà ouvert : tout se passe bien lors d'un premier appel, mais un deuxième appel de la macro via l'appli masque les userform.

    Je ne comprends pas pourquoi cela fonctionne une fois mais pas 2.

    Voici le code :

    Début :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub Info(expfile As String)
     
    Application.Visible = False
     
    Set ExpBk = Workbooks.Open(expfile)
    Set ExpSht = ExpBk.Worksheets(1)

    Fin :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    For Each Wbk In Workbooks
        If Wbk.FullName = "Blabla" Then Wbk.Close savechanges:=False
    Next Wbk
    ExpBk.Close savechanges:=False
     
    Application.Visible = True
    Application.ScreenUpdating = True
     
    End Sub
    A noter que lorsque (dans le deuxième appel) je fais Alt+Tab pour voir apparaitre les userforms, ils fonctionnent mais restent tous affichés à l'écran ( l'un derrière l'autre) alors que d'ordinaire ils doivent disparaitre avant que le suivant n'apparaissent :

    Code de fin de chaque userform :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Private Sub OKLabel_Click()
     
    '...
    '...
     
    Application.ScreenUpdating = True
    Unload Me
    DoEvents
    Application.ScreenUpdating = False
     
    Call VérifFichiers
     
    End Sub


    Merci beaucoup.

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    306
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 306
    Points : 164
    Points
    164
    Par défaut
    Pour simplifier mon propos, voici mon code réduit à sa plus simple expression :

    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
    Sub Info(expfile As String)
     
    Dim ExpBk As Workbook, wbk As Workbook, ExpSht As Worksheet, StrPath As String
     
     
    Application.Visible = False
     
    Set ExpBk = Workbooks.Open(expfile)
    Set ExpSht = ExpBk.Worksheets(1)
     
    Form1.Show
    Form2.Show
    Form3.Show
     
    ExpBk.Close savechanges:=False
     
    Application.Visible = True
    Application.ScreenUpdating = True
     
    End Sub
    Les 3 userforms sont basiquissimes et ont tous pour code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Private Sub OkLabel_Click()
     
    Application.ScreenUpdating = True
    Unload Me
    DoEvents
    Application.ScreenUpdating = False
     
    End Sub
    Encore merci.

  3. #3
    Membre éprouvé
    Avatar de fred65200
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    901
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 901
    Points : 1 207
    Points
    1 207
    Par défaut
    bonjour,

    essaie d'appeler le Userform2 à la fermeture du Userform1, le Userform3 à la fermeture du Userform2

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub OkLabel_Click()
     
    Application.ScreenUpdating = True
    Me.Hide
    UserForm2.Show
    Unload UserForm1
    DoEvents
    Application.ScreenUpdating = False
     
    End Sub
    cordialement

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    306
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 306
    Points : 164
    Points
    164
    Par défaut
    Merci pour cette réponse.
    Mais je ne suis pas sur que cela résolve le problème du masquage du premier userform...

    Quelle est selon toi la différence entre le premier appel qui fonctionne et le second qui ne fonctionne plus ?

    Indice : si entre le premier appel de la macro et le second, je "réouvre" à la main le fichier excel (celui déjà ouvert et qui n'a aucun rapport), cela fonctionne de nouveau convenablement...

  5. #5
    Membre éprouvé
    Avatar de fred65200
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    901
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 901
    Points : 1 207
    Points
    1 207
    Par défaut
    re

    je ne sais pas comment tu ouvres Excel, peut être qu'avec la fonction GetObject, cela solutionnera ton problème.

    Un exemple tiré de l'aide (F1)
    Cet exemple utilise la fonction GetObject pour obtenir une référence à une feuille de calcul Microsoft Excel spécifique (MyXL). Il utilise la propriété Application de la feuille de calcul pour rendre Microsoft Excel visible, pour fermer l'application, etc. Le premier appel à la fonction GetObject entraîne une erreur si Microsoft Excel n'est pas déjà en exécution. Dans notre exemple, l'erreur a pour conséquence d'attribuer la valeur True à l'indicateur ExcelWasNotRunning. Le deuxième appel à la fonction GetObject indique le fichier à ouvrir. Si Microsoft Excel n'est pas déjà en exécution, le deuxième appel lance l'application et renvoie une référence à la feuille de calcul représentée par le fichier indiqué, montest.xls. Ce fichier doit se trouver à l'emplacement spécifié ; dans le cas contraire, l'erreur Erreur Automation Visual Basic est générée. L'exemple de code rend ensuite Microsoft Excel et la fenêtre contenant la feuille de calcul indiquée visibles. Enfin, si Microsoft Excel n'était pas en exécution précédemment, le code utilise la méthode Quit de l'objet Application pour fermer Microsoft Excel. Si l'application était déjà en exécution, le code ne tente pas de la fermer. La référence elle-même est libérée en recevant la valeur Nothing.
    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
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    ' Déclare les routines d'API nécessaires:
    Declare Function FindWindow Lib "user32" Alias _
    "FindWindowA" (ByVal lpClassName as String, _
                        ByVal lpWindowName As Long) As Long
    
    Declare Function SendMessage Lib "user32" Alias _
    "SendMessageA" (ByVal hWnd as Long,ByVal wMsg as Long, _
                        ByVal wParam as Long, _
                        ByVal lParam As Long) As Long
    
    Sub GetExcel()
    Dim MyXL As Object    ' Variable devant contenir la
                                ' référence à Microsoft Excel.
    Dim ExcelWasNotRunning As Boolean    ' Indicateur de libération finale.
    
    ' Test pour déterminer si une copie de Microsoft Excel
    ' est déjà en exécution.
    On Error Resume Next    ' Retarde la récupération d'erreur.
    ' La fonction Getobject appelée sans le premier
    ' argument renvoie une référence à une instance de
    ' l'application. Si l'application n'est pas en
    ' exécution, une erreur se produit.
    Set MyXL = Getobject(, "Excel.Application")
    If Err.Number <> 0 Then ExcelWasNotRunning = True
    Err.Clear     ' Efface l'objet Err si une erreur s'est produite.
    
    ' Vérifie si Microsoft Excel est en exécution.
    ' Dans ce cas, l'ajoute à la table Running Object.
    DetectExcel
    
    ' Définit la variable objet faisant référence au fichier à ouvrir.
    Set MyXL = Getobject("c:\vb5\MONTEST.XLS")'adapte le chemin
    
    ' Affiche Microsoft Excel par l'intermédiaire de sa
    ' propriété Application. Affiche ensuite la fenêtre
    ' contenant le fichier à l'aide de la collection
    ' Windows de la référence à l'objet MyXL.
    MyXL.Application.Visible = True  'Mets False ici
    MyXL.Parent.Windows(1).Visible = True 'et là
        ' Effectue des opérations sur votre
         ' fichier ici.
        ' ...
    ' Si cette copie de Microsoft Excel n'était pas en cours
    ' d'exécution lorsque vous avez commencé, fermez-la
    ' à l'aide de la méthode Quit de la propriété
    ' Application.
    ' Notez que si vous tentez de quitter Microsoft Excel,
    ' la barre de titre clignote et un message s'affiche
    ' vous demandant si vous souhaitez enregistrer les
    ' fichiers chargés.
    If ExcelWasNotRunning = True Then
        MyXL.Application.Quit
    End IF
    
    Set MyXL = Nothing  ' Libère la référence à l'application
                              ' et à la feuille de calcul.
    End Sub
    
    Sub DetectExcel()
    ' La procédure détecte une instance d'Excel en
    ' exécution et l'inscrit.
        Const WM_USER = 1024
        Dim hWnd As Long
    ' Si Excel est en exécution, cet appel d'API renvoie
    ' son descripteur.
        hWnd = FindWindow("XLMAIN", 0)
        If hWnd = 0 Then    ' 0 signifie qu'Excel n'était
                                ' pas en exécution.
            Exit Sub
        Else
        ' Excel est en exécution, donc utilise la fonction
        ' d'API SendMessage pour l'entrer dans la table
        ' Running Object.
            SendMessage hWnd, WM_USER + 18, 0, 0
        End If
    End Sub
    cordialement

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    306
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 306
    Points : 164
    Points
    164
    Par défaut
    Merci beaucoup pour ces explications.
    Je vais tester ca.

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    306
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 306
    Points : 164
    Points
    164
    Par défaut
    Alors, j'ai trouvé une solution un peu sale mais qui fonctionne bien :


    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
    Sub Info(expfile As String)
     
    Dim ExpBk As Workbook, ExpSht As Worksheet
     
    Application.ScreenUpdating = False
    Set ExpBk = GetObject(expfile)
    Set ExpSht = ExpBk.Worksheets(1)
     
     
    Application.WindowState = xlMinimized
    'Si on ner met pas Minimized ET maximized ca ne marche pas...
    Application.WindowState = xlMaximized
     
    Application.Visible = False
     
    Form1.Show
    Form2.Show
     
    ExpBk.Close savechanges:=False
     
     
    Application.Visible = True
    Application.WindowState = xlMinimized
    Application.ScreenUpdating = True
     
    End Sub
    c'est moche...

  8. #8
    Membre éprouvé
    Avatar de fred65200
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    901
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 901
    Points : 1 207
    Points
    1 207
    Par défaut
    re

    si tu places ce code, est ce que ça t'évite les yoyos de fenêtre?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ExpBk.Application.Visible = False
    ExpBk.Parent.Windows(1).Visible = False
    cordialement

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    306
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 306
    Points : 164
    Points
    164
    Par défaut
    J'y ai bien cru une seconde...
    Toujours pareil : ca fonctionne au premier appel, au second, le userform reste bloqué dans Excel (et donc reste masqué).

    Merci anyway.

  10. #10
    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
    j avais eu ce genre de pb , je voulais ouvrir un userform sans voir l "affichage"
    xl.
    je suis passé par un script vbs
    essaye toujours!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Set xl = WScript.CreateObject("excel.Application") 
    xl.visible=false
    xl.workbooks.open("C:\Documents and Settings\PAT\Mes documents\loto.xls")

Discussions similaires

  1. Contribution codes VBA Excel : Pour vos UserForm
    Par Zandar dans le forum Contribuez
    Réponses: 0
    Dernier message: 01/03/2008, 17h11
  2. [VBA Excel] Pb de userform
    Par diplax dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 08/12/2007, 18h47
  3. vba[Excel 2003]Problème userform
    Par stargates dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 07/07/2007, 15h15
  4. [VBA Excel] Lien entre userforms
    Par violette_china dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 27/11/2006, 02h21
  5. [VBA EXCEL] Réduire/Agrandir UserForms
    Par Fench dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 06/11/2003, 16h02

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