Activer un classeur Excel sur VBA

[Fermé]
Signaler
-
Messages postés
1769
Date d'inscription
lundi 7 avril 2008
Statut
Membre
Dernière intervention
15 juin 2020
-
Bonjour,

J'utilise le planificateur des tâches windows pour lancer des fichiers excel automatiquement à une heure précise, je vous explique mon problème, je lance un fichier Excel qui m'importe une extraction de données, par la suite et dans 5 minutes tout en laissant le fichier Extraction ouvert, je lance un fichier qui s’alimente à partir de cet extraction, tout marche bien pour l'importation de l'extraction, sauf que quand je lance le deuxième fichier, j'ai l'erreur suivante: l'indice n'appartient pas à la sélection, sur VBA j'ai une erreur sur le code suivant: Windows("Extract").Activate.
Par contre, quand je fais le traitement manuellement sans planificateur, cela marche sans problème, pouvez-vous s'il vous plaît m'aider pour résoudre ce problème ou me proposer une solution alternative?

3 réponses

Messages postés
1769
Date d'inscription
lundi 7 avril 2008
Statut
Membre
Dernière intervention
15 juin 2020
643
Si le classeur "Extract" est bien ouvert, ce code devrait fonctionner

For Each classeur In Workbooks
If classeur.Name = "Extract" Then
classeur.Activate
Exit For
End If
Next



 
Merci pour ta réponse, en fait le planificateur en ouvrant les deux fichiers ouvre deux instance Excel, ce qui fait, quand tu vas activer un classeur à travers un autre, il voudra pas parce qu'il ne fait pas partie de la même instance Excel, as-tu d'autres solutions s'il te plaît?

Cordialement,
Messages postés
1769
Date d'inscription
lundi 7 avril 2008
Statut
Membre
Dernière intervention
15 juin 2020
643 > Tachfine
Pour moi, le plus simple est de créer dans ton classeur 1 d'importation de données, une liaison avec ton classeur 2 d'exploitation de l'extraction, ce qui te permettra d'ouvrir ton classeur 2 à partir du classeur 1 et donc rester dans la même application Excel.
La planification de ta 2ème tâche n'est plus alors nécessaire.
Messages postés
1769
Date d'inscription
lundi 7 avril 2008
Statut
Membre
Dernière intervention
15 juin 2020
643
Tu peux cependant essayer

Set classeur = GetObject("Extract")
classeur.Activate


 
Mercii
Je vais l'essayer demain au travail
Ta première solution n'est pas pratique malheureusement :/
En fait je suis statisticien, et je dois fournir environ 12 rapports par jour, il y aussi le problème des rapports qui changent chaque mois
Peux-tu s'il te plaît m'expliquer getobject précisément? Et si ce code me posera un problème avec mon premier problème des instances Excel
Merci beaucoup pour ton aide précieux :)
Messages postés
1769
Date d'inscription
lundi 7 avril 2008
Statut
Membre
Dernière intervention
15 juin 2020
643
Voir l'article de Microsoft sur ce sujet
https://docs.microsoft.com/fr-fr/office/troubleshoot/office-suite-issues/getobject-createobject-behavior

Si vous connaissez le nom d'un document ouvert dans cette instance, vous pouvez le joindre à une instance spécifique. Par exemple, si une instance d'Excel est en cours d'exécution avec un classeur ouvert nommé Book2, le code suivant attache avec succès à cette instance même s'il n'est pas l'instance plus ancienne qui a été lancé :
Set xlApp = GetObject("Book2").Application


Tu peux évidemment assigner la première instance Excel lancée par le planificateur mais comme tu veux juste utiliser le classeur "Extract", je t'ai donc proposé le code ci-dessus.
Cela dit, je ne suis pas certain que "Extract" devienne le classeur actif dans la 2ème instance d'Excel. Il vaut donc mieux préfixer les plages d'Extract que tu vas utiliser.


Set classeur = GetObject("Extract")
classeur.ActiveSheet.<plage>

 
Messages postés
1769
Date d'inscription
lundi 7 avril 2008
Statut
Membre
Dernière intervention
15 juin 2020
643 > Tachfine
J'ai vérifié ce point. Chez moi, la bibliothèque "OLE automation" est activée. Quand je la désactive, cela fonctionne quand même.
Mais si chez toi, elle n'est pas activée, actives-la, on ne sait jamais.
Elle l'est, cela a marché avec toi en mettant le même code?
Si tu peux vérifier s'il te plaît si t'as deux programmes Excel activés sur le gestionnaire de tâche
Messages postés
1769
Date d'inscription
lundi 7 avril 2008
Statut
Membre
Dernière intervention
15 juin 2020
643 > Tachfine
J'ai fait ce test et chez moi, ça fonctionne. Ci-dessous ma procédure de test

Sub test()
Dim classeur As Workbook

' crée une 2ème instance Excel avec classeur1 par défaut
Dim XlApp As New Excel.Application
XlApp.Workbooks.Add
XlApp.Visible = True
'classeur 2ème instance Excel
Set classeur = GetObject("classeur1")
MsgBox classeur.Name

'classeurs 1ère instance Excel
For Each classeur In Workbooks
MsgBox classeur.Name
Next

End Sub


Pour cerner le problème et voir s'il te manque un module, testes l'instruction ci-dessous qui devrait fonctionner sans problème.
set xlApp = GetObject(, "Excel.Application")

Cette instruction référence l'instance Excel en cours.
Je te prie de m'excuser, le référencement peux solutionner le problème sauf que je comprends pas trop le travail que ce code pourra faire, peux-tu m'en expliquer plus s'il te plaît?

Et si ce référencement s'appliquera sur toutes les instances Excel?

Je te remercie infiniment pour ton aide Thev :)
Messages postés
1769
Date d'inscription
lundi 7 avril 2008
Statut
Membre
Dernière intervention
15 juin 2020
643 > Tachfine
Je me suis mal expliqué.
Tu me dis que cette instruction :
Set classeur = GetObject("Extract") 
ou
Set classeur = GetObject("Extract.xslx")
génère une erreur chez toi alors que chez moi elle fonctionne.

Peut-être te manque t-il l'installation d'un package Microsoft, auquel cas le Getobject ne pourrait pas fonctionner. C'est juste pour vérifier que Getobject est bien une fonction valide dans ton contexte que je t'ai demandé de tester l'instruction ci-dessus
set xlApp = GetObject(, "Excel.Application")


Si dans ton contexte Getobject est bien une fonction valide, alors c'est que le nom du classeur ouvert dans la 1ère instance d'Excel n'est pas "Extract.xlsx". Es-tu certain du nom "Extract" et du suffixe "xlsx" ?