Problème de visibilité à l'ouverture d'Excel sous VB6

Signaler
Messages postés
11
Date d'inscription
vendredi 5 février 2010
Statut
Membre
Dernière intervention
1 juin 2010
-
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
-
Bonjour à tous, avec vb je souhaiterai ouvrir un fichier précit Excel en cliquant sur des boutons. Mais j'aimerai aussi si ce fichier est deja ouvert, qu'en cliquant sur les boutons, il me renvoit simplement à la feuille concernée. Chaque boutons correspond à une feuille de mon fichier.
Le pb c'est qu'à l'exécution, mon fichier Excel n'est pas visible mais dans le gestionnaire de taches Excel se lance bien. pourriez vous m'aider svp ?

Voici le code:
en module :
Public appExcel As Excel.Application
Public wbExcel As Excel.Workbook 'Classeur Excel
Public wsExcel As Excel.Worksheet 'Feuille Excel
Public MyXl As Object


dans mon form :
Private Sub Command1_Click(Index As Integer)
 
On Error Resume Next
Set MyXl = GetObject("C:\Documents and Settings\Administrateur\Bureau\TDB_liaison.xls")
If Err.Number <> 0 Then
Application.DisplayAlerts = False
Set appExcel = CreateObject("Excel.Application")
Set wbExcel = appExcel.Workbooks.Open("C:\Documents and Settings\Administrateur\Bureau\TDB_liaison.xls")
appExcel.Visible = True
'wsExcel correspond à la première feuille du fichier
Set wsExcel = wbExcel.Worksheets("Production hebdo")
wsExcel.Activate
Application.DisplayAlerts = True
Else
Set wsExcel = wbExcel.Worksheets("Production hebdo")
wsExcel.Activate
End If
End Sub

9 réponses

Messages postés
149
Date d'inscription
lundi 24 décembre 2007
Statut
Membre
Dernière intervention
16 juillet 2013
2
Bonjour tu as essayé 'appExcel.Visible = True'
Messages postés
11
Date d'inscription
vendredi 5 février 2010
Statut
Membre
Dernière intervention
1 juin 2010

Bonjour, oui juste là
Set wbExcel = appExcel.Workbooks.Open("C:\Documents and Settings\Administrateur\Bureau\TDB_liaison.xls")
appExcel.Visible = True

C'est pour ca que je ne comprend pas ...
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
74
Salut
Dans tes explications, ne confonds pas une feuille avec un classeur : la résolution serait complètement différente.
Dans ton cas, tu parles de classeurs, mais ton problème, c'est qu'ils s'ouvrent tous dans la même instance de Excel.
Ai-je bien compris (*) ?

C'est surement dû au fait que ... tu lui demande de réagir comme ça :
Tu fais un GetObject, c'est à dire que tu vérifies si une instance d'Excel est déjà en route, auquel cas, tu ouvriras ce Xème classeur dans cette même instance.
Si tu veux créer autant d'instances que de fichiers, il te faut faire un CreateObject à chaque fois.

(*) Champon du monde de boule de cristal 2005-2006

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
11
Date d'inscription
vendredi 5 février 2010
Statut
Membre
Dernière intervention
1 juin 2010

Bonjour, en fait ce que je souhaite faire c'est qu'a l'ouverture de l'interface vb, on est un choix de boutons (chaque boutons représentant une feuille de mon classeur), que le premier clique correspondra à l'ouverture du classeur, mais qu'ensuite si on clique sur les autres bouttons il ne m'ouvre pas un autre classeur mais change simplement de feuilles.
Donc en gros : - verifier si le classeur est ouvert avec le GetObject
- Si le classeur n'est pas ouvert, il me renvoit une erreur et la je creer avec le CreateObject l'ouverture de mon classeur, et ensuite me renvoit à la feuille correspondant au bouton.
-Si le classeur est deja ouvert, il me renvoit simplement à la feuille correspondant au bouton.
Messages postés
11
Date d'inscription
vendredi 5 février 2010
Statut
Membre
Dernière intervention
1 juin 2010

Le code que j'ai mit est celui d'un seul bouttons, les autres bouttons ont exactement le meme code avec simplement le nom de la feuille qui change
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
74
Le fait de ne pas mettre d'indentation dans ton coe rend la lecture difficile et du coup, on est passé à côté du principal :

Voilà ton code correctement formaté :
    On Error Resume Next
    Set MyXl = GetObject("C:\Documents and Settings\Administrateur\Bureau\TDB_liaison.xls")
    If Err.Number <> 0 Then
        Application.DisplayAlerts = False
        Set appExcel = CreateObject("Excel.Application")
        Set wbExcel = appExcel.Workbooks.Open("C:\Documents and Settings\Administrateur\Bureau\TDB_liaison.xls")
        appExcel.Visible = True
        'wsExcel correspond à la première feuille du fichier
        Set wsExcel = wbExcel.Worksheets("Production hebdo")
        wsExcel.Activate
        Application.DisplayAlerts = True
    Else
        Set wsExcel = wbExcel.Worksheets("Production hebdo")
        wsExcel.Activate
    End If

Tu fais
Set MyXl = ...
mais quand tu veux choisir ta feuille, tu t'adresses à wbExcel
Set wsExcel = wbExcel.Workshee...
Il te suffit de corriger :
Set wsExcel = MyXl.Workshee...

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
74
+ le "On Error Resume Next" du début masque l'erreur dû à ton mauvais adressage
Messages postés
11
Date d'inscription
vendredi 5 février 2010
Statut
Membre
Dernière intervention
1 juin 2010

Je vient de corriger comme tu me l'a indiqué (ps: dsl pour l' indentation), mais cela ne marche toujours pas. En fait j'ai définit MyXl en tant qu'objet dans mes variables pour simplement vérifier si mon classeur était ouvert avec le GetObject.
Une fois la vérification passée, soit erreur et la j'utilise mon autre variable "appExcel" de type Excel.Application pour ouvrir mon classeur avec le CreateObject, soit le simple renvoie vers la feuille en question.
C'est pour cela que dans le Set wsExcel j'ai mit le .appExcel et non le .MyXl qui me servait juste à vérifier si le classeur était ouvert.
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
74
Oui, MyXl est là pour vérifier mais s'il est présent, l'objet lui sera attribué.
Fait un coup de ménage : Soit MyXl, soit appExcel
Quand tu définis en Object ce genre d'objet, tu fais ce qu'on appelle une référence tardive (avec GetObject ou CreateObject).
Très pratique pour palier à certains problèmes de compatibilité de version de Excel (ou autre).
Par contre l'inconvénient, c'est que, lors de la programmation, le "Sense" ne fonctionne pas (Sense : liste qui s'affiche dès que tu tapes le point après un objet)

Eclaicis aussi ta gestion d'erreur : Dès que tu n'as plus besoin de masquer l'erreur potentielle, repasse en getion standard, sinon tu n'auras jamais d'indice sur la raison du "ça marche pas"

On ne sait pas ce qui suit ces lignes de programme, mais gardes-tu ouverts les objets appExcel, wbExcel et wsExcel ?

Un bref coup d'oeil dans l'aide de VB et tu aurais vu des exemples, ce que je viens de faire.
GetObject ne s'utilise pas en précisant un nom de fichier. Un fichier n'est pas un Seveur OLE.
Il faut rechercher si Excel est lancé, puis, si c'est le cas, vérifier si ton classeur est ouvert.

J'ai remanier tout ça, avec des commentaires
    Dim bClasseurTrouvé As Boolean
    On Error Resume Next
    Set appExcel = GetObject(, "Excel.Application")
    On Error GoTo 0
    If appExcel Is Nothing Then
        ' Excel pas ouvert
        ' On ouvre une nouvelle instance
        Set appExcel = CreateObject("Excel.Application")
        ' On ouvre notre classeur
        Set wbExcel = appExcel.Workbooks.Open("C:\Classeur1.xls")
        appExcel.Visible = True
        'wsExcel correspond à la première feuille du fichier
        Set wsExcel = wbExcel.Worksheets("Feuil1")
        wsExcel.Activate
        Application.DisplayAlerts = True
    Else
        ' Excel tourne déjà
        appExcel.Visible = True
        bClasseurTrouvé = False
        For Each wbExcel In appExcel.Workbooks
            If wbExcel.Name = "Classeur1.xls" Then
                ' Oui, classeur ouvert
                bClasseurTrouvé = True
                ' on sort
                Exit For
            End If
        Next
        If Not bClasseurTrouvé Then
            Set wbExcel = appExcel.Workbooks.Open("C:\Classeur1.xls")
        End If
        ' Ouvre la deuxième feuille
        Set wsExcel = appExcel.Worksheets("Feuil2")
        wsExcel.Select
        wsExcel.Visible = True
        wsExcel.Activate
    End If
    Set wsExcel = Nothing
    Set wbExcel = Nothing
    Set appExcel = Nothing

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)