maxxyme
Messages postés16Date d'inscriptionlundi 15 décembre 2003StatutMembreDernière intervention 1 mai 2014
-
20 sept. 2006 à 11:37
rvblog
Messages postés792Date d'inscriptionvendredi 4 mars 2005StatutMembreDernière intervention12 juin 2012
-
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" !!!
cs_MPi
Messages postés3877Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention17 août 201823 21 sept. 2006 à 00:23
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...)
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>
maxxyme
Messages postés16Date d'inscriptionlundi 15 décembre 2003StatutMembreDernière intervention 1 mai 2014 20 sept. 2006 à 13:43
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...
Vous n’avez pas trouvé la réponse que vous recherchez ?
drikce06
Messages postés2236Date d'inscriptionlundi 29 mai 2006StatutMembreDernière intervention29 mai 200810 20 sept. 2006 à 13:53
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!
drikce06
Messages postés2236Date d'inscriptionlundi 29 mai 2006StatutMembreDernière intervention29 mai 200810 20 sept. 2006 à 13:55
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é!
maxxyme
Messages postés16Date d'inscriptionlundi 15 décembre 2003StatutMembreDernière intervention 1 mai 2014 20 sept. 2006 à 15:56
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.
drikce06
Messages postés2236Date d'inscriptionlundi 29 mai 2006StatutMembreDernière intervention29 mai 200810 20 sept. 2006 à 16:09
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.