Ouvrir un classeur Excel par macro sans l'afficher [Résolu]

maxxyme 16 Messages postés lundi 15 décembre 2003Date d'inscription 1 mai 2014 Dernière intervention - 20 sept. 2006 à 11:37 - Dernière réponse : rvblog 794 Messages postés vendredi 4 mars 2005Date d'inscription 12 juin 2012 Dernière intervention
- 25 sept. 2006 à 18:31
Bonjour !

Je m'explique, je travaille sur une macro qui fait de la mise en forme sur un fichier CSV, que j'ouvre via le code suivant :




    Dim vFilename As Variant, oJournalWorkbook As Workbook
    vFilename = Application.GetOpenFilename("Fichiers CSV (*.csv), *.csv")
    If (vFilename = False) Then
        Exit Function
    Else
        Set oJournalWorkbook = Application.Workbooks.Open(vFilename)
        If (oJournalWorkbook Is Nothing) Then
            Exit Function
        End If
    End If

La suite du traitement (extraction de données) se fait à partir de la variable oJournalWorkbook qui permet de référencer directement les plages de cellules sans passer par les ActiveSheet / ActiveWorkbook etc...

Le "problème" est qu'en fait, lorsque j'ouvre le classeur (avec Workbooks.Open) le classeur est placé au premier plan, ce que je ne souhaite pas (inutilité, et je n'ai pas non plus envie que l'utilisateur voit les transformations qui sont faites sur le fichier).

Mais comment faire pour "cacher" le classeur qu'on vient d'ouvrir ???
Je sais par ex. qu'il existe la méthode "Workbook.Activate" qui permet justement d'afficher un classeur au 1er plan, mais je cherche plutôt à faire l'inverse...
D'ailleurs, le fichier de macros persos (PERSO.XLS la plupart du temps), il est ouvert en mode... "cache" !!!

Merci d'avance...
Afficher la suite 

12 réponses

Répondre au sujet
cs_MPi 3863 Messages postés mardi 19 mars 2002Date d'inscription 13 mars 2018 Dernière intervention - 21 sept. 2006 à 00:23
+3
Utile
Et si tu procédais comme on fait à partir de VB ?

Tu crées une instance d'Excel à part. Tu ne verras donc pas le classeur
dans le menu Fenêtre de ton application. Il faudra tout de même
spécifier xlBook ou xlSheet pour que le programme comprenne de quelle
cellule on parle ou de quelle feuille, classeur...


Option Explicit  

Dim xlApp As New Excel.Application  ' déclarer Public si dans un module

Dim xlBook As New Excel.Workbook

Dim xlSheet As New Excel.Worksheet


Sub MaSub()

  

'Ouvrir le classeur dont on a besoin avec tout le chemin...

    Set xlBook = xlApp.Workbooks.Open("LeNomDeTonFichier.xls")

    Set xlSheet = xlBook.Sheets("Feuil1")  ' si on veut utiliser une feuille en particulier

   

'Pour vérifier que tout fonctionne bien

    MsgBox xlSheet.Range("C8")

'si on ne spécifie pas de feuille

'    MsgBox xlBook.Activesheet.Range("C8")

' ou MsgBox xlBook.Sheets("Feuil1").Range("C8")

   

'Important en quittant le programme ou quand on n'en a plus besoin (pas nécessairement ici...)

    xlBook.Close

    xlApp.Quit

    Set xlSheet = Nothing

    Set xlBook = Nothing

    Set xlApp = Nothing


End Sub

MPi
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_MPi
rvblog 794 Messages postés vendredi 4 mars 2005Date d'inscription 12 juin 2012 Dernière intervention - 25 sept. 2006 à 18:31
+3
Utile
Salut 432827 maxxyme, salut =89254 jrivet, salut 786090 Drikce06, salut =6078 MPi,

en déclarant une référence à l'application (avec handler d'évènements), tu peux récupérer les évènements de fenêtre et de classeurs.
Il semblerait que le 1er évènement à survenir soit _WorkbookOpen(Byval WB As Workbook), et ce avant l'évènement _WindowActivate ou _WindowDeactivate !

Conclusion, tu ne peux pas cacher la fenêtre avant d'ouvrir le classeur (ça tu le savais), mais même si la 1ère chose que tu fais, dès que tu es au courant que le classeur s'ouvre, est de cacher la fenêtre (ou autre chose), il est trop tard, et tu obtiens le sus-dit scintillement.

Pas de solution? En faisant comme je te l'indique (ou autrement d'ailleurs), tu peux, avant de commander l'ouverture du classeur, rendre l'application (de qui tu as une référence) invisible, puis visible après le chargement (juste le chargement, pas le traitement), tu as toujours le scintillement, mais en aucun cas l'utilisateur ne voit de quel fichier il s'agit (il ne voit même pas que tu as chargé un fichier).

à+

PS : ceci dit, le scintillment, il faut de bons yeux pour l'exploiter!

rvblog<sup>n
Je veux ton bien....et je l'aurais....mieux vaut tard...que trop tard!</sup>
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de rvblog
jrivet 7401 Messages postés mercredi 23 avril 2003Date d'inscription 6 avril 2012 Dernière intervention - 20 sept. 2006 à 12:08
0
Utile
Salut,




oJournalWorkbook.Visible = False ne regle pas ton problème?

Sinon essaie Application.Visible = False






@+,   Ju£i?n
Commenter la réponse de jrivet
maxxyme 16 Messages postés lundi 15 décembre 2003Date d'inscription 1 mai 2014 Dernière intervention - 20 sept. 2006 à 13:43
0
Utile
La propriété Visible n'existe pas pour l'objet Workbook.

J'ai cherché un petit peu plus, et la seule chose que j'ai trouvé (en rapport avec l'histoire du classeur "PERSO"), c'est de cacher la (première) fenêtre du classeur en question, en faisant un truc du genre :

    ' Récupération de la première fenêtre du classeur et masquage
    Dim oWindow As Window
    On Error Resume Next
    Set oWindow = oJournalWorkbook. Windows(1)
    On Error GoTo 0
    If (oWindow Is Nothing) Then
        Exit Function
    End If
    oWindow.Visible = False

Il ne faut juste pas que j'oublie de remettre True avant de fermer le classeur sinon quand on voudra le consulter, rien ne sera affiché.
Le seul hic avec ça, c'est que la feuille de classeur apparaît pendant toute


juste



une fraction de seconde à l'ouverture...
Commenter la réponse de maxxyme
drikce06 2247 Messages postés lundi 29 mai 2006Date d'inscription 29 mai 2008 Dernière intervention - 20 sept. 2006 à 13:53
0
Utile
Salut! Ce que dit jrivet c'est que application.visible=false te cache excel! Il te reste juste ton form! Par contre quand tu quittes fais attention à fermer le processus!

 Drikce 06
Commenter la réponse de drikce06
drikce06 2247 Messages postés lundi 29 mai 2006Date d'inscription 29 mai 2008 Dernière intervention - 20 sept. 2006 à 13:55
0
Utile
Ou sinon autre solution tu affiche ton form sur une page vierge tu cache toutes les autres, tu desactive la mise à jour de l'affichage et l'utilisateur ne vera pas le traitement effectué!

 Drikce 06
Commenter la réponse de drikce06
jrivet 7401 Messages postés mercredi 23 avril 2003Date d'inscription 6 avril 2012 Dernière intervention - 20 sept. 2006 à 14:13
0
Utile
Salut,


Desole pour le Visible de l'objet WorkBook.
Tu peux peu etre essayer Application.ScreenUpdating = False






@+,   Ju£i?n
Commenter la réponse de jrivet
maxxyme 16 Messages postés lundi 15 décembre 2003Date d'inscription 1 mai 2014 Dernière intervention - 20 sept. 2006 à 15:56
0
Utile
Drikce06, de quel "form" veux-tu parler ??

De plus j'ai essayé Application.Visible = True (



qui "cache Excel")



mais ce n'est pas ce que je veux : je veux justement qu'Excel continue à être affiché étant donné que le code VB que je donne plus haut est inclus dans une Macro qui est elle-même appelée par un bouton d'une barre d'outils personnalisée.
Commenter la réponse de maxxyme
drikce06 2247 Messages postés lundi 29 mai 2006Date d'inscription 29 mai 2008 Dernière intervention - 20 sept. 2006 à 16:09
0
Utile
Ah d'accord! T'as pas de form! Donc quand tu ouvre ton classeur c'est la feuille avec le bouton qui s'affiche? Si oui, dans l'évenement click du bouton tu met au début Application.Visible = False et à la fin Application.Visible = True.

 Drikce 06
Commenter la réponse de drikce06
jrivet 7401 Messages postés mercredi 23 avril 2003Date d'inscription 6 avril 2012 Dernière intervention - 20 sept. 2006 à 16:25
0
Utile
Salut,
Essaie ceci alors peu etre que cela règelera le problème

Set oJournalWorkbook = Application. Workbooks.Open (vFilename)
oJournalWorkbook.Activate
ActiveWindow.WindowState = xlMinimized

@+,   Ju£i?n
Commenter la réponse de jrivet
maxxyme 16 Messages postés lundi 15 décembre 2003Date d'inscription 1 mai 2014 Dernière intervention - 21 sept. 2006 à 12:35
0
Utile
Ah pas bête ça, créer tout dans une autre application...
Je vais regarder ça plus, car ce n'est pas (encore) une priorité absolue...
Merci à vous !!
Commenter la réponse de maxxyme
maxxyme 16 Messages postés lundi 15 décembre 2003Date d'inscription 1 mai 2014 Dernière intervention - 21 sept. 2006 à 12:37
0
Utile
(plus tard, je voulais dire... ;-)
Commenter la réponse de maxxyme

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.