Pb excel : la feuille ne reste pas caché

Résolu
Messages postés
34
Date d'inscription
mardi 29 avril 2003
Statut
Membre
Dernière intervention
19 juillet 2010
-
Messages postés
792
Date d'inscription
vendredi 4 mars 2005
Statut
Membre
Dernière intervention
12 juin 2012
-
Bonjour à tous,

voilà mon problème, Je développe une application où l'utlisateur
sélectionnera un classeur excel avec une vingtaine de feuille contenant
des chiffres. Le programme ouvre le fichier en caché ( Dans mon appli,
j'ai mis appExcel.visible = false), lit les feuilles et insere dans la
BDD. Ce qui se passe très bien mais met un peu de temps(environ 6000
chiffre à lire). Lors de test, pour patienter, je voulus ouvrir une
autre feuille excel, Hors le fichier excel qui est lu apparaît.
Quelqu'un connaît il le moyen que celui ci reste caché?

Merci d'avance.

16 réponses

Messages postés
792
Date d'inscription
vendredi 4 mars 2005
Statut
Membre
Dernière intervention
12 juin 2012
5
Salut 93255 Xiotos,

pas de problème (surtout pas avec ceux qui reviennent de vacances:) ),

essaies cet exemple, il reprend les parties de ton code liées à l'instanciation d'Excel, et du classeur Import, il déplace la déclaration de l'application en lui ajoutant un hanler d'évènements, et ajoute une déclaration de référence à la fenêtre du classeur.
Il modifie aussi un peu la façon de lier les instances, mais c'est documenté dans le code :

Private WithEvents appExcel As Excel.Application 'avec les évènements
Private wnImport As Excel.Window 'une référence à la fenêtre du classeur



Private
Sub appExcel_WindowActivate(ByVal Wb As Excel.Workbook, ByVal Wn As Excel.Window)
    'si la fenêtre qui vient de s'activer
    'est celle de notre classeur
    If Wb.Name = "Import.xls" Then
        'récupère une référence à la fenêtre
        Set wnImport = Wn
        'rend la fenêtre invisible
        wnImport.Visible = False
    End If
End Sub



Private Sub appExcel_WorkbookBeforeClose(ByVal Wb As Excel.Workbook, Cancel As Boolean)
    'si le classeur sur le point d'être fermé
    'est notre classeur
    If Wb.Name = "Import.xls" Then
        'rend la fenêtre visible
        wnImport.Visible = True
        'libère la référence
        Set wnImport = Nothing
    End If
End Sub



Private Sub Command1_Click()
    'Dim appExcel        As Excel.Application 'désactivée
    Dim I                      As Integer
    Dim J                     As Integer
    Dim wbExcel         As Excel.Workbook
    Dim wsExcel         As Excel.Worksheet
    'instancie Excel
    Set appExcel = New Excel.Application
    'invisible
    appExcel.Visible = True
    'ouvre le classeur et en garde la référence
    Set wbExcel = appExcel.Workbooks.Open(App.Path & "\Import.xls")
    'j'ai corrigé ce que tu as écris (qui n'est pas faux)
    'mais tant qu'à conserver une référence au classeur
    'nouvellement ouvert, autant l'utiliser
    '(toi, tu retournais chercher une référence au classeur
    'actif dans l'application, ce n'est pas faux, mais
    'ce n'est pas correct non plus).
    Set wsExcel = wbExcel.Worksheets(1)
   
    'le corps, je n'y touche pas
    '...
   
    '...
    'on libère la référence à la feuille
    Set wsExcel = Nothing
    'on ferme le classeur
    'en prenant soin de l'argument qui force l'enregistement
    wbExcel.Close False 'ou true, c'est selon ton besoin
    'ensuite on libère la référence 
    Set wbExcel = Nothing
   
    'et, ici, je t'invite à vérifier qu'il n'y a pas
    'd'autres classeurs ouverts pour quitter (des classeurs
    'ouverts par l'utilisateur qui patiente pendant le
    'traitement import, mais qui ne veut pas pour autant
    'qu'on lui ferme Excel au nez)
    If appExcel.Workbooks.Count = 0 Then
        'pour pouvoir quitter Excel
        appExcel.Quit
    End If
    'dans tous les cas, on libère la référence
    Set appExcel = Nothing
End Sub

voilà, qu'en penses-tu?
à+






rvblog<sup>n
Je veux ton bien....et je l'aurais....mieux vaut tard...que trop tard!</sup>
Messages postés
6786
Date d'inscription
vendredi 16 décembre 2005
Statut
Membre
Dernière intervention
21 décembre 2011
18
Salut,

"Lors de test, pour patienter, je voulus ouvrir une autre feuille excel"

>> pourquoi ne pas tout simplement utiliser un ProgressBar ou alors faire afficher un UserForm avec une animation (disant de patienter) ?

Enfin, c'est une idée comme ça en passant !

@++

<hr size="2" width="100%" />
  --Mortalino--
Le mystérieux chevalier, "Provençal, le Gaulois"
<!--
Messages postés
34
Date d'inscription
mardi 29 avril 2003
Statut
Membre
Dernière intervention
19 juillet 2010

Il y a un ProgressBas. La feuille que j'ai ouvert était un travail autre que le projet en attendant la fin des insertions.
Messages postés
6786
Date d'inscription
vendredi 16 décembre 2005
Statut
Membre
Dernière intervention
21 décembre 2011
18
Met je comprends pas trop !

Si tu es en vb6, tu fais tes imports de données d'excel, cache le fichier excel, fait appraitre via ton Projet VB6 le ProgressBar sur une Form, une fois terminé, ferme la Form contenant le Progress et fait réapparaitre le fichier excel.

Sinon, pour ouvrir excel, voit avant le CreateObject, d'utiliser un GetObject, histoire de savoir si excel était déjà lancé sur le poste de l'utilisateur.

@++

<hr size="2" width="100%" />
  --Mortalino--
Le mystérieux chevalier, "Provençal, le Gaulois"
<!--
Messages postés
34
Date d'inscription
mardi 29 avril 2003
Statut
Membre
Dernière intervention
19 juillet 2010

Je réexplique :


Dans mon projet :

J'ouvre la feuille excel (elle est caché)

Je fais mon import qui dure environ 2-3 minutes.


Si l'utilisateur lors de l'import, ouvre une feuille excel en
double-cliquant dessus dans l'explorer (N'importe quelle feuille excel
qui lui appartient).Il voit apparaître en plus de sa feuille excel, la
feuille excel que je suis en train d'importer.
Messages postés
6786
Date d'inscription
vendredi 16 décembre 2005
Statut
Membre
Dernière intervention
21 décembre 2011
18
Là je sais pas vraiment. En fait tu accèdes à un fichier déjà ouvert et utilisé.
Peut-être qu'avant ton import, tu devrais copier le fichier dans un répertoire temporaire, tu fais tes imports, et ensuite supprime le fichier !

C'est la seule solution que je vois.

@++

<hr size="2" width="100%" />
  --Mortalino--
Le mystérieux chevalier, "Provençal, le Gaulois"
<!--
Messages postés
34
Date d'inscription
mardi 29 avril 2003
Statut
Membre
Dernière intervention
19 juillet 2010

Oui mais dès qu'il ouvre une feuille excel, le fichier caché devient visible.
Messages postés
792
Date d'inscription
vendredi 4 mars 2005
Statut
Membre
Dernière intervention
12 juin 2012
5
Salut 93255 Xiotos, salut =647037 mortalino,

juste pour la route, quelle version d'Excel?

Si j'ai bien compris, via Automation, VB pilote Excel, pour lui faire ouvrir un classeur, récupérer les données contenues dans différentes feuilles de ce classeur, et les insérer dans une base de données dont nous tairons volontairement la marque (éditeur ToutPetitLogiciel ® peut-être).
Lorsqu'un utilisateur du poste veut utiliser (et c'est ce qu'il fait souvent de mieux, sauf quand il est aussi le développeur) Excel, pour ouvrir un classeur quelconque, Excel se rappelle que, avant de savoir se faire piloter par VB, tout en restant caché (quelle hulilité!), il avait aussi un métier qui consistait (en grande partie) à s'afficher modestement (non maisquelle hulilité, vraiment!),, en compagnie du-dit classeur (comme pour la photo, en somme, ..., photo, graphes, somme,...humour!).
Et comme c'est surtout pour ça qu'on le paie (ce cher Excel), il fait passer son vrai métier en priorité, donc il redevient visible, n'est-ce pas?

Si c'est le cas, il ne reste pas énormément de solution pour palier à cet affront :
1/. Comment faire un avenant au contrat d'Excel pour qu'il cesse, temporairement, son activité dans les relations publiques?

2/. Comment s'adresser directement aux saints d'Excel plutôt qu'à son Dieu, aussi loué soit-il, pour obtenir un miracle?

Si je développe tout de suite ces solutions, il surviendra 2 problèmes :
1/. Je ne suis pas du tout sûr que tu es encore intéressé (vu la date où je me pointe), et je risque fort de ne me parler qu'à (formule difficile, j'en conviens, mais j'aime les zigzags et les Pivot).

2/. Je risque aussi (et là c'est beaucoup plus dramatique) de réduire à peau de chagrin le fantastique suspens que j'ai réussi à développer jusque là, suspens qui, au passage, n'est pas dénudé d'un style hachement aiguisé qui ferait palir la plume de nombreux éditorialistes (VBAistes à leur temps perdu), et d'ainsi donc (encore plus pointu comme formule), délibéremment déstabiliser les, j'en suis sûr, nombreux lecteurs en les privant du 2ème épisode de la saga, maintenant mondialement connue, "Excel, gloire et beauté".

Alors, sont-ce des avatars de solutions? N'en existe-t-il aucune? N'en existe-t-il, Oh, qu'une?

Pour laisser parler rvblogn, tapez [1],
pour laisser encore 93255 Xiotos nous dire, en parlant de VB, des "oui mais"( :) ), tapez [2],
et pour laisser le glaive aussi puissant qu'aiguisé du Mystérieux Chevalier "Provençal, le Gaulois" trancher au plus vif ce débat, tapez [3] (non, tapez pas, c'est lui qui tape).

à bientôt, peut-être!

PS : =93255 Xiotos, ne prends mes betises comme une affaire personnelle, je ne suis pas méchant, je suis juste joueur parfois.
PS2 : Nix, désolé pour la longueur, mais tout ça fait partie des tests de charge demandés par ton hébergeur :)
PS3 : Mais quand vont-ils se décider à sortir la PS3? On attend!

rvblog<sup>n
Je veux ton bien....et je l'aurais....mieux vaut tard...que trop tard!</sup>
Messages postés
6786
Date d'inscription
vendredi 16 décembre 2005
Statut
Membre
Dernière intervention
21 décembre 2011
18
Salut, rvblogn,

Moi je tranche : la PS3 ne sors pas avant le premier trimestre 2007.
Elle a intérêt d'être parfaite, avec les temps de retard que nous patissons.

C'est que la page 4 ??
Beh il n'y a pas beaucoup de demande sur la forum alors !

@++

<hr width="100%" size="2" />
  --Mortalino--
Le mystérieux chevalier, "Provençal, le Gaulois"
/DIV>
Messages postés
34
Date d'inscription
mardi 29 avril 2003
Statut
Membre
Dernière intervention
19 juillet 2010

Salut rvblog<sup>n,


Si tu as un miracle voire une solution, je suis toujours prenant car
pour l'instant la seule que j'ai trouvé, c'est de mettre un message
disant à l'utilisateur de ne pas se servir d'excel pendant l'import des
données. Donc je decide de taper 1 afin de te laisser parler.

</sup>
Messages postés
792
Date d'inscription
vendredi 4 mars 2005
Statut
Membre
Dernière intervention
12 juin 2012
5
Salut Xiotos,

merci d'avoir entretenu le suspens!

mais là tout de suite, faut qu'j'm'occupe de mon fiston, donc je rajoute un peu de suspens (disons une grosse page de pub), et je reviens d'ici 1 heure ou 2.

PS : et puisqu'on (je) parle de pub, profites-en, si tu as le temps, pour surfer un peu sur le site, y'a des endroits excellents (je te conseille les menus livres, divers [livre d'or] et téléchargements, et bien sûr les forums:) )

ad'taleur

rvblog<sup>n
Je veux ton bien....et je l'aurais....mieux vaut tard...que trop tard!</sup>
Messages postés
792
Date d'inscription
vendredi 4 mars 2005
Statut
Membre
Dernière intervention
12 juin 2012
5
Me revoilà  Xiotos,

je savais bien que tu étais encore dans l'attente (en camping), c'est un problème simple, et tout le monde ne se bagarre pas pour le résoudre. J'ai déjà rencontré ces problèmes, mais je n'ai pas de solution toute faite.

Par contre, je suis du genre engagé (t'as qu'à voir mes anciens messages), et je prends engagement, ici, à faire le maximum pour trouver une solution avec toi .

J'invite aussi n'importe qui, qui lira le fil de ce topic, à apporter de l'eau au moulin (voire même le moulin, s'il l'a).

il me faut, pour être efficace, quelques informations :
- ta version d'Excel
- confirmation du codage sous VB6
- un échantillon de la façon dont tu instancies Excel (déclaration de variables, création de l'objet, manipulation de classeurs, et récupération des données), j'ai bien dit échantillon, pas tout.

à+
rvblog<sup>n
Je veux ton bien....et je l'aurais....mieux vaut tard...que trop tard!</sup>
Messages postés
792
Date d'inscription
vendredi 4 mars 2005
Statut
Membre
Dernière intervention
12 juin 2012
5
Salut Xiotos,

je veux bien m'engager, mais l'engagement est réciproque! Fini les belles phrases (les miennes), il faut du sérieux, et ça commence là :

il me faut, pour être efficace, quelques informations :
- ta version d'Excel
- confirmation du codage sous VB6
- un échantillon de la façon dont tu instancies Excel (déclaration de variables, création de l'objet, manipulation de classeurs, et récupération des données), j'ai bien dit échantillon, pas tout.

à+

rvblog<sup>n
Je veux ton bien....et je l'aurais....mieux vaut tard...que trop tard!</sup>
Messages postés
34
Date d'inscription
mardi 29 avril 2003
Statut
Membre
Dernière intervention
19 juillet 2010

Salut rvblog<sup>n

</sup>Désolé du temps de réponse mais j'étais en vacances.

Donc voici un morceau de code sachant que je code en VB6 et que j'ai microsoft excel 2003. J'espère que cela pourra t'aider.

  
    Dim appExcel        As Excel.Application

    Dim
I             
        As Integer

    Dim
J             
       As Integer

    Dim wbExcel         As Excel.Workbook

    Dim wsExcel         As Excel.Worksheet

    FileCopy NomFichier, App.Path & "\Import.xls"

    Set appExcel = New Excel.Application

    appExcel.Visible = False

    Set wbExcel = appExcel.Workbooks.Open(App.Path & "\Import.xls")

    Set wsExcel = appExcel.ActiveWorkbook.Worksheets(1)

    wbExcel.Application.EnableAutoComplete = False

    NbFeuille = appExcel.ActiveWorkbook.Worksheets.Count

    cn.BeginTrans

   

    For FeuilleActuelle = 2 To NbFeuille

        Set wsExcel = Nothing

        Set wsExcel = appExcel.ActiveWorkbook.Worksheets(FeuilleActuelle)

        If appExcel.ActiveWorkbook.Worksheets(FeuilleActuelle).Name = Bop Then
          ''Ici plein de requète

           NumBop =
RechercheBOP(appExcel.ActiveWorkbook.Worksheets(FeuilleActuelle).Name)

           If Not EffacePrevoirSolde(NumBop) Then

               GoTo FinExcel

           End If

           If wsExcel.Cells(J, 4).Value = "Taux C" Then

               Effectif = CInt(wsExcel.Cells(J, I).Value)

                CatPers = 1

                NumRef = 910

           End If

       End If

    Next FeuilleActuelle


    Set wsExcel = Nothing

    wbExcel.Close

    Set wbExcel = Nothing

    appExcel.Quit

    Set appExcel = Nothing

Merci d'avance pour ton aide.
Messages postés
34
Date d'inscription
mardi 29 avril 2003
Statut
Membre
Dernière intervention
19 juillet 2010

Salut rvblog<sup>n,

J'ai essayé ton code et
là, un miracle c'est produit, ma page n'apparait plus lors de
l'ouverture d'excel. Je te remercie, oh toi,  grand seigneur de VB6 et
serai toujours la pour toi afin de taper 1 et te laisser parler.


Merci encore mille fois de m'avoir aider.

</sup>Xiotos

Messages postés
792
Date d'inscription
vendredi 4 mars 2005
Statut
Membre
Dernière intervention
12 juin 2012
5
Je t'en prie mon brave, relèves-toi :)

à+

PS: quelques améliorations restent possibles
rvblog<sup>n
Je veux ton bien....et je l'aurais....mieux vaut tard...que trop tard!</sup>