Page 3 sur 3
Re: [R] Besoin de fermer automatiquement une fenetre.
Posté : mer. 22 août 2012 13:01
par Aquhydro
T'inquiète tout ce qui est erreurs de parenthèse c'est pas plus mal ça m'apprend à pas poser des questions bêtes et a résoudre des trucs par moi même, j'avais corrigé avant de voir l'édit,
Pour le reste merci des correction, donc voilà ce que j'ai mis, et maintenant j'ai le même message d'alerte que pour excel mais avec
If $var
*** Problème résolus pour mêmes raisons
Nouveau problème :
$oExcel.run("Copiercoller") ;(c'est le nom de ma première macro)
$oExcel^ ERROR
Error: Variable must be of type "Object".
Est ce parce que c'est un macro?
Re: [...] Besoin de fermer automatiquement une fenetre.
Posté : mer. 22 août 2012 13:44
par Aquhydro
Alors, j'ai essayé de contourner le problème en associant à mes maccros des raccourcis claviers, et en fait le résultats est le suivant : non seulement il ne se passe rien pour ce qui est de excel, mais si j'arrte de toucher mon clavier, voCilà le résultat :
CCC
Bref, c'est pluCtot handicapant comme vous pouvez lCe lire, évidement, si j'arrete le script, ça va Cmieu.
Donc voilà le scritp écris, ou sont les erreurs s'il vous plait... :
► Afficher le texte
Code : Tout sélectionner
#Include <WinAPI.au3>
#Include <Excel.au3>
While 1
If WinExists("[TITLE:jointg1; CLASS:#32770]", "") Then
$child = WinGetHandle("[TITLE:jointg1; CLASS:#32770]", "")
$parent = _WinAPI_GetParent($child)
WinActivate($child)
ControlFocus($child,"","[Class:Button;Text:Oui]")
Send("{ENTER}")
Sleep(500)
WinClose($parent)
Sleep(100)
EndIf
$var = WinList("jointg1")
If $var[0][0] < 4 Then
$oExcel = _ExcelBookOpen("jointg control.xls", 1)
$hwnd = WinGetHandle("[TITLE:Microsoft Excel - jointg control.xls [Mode de compatibilité]; CLASS:XLMAIN]", "")
WinActivate($hwnd)
Send("^m")
Sleep(15000)
WinActivate($hwnd)
Send("^l")
ElseIf $var[0][0] > 4 Then
Sleep(180000)
EndIf
Wend
j'ai trouvé quelques réponses donc j'édite
Par contre le fait de séléctionner la fenetre qui m'interesse ne fonctionne toujours pas, et vu que je ne me place pas dans excel, et bien je n'ai jamais acces à mes maccro en utilisant mes raccourcis
Re: [...] Besoin de fermer automatiquement une fenetre.
Posté : mer. 22 août 2012 14:33
par mikell
Pour
Error: Variable must be of type "Object".
$file =
chemin complet du fichier, par exemple :
Code : Tout sélectionner
$oExcel = _ExcelBookOpen(@ScriptDir & "\jointg control.xls", 1)
Sleep(10)
$oExcel.run("ma_macro1")
Faut mettre une balise 'spoiler' quand le code posté commence à se faire long
Marrant le C ... enfin relativement

Re: [...] Besoin de fermer automatiquement une fenetre.
Posté : mer. 22 août 2012 14:35
par Aquhydro
Alors, si j'ai bien compris, cela ouvrira a chaque fois une nouvelle fenetre excel? Si c'est le cas, serait il possible, plutot que de faire cela, de sélectionner la fenetre excel déjà ouverte, et de l'utiliser pour lancer la macro, parce 1) le fichier est un peu lourd, donc l'ouvrir a chaque fois est lourd pour l'ordi.
2) il faut une fonction enregistrer et fermer pour qu'a chaque fois l'un de mes deux script ait un effet, si on doit changer de fenetre, alors que sinon, il suffit juste de laisser faire... ?
Re: [...] Besoin de fermer automatiquement une fenetre.
Posté : mer. 22 août 2012 14:48
par mikell
Aquhydro a écrit : serait il possible, plutot que de faire cela, de sélectionner la fenetre excel déjà ouverte, et de l'utiliser pour lancer la macro
Oui
Code : Tout sélectionner
$oExcel = _ExcelBookAttach(@ScriptDir & "\jointg control.xls")
Mais vu que 1) je connais pas bien excel, et 2) je sais pas ce que tu veux en faire, tu devrais potasser le fichier d'aide à la rubrique User Defined Function Reference > Excel Management, je suis sûr que tu y ferais des découvertes
Par exemple _ExcelBookSaveAs : tu enregistres, puis tu continues sur le même fichier, puis tu réenregistres sous un autre nom, etc
Re: [...] Besoin de fermer automatiquement une fenetre.
Posté : mer. 22 août 2012 15:15
par Aquhydro
Merci pour l'aide, et en effet y'a des trucs pas mal, mais pas de quoi faire la séléction que je veux faire, avec WinActivate, y'a t'il une raison que ça ne fonctionne pas?
mon code actuellement est celui ci :
► Afficher le texte
Code : Tout sélectionner
#Include <WinAPI.au3>
#Include <Excel.au3>
While 1
If WinExists("[TITLE:jointg1; CLASS:#32770]", "") Then
$child = WinGetHandle("[TITLE:jointg1; CLASS:#32770]", "")
$parent = _WinAPI_GetParent($child)
WinActivate($child)
ControlFocus($child,"","[Class:Button;Text:Oui]")
Send("{ENTER}")
Sleep(500)
WinClose($parent)
Sleep(100)
If WinExists("[TITLE:jointg1; CLASS:#32770]", "")=0 Then
$var = WinList("jointg1")
If $var[0][0] < 4 Then
WinActivate ("[CLASS:[EXCEL7]]" ,"" )
Send("^u")
If $var[0][0] > 4 Then
Sleep(180000)
EndIf
Wend
Et j'y rencontre trois probleme, 1) que je mette "If Not Winexist" ou "If WinExist()=0 " il me dit Unable to parse line.
Ensuite, le winActivate de excel, j'ai essayé avec : "Microsoft Excel - jointg control.xls [Mode de compatibilité]" comme titre, qui est celui de autoit Win Info, ensuite , vu que j'ai vu que seule la classe du control button changeait entre les differentses parties de excel (ce qui au demeurant ne devrait pas poser problème vu que si je clique ou que ce soit dans excel, ça devrait activer la fenetre normalement) , j'ai mis la classe du bouton de controle (ci dessus) dans tout les cas, ça ne fais absoluement rien, et ça fait ctrl+u sur les fenetres en cours, et jamais sur la fenetre Excel voulue, qui ne se séléctionne jamais automatiquement...
Une idée?
Re: [...] Besoin de fermer automatiquement une fenetre.
Posté : mer. 22 août 2012 15:46
par mikell
Aquhydro a écrit : que je mette "If Not Winexist" ou "If WinExist()=0 " il me dit Unable to parse line.
normal
Code : Tout sélectionner
[color=#FF0000][/color] If WinExists("[TITLE:jointg1; CLASS:#32770]", "")=0 Then
Mais y a un truc que je comprends pas, tu veux lancer 4 tâches simultanément ou successivement ?
Re: [...] Besoin de fermer automatiquement une fenetre.
Posté : mer. 22 août 2012 15:54
par Aquhydro
Pour le WinExists, je mettais () pour simplifier, à l'interieur j'ai tout mis bien comme il faut regarde dans le spoiler...
En fait ce sont des taches qu'il est impossible de lancer simultanéments, mais elles peuvent travailler simultanéments si elles ne sont pas plus de 4 taches à la suite, en gros : je lance la premiere, elle dure 15 min, je lance la seconde 15s après avoir lancé la premiere, elle dure 30 minute, la troisieme tjrs 15 s durera 6 minutes, et la 4 ème va durer 2h. Si j'en lance une 5eme le logiciel plante. Le but est de gagner un maximum de temps, donc ici : dès que la 3 sera fini, je fais en sorte qu'elle soit remplacée par une autre, après viendra le tour de la 1, remplacée immédiatement, etc. Par contre, je peut pas savoir à l'avance combien de temps elles vont durer, d'ou le code que je demande.
Re: [...] Besoin de fermer automatiquement une fenetre.
Posté : mer. 22 août 2012 16:11
par mikell
OK
Il y a une curiosité devant la ligne du If WinExists, regarde ce que tu as posté....
Sinon le shéma de base de ton script doit être :
► Afficher le texte
Code : Tout sélectionner
While 1
; si une tache est terminée, ferme la fenêtre correspondante
If WinExists("[TITLE:jointg1; CLASS:#32770]", "") Then
$child = WinGetHandle("[TITLE:jointg1; CLASS:#32770]", "")
$parent = _WinAPI_GetParent($child)
WinActivate($child)
ControlFocus($child,"","[Class:Button;Text:Oui]")
Send("{ENTER}")
Sleep(500)
WinClose($parent)
Sleep(100)
EndIf
; indépendamment, compte les fenêtres qui s'appellent "jointg1"
$var = WinList("jointg1")
If $var[0][0] < 4 Then ; si y en a moins de 4 alors...
; action à faire
EndIf ; sinon ne fait rien
Wend
reste à définir précisément la fameuse "action à faire", en évitant de se disperser ^^
Je suppose qu'il s'agit d'ouvrir une nouvelle fenêtre
"Si j'en lance une 5eme le logiciel plante" quel logiciel ? si c'est lui qui lance les tâches, c'est sur lui qu'il faut agir dans l' "action à faire"
Re: [...] Besoin de fermer automatiquement une fenetre.
Posté : mer. 22 août 2012 16:28
par Aquhydro
Alors c'est un peu plus compliqué que cela.
J'utilise un logiciel de modélisation, qui se lance à partir d'une fenetre excel avec un macro qui oriente vers un fichier exe. la fenetre excel est ABSOLUMENT nécessaire du fait que c'est grace à elle que je peut donner mes données au fichier exe qui simulera celles ci.
"L'action a faire" est donc, de lancer un macro excel, le problème, et vu d'autres discutions sur le forum, je ne suis pas le seul à l'avoir rencontré, et que l'option pour lancer les macro ne fonctionne pour ainsi dire pas. Ca n'est pas grave il y a une autre solution, c'est de mettre la fenetre excel au premier plan, de la selectionner (elle se déselectionne a chaque fois que la macro est lancée) et de faire une commande du clavier (j'ai mis comme raccourci pour le lancement de ma macro Ctrl+u, donc en gros
)
Au delà du fait que le lancement des macro fonctionne ou non, la fonction "mettre en premier plan telle fenetre excel" n'existant pas avec les codes relatifs à Excel.au3, ça devient très problématique vu que la seule possibilité est d'enregistrer, fermer et de réouvrir à chaque fois le fichier excel, tache qui me prend suffisement de temps (fichier très lourd) pour préfèrer largment l'utilisation éventuelle d'un WinActivate
Re: [...] Besoin de fermer automatiquement une fenetre.
Posté : mer. 22 août 2012 16:31
par mikell
OK
Donc ça devrait suffire comme action à faire
Code : Tout sélectionner
WinActivate("Microsoft Excel")
WinWaitActive("Microsoft Excel")
Send("^u")
Re: [...] Besoin de fermer automatiquement une fenetre.
Posté : mer. 22 août 2012 16:41
par Aquhydro
► Afficher le texte
Code : Tout sélectionner
#Include <WinAPI.au3>
#Include <Excel.au3>
While 1
If WinExists("[TITLE:jointg1; CLASS:#32770]", "") Then
$child = WinGetHandle("[TITLE:jointg1; CLASS:#32770]", "")
$parent = _WinAPI_GetParent($child)
WinActivate($child)
ControlFocus($child,"","[Class:Button;Text:Oui]")
Send("{ENTER}")
Sleep(500)
WinClose($parent)
Sleep(100)
End If
$var = WinList("jointg1")
If $var[0][0] < 4 Then
WinActivate("Microsoft Excel")
WinWaitActive("Microsoft Excel")
Send("^u")
If $var[0][0] > 4 Then
Sleep(180000)
EndIf
Wend
X_x Il y a encore une erreur (wend sans while, donc c'est une erreur quelconque) et je la trouve pas... tout comme je n'ai toujours pas réussi à voir le problème tout à l'heure dans :
Je dois pas avoir encore les bons yeux, ou (et ça c'est certain) ne pas m'y connaitre assez
Re: [...] Besoin de fermer automatiquement une fenetre.
Posté : mer. 22 août 2012 16:47
par mikell
► Afficher le texte
Code : Tout sélectionner
#Include <WinAPI.au3>
#Include <Excel.au3>
While 1
If WinExists("[TITLE:jointg1; CLASS:#32770]", "") Then
$child = WinGetHandle("[TITLE:jointg1; CLASS:#32770]", "")
$parent = _WinAPI_GetParent($child)
WinActivate($child)
ControlFocus($child,"","[Class:Button;Text:Oui]")
Send("{ENTER}")
Sleep(500)
WinClose($parent)
Sleep(100)
End If [color=#FF0000];<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<[/color]
$var = WinList("jointg1")
If $var[0][0] < 4 Then
WinActivate("Microsoft Excel")
WinWaitActive("Microsoft Excel")
Send("^u")
Else
Sleep(180000)
EndIf
Wend
"Je dois pas avoir encore les bons yeux"
Non mais il y avait un caractère parasite en tête de ligne, probablement un caractère invisible sur ton pc si je le vois et pas toi
Re: [...] Besoin de fermer automatiquement une fenetre.
Posté : mer. 22 août 2012 16:55
par Aquhydro
Toujours le même message...
J'ai aussi essayé avec ElseIf au lieu de Else, idem;
ça gêne pas que y'a un End If, et juste après re If? (je dis surement n'importe quoi, mais j'essai... )
Re: [...] Besoin de fermer automatiquement une fenetre.
Posté : mer. 22 août 2012 17:19
par mikell
Pas d'erreur dans ce code
► Afficher le texte
Code : Tout sélectionner
#Include <WinAPI.au3>
#Include <Excel.au3>
While 1
If WinExists("[TITLE:jointg1; CLASS:#32770]", "") Then
$child = WinGetHandle("[TITLE:jointg1; CLASS:#32770]", "")
$parent = _WinAPI_GetParent($child)
WinActivate($child)
ControlFocus($child,"","[Class:Button;Text:Oui]")
Send("{ENTER}")
Sleep(500)
WinClose($parent)
Sleep(100)
EndIf ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
$var = WinList("jointg1")
If $var[0][0] < 4 Then
WinActivate("Microsoft Excel")
WinWaitActive("Microsoft Excel")
Send("^u")
Else
Sleep(180000)
EndIf
Wend
"EndIf" sans espaces !
Et oui, tu peux mettre plusieurs conditions If-(Else)-EndIf dans une boucle, pourvu que la syntaxe soit correcte
Tu commencerais pas à fatiguer ? c'est l'heure d'une bonne bière

Re: [...] Besoin de fermer automatiquement une fenetre.
Posté : mer. 22 août 2012 19:39
par Aquhydro
Tu avais raison, la bière a aidé!
Merci beaucoup pour le EndIf, même si j'ai été un gros boulet

Re: [...] Besoin de fermer automatiquement une fenetre.
Posté : mer. 22 août 2012 22:21
par mikell
No problemo
La cause fréquente de genre d'erreur bête c'est la speed-saturation + le manque de pratique (et de bière)

Peut-on considérer le problème comme résolu ?
Si oui, un [R] dans le titre du premier post please
Re: [...] Besoin de fermer automatiquement une fenetre.
Posté : jeu. 23 août 2012 09:19
par Aquhydro
Merci beaucoup, je retiens toutes les astuces, surtout celle de la bière!
\o\ \o/ /o/ J'ai monté un niveau, j'me crois dans Final Fantasy ça y est :p