Bonjour,
Je développe une macro sous excel 2010, cependant, j'ai un problème, à un moment donné, j'appuie sur un bouton, et de ce bouton, une pop-up apparait, où je souhaiterai cliquer sur "yes" dessus. De là, pas de problème, je sais comment faire, mais au moment où la pop-up apparait, le programme s'arrête et attends que je ferme manuellement la fenêtre et au bout d'un moment j'ai ce msg d'erreur qui apparait :
"Microsoft excel attend la fin de l'exécution d'une action OLE d'une autre application"
Il attends la fin de l'exécution de la pop-up sur laquelle j'aimerai avoir la main....
Alors si vous avez une idée pour que je puisse cliquer sur le "Yes" de la pop-up, car je ne peux pas demander à l'utilisateur de le faire, et je ne veux pas kill le processus, car j'ai besoin de valider cette fenêtre pour enregistrer les changements opérés
J'ai essayé en simulant le clavier dans le programme avant (après, ça ne sert à rien, vu que le programme ne continue pas)
Si vous avez une idée pour cliquer sur yes, ou continuer le programme, je vous en remercie
Bonjour
D'après ce que j'ai vu sur le net : souvent c'est que les sendkey ne fonctionnent pas
il faut passer par un autre moyen
A toi de chercher ( indice , tape ça dans google Application.Wait Now + 2 / 3600 / 24)
Bonjour,
Merci pour ta réponse, mais je ne comprends pas trop ce que tu veux dire.
Même sans les sendKey, ça bloque. (La macro s'arrête au niveau de la ligne qui ouvre la pop-up ou dialogue page, je ne suis pas sûre du nom)
Quand tu veux dire que sendkey ne fonctionne pas, tu veux dire que ça n'envoie pas le caractère ?
A toi de chercher ( indice , tape ça dans google Application.Wait Now + 2 / 3600 / 24)
Je dois avouer que je ne vois pas du tout quoi chercher.
Je suis un peu (beaucoup) perdue.
Car bon, je ne vois pas comment je peux envoyer une donnée à une page alors que la macro bloque totalement au moment de son ouverture.
Je suis désolée de t'embêter ^^"
Merci beaucoup pour ton aide, et pour l'indice que je ne comprends pas.
Bonne fin de journée
En fait pour l'indice google , tu arrives sur une liste de site ( normal !!)
dedans au début il y a 2 sites à lire qui pourraient t'inspirer :
Developper.net et Géneration-nt
car comme par hasard ton temps du Wait est exactement le même que l'exemple ??
UN parle de perdre le FOCUS ce qui veut dire que le Pg boucle et t'as pu la main !!! ( ça ressemble ?)
disons que si j'avais à paramétrer le temps il y a par exemple: + timevalue ("00:00:10") pour 10sec
donc pourquoi exactement + 2/3600/24, pure coïncidence ?
Mais comme on a pas ton fichier , je ne peux pas voir si l'on peut faire un rapprochement
Donc le mettre pour continuer ..comme tu veux !
Du coup, pour le wait, c'est une personne avec qui j'ai parlé de ça qui m'a conseillé de le mettre.
Et je perds le focus même sans le wait.
Je peux mettre un bout du code, mais je ne peux passer tout, car c'est confidentiel, comme le site sur lequel je travail (c'est pour le boulot)
Il n'y a pas d'autre moyen pour simuler le clavier que sendkey ?
Et pouvoir par exemple; dire à la macro avant d'ouvrir la page "je veux que tu envoies fasse cette ligne une fois la page ouverte"
Et c'est pas le wait qui bloque, car je viens d'enlever tous les wait et sendkey qui étaient avant mon ouverture, et ça bug toujours autant.
Donc beaucoup le font , tu copies la partie qui pose Pb dans un fichier vierge avec la macro
j'ai déjà fait aussi ! juste pour faire tourner le VBA et voir Koi KIL en est !!!
Bonjour Herve,
J'ai déjà copié la partie qui cause problème dans mon premier post,
Mais je pense que j'ai trouvé une solution à mon problème : https://www.youtube.com/watch?v=G-2khNFYQl8
(Je met le lien vers ceux qui voudrons avoir la solution, c'est en anglais !)
Le code à mettre dans le vba : (au début du code)
Shell "wscript.exe ""C:\Users\gjqf5108\Desktop\vba\LVO\moi\LVO_script.vbs"""
Vers le fichier
Le code à mettre dans le fichier :
Code:
Set wshShell = CreateObject("WScript.shell")
Do
ret = wshShell.AppActivate("Nom de la page")
Loop until ret = True
WScript.sleep 500
ret = wshShell.AppActivate("Nom de la page")
If ret = True Then
ret = wshShell.AppActivate("Nom de la page")
WScript.Sleep 10
wshShell.SendKeys "{enter}"
End if
WScript.Sleep 500
Nom de la page : Remplacer pas le nom de votre page (obvious)
J'ai un problème avec le code, le script est bloqué (la ligne avec shell....) dans vba, comme il faut le lancer avec l'autorisation de l'administrateur. Il me suffit plus qu'à trouver comment faire, si je trouve, je vous l'envoie
Mais je pense que ça marche.
Alors je dis bonne chance à ceux qui auront ce problème
Je reviens donner les modifications qui j'ai fait sur mon code.
Du coup, pour la ligne que je met dans VBA, je l'ai changé, car j'ai une erreur comme quoi je ne peux pas l'exécuter, (droit d'admin...)
Donc, j'utilise ces lignes à la place :
Code:
Dim ObjShell As Object
Set ObjShell = CreateObject("Shell.Application")
ObjShell.ShellExecute "Wscript", _
"C:\Users\gjqf5108\Desktop\vba\LVO\moi\LVO_script.vbs", "", "runas", 0
Ensuite, j'ai un petit peu modifié le code vbs, car quand j'arrivais sur la page, je perdais le focus sur le bouton "yes" ce qui faisait que mon programme faisait "enter" dans le vide, comme je n'ai que 2 boutons dans ma page, je fais 2 fois tabulation, la première m'amène sur no, puis la deuxieme sur yes, car de base, je suis sur yes, même si je n'ai pas le focus
Code:
Set wshShell = CreateObject("WScript.shell")
Do
ret = wshShell.AppActivate("Nom de la page")
Loop until ret = True
WScript.sleep 1000
ret = wshShell.AppActivate("Nom de la page")
If ret = True Then
ret = wshShell.AppActivate("Nom de la page")
WScript.Sleep 1000
wshShell.SendKeys "{TAB}"
WScript.Sleep 1000
wshShell.SendKeys "{TAB}"
WScript.Sleep 1000
wshShell.SendKeys "{ENTER}"
End if
WScript.Sleep 500
(Dans mon premier message, le enter était en minuscule, je pense que ça ne marche pas si ce n'est pas en MAJ)
Si vous n'aimez pas enter, vous pouvez mettre "~" : ce revient au même
Oui pour le code mais dans un fichier plus élaboré ... on aurait pu faire tourner !!
sinon un truc qui me chiffonne : Le SHELL
j'ai programmé en Shell il y a plus de 20 ans mais sous environnement UNIX ( Krosoft buvait encore le biberon)
et là on retrouve des similitudes en VBA ? ,et surtout de Pb !!
Y a t-il relation ou pas ?
en tout cas bon courage ... et au moins un membre qui cherche et n'attends pas le tout cuit > Mention Bien
Merci pour la mention bien, ça me fait plaisir x)
J'aime pas attendre le tout cuit, j'aime bien pouvoir me dire, "j'ai trouvé toute seule, yay"
Je ne sais pas s'il y a relation ou pas... Je sais juste que je ne suis pas la seule à avoir ce problème. (pour krosoft, yavait pas que lui qui buvait le biberon ya 20 ans xD)
Tu sais comment on met un sujet en résolu ? x)
Petite question sinon, car je bloque sur un boucle dans vbs.
(Pour le fichier, je n'ai pas le droit de donner les urls, donc tu n'aurais pas pu reproduire l'erreur)
Code:
Set wshShell = CreateObject("WScript.shell")
Dim compte
compte = 0
ret = False
Do
Do
compte= compte +1
WScript.sleep 1000
ret = wshShell.AppActivate("ma page")
Loop until ret = True
WScript.sleep 1000
ret = wshShell.AppActivate("ma page")
If ret = True Then
ret = wshShell.AppActivate("ma page")
WScript.Sleep 10
wshShell.SendKeys "{TAB}"
WScript.Sleep 10
wshShell.SendKeys "{TAB}"
WScript.Sleep 10
wshShell.SendKeys "{ENTER}"
ret = False
End if
WScript.Sleep 500
Msgbox (FormatNumber(compte) < 7200)
Loop Until FormatNumber(compte) < 7200
msgbox "je sors" & compte & " ret : " & ret & " " & (FormatNumber(compte) < 7200)
Dans le code, je fais d'abord une boucle qui dure 2 heures, puis une qui regarde si ma page s'ouvre.
(Car je dois ouvrir x pages, je ne connais pas le nombre d'avance. Et comme le temps d'exécution est assez long...
Je pense mettre une autre exception après, comme si j'ouvre cette page, alors, j'arrête l'execution en mettant le compteur à 7200)
Mais je n'arrive pas à rester dans la boucle x)
à chaque fois que je trouve la 1ère page, je sors de toutes les boucles, j'ai essayé compte > 7200 compte < 7200 compte <> 7200 ...
Je sais pas si c'est ma méthode qui n'est pas bonne, peut-être que comme l'appli n'arrive pas à comparer le chiffre avec la variable, ça met true par défaut, mais j'ai tenté de mettre FormatNumber autour de compte, pour que ça passe en chiffre (que je cast) mais ça fait pareil.
Je ne peux pas mettre dim compte as integer au début, car ça me met une erreur.
cf : Déclaration de variables en VBS (c'est pas moi, mais le problème est le même, j'ai fait comme dans la réponse, mais bon, ça résoud pas mon problème )
Donc, si quelqu'un a une solution à me proposer, je suis preneuse
Merci !
Set wshShell = CreateObject("WScript.shell")
Dim compte
Dim max
compte = 0
max = 2700
ret = False
Do
Do
compte= compte +1
WScript.sleep 1000
ret = wshShell.AppActivate("Accept Lvo")
Loop until ret = True
WScript.sleep 1000
ret = wshShell.AppActivate("Accept Lvo")
If ret = True Then
ret = wshShell.AppActivate("Accept Lvo")
WScript.Sleep 10
wshShell.SendKeys "{TAB}"
WScript.Sleep 10
wshShell.SendKeys "{TAB}"
WScript.Sleep 10
ret = False
End if
WScript.Sleep 500
Msgbox (FormatNumber(compte) < FormatNumber(max)) &" "& (FormatNumber(compte) > FormatNumber(max)) & " " & (FormatNumber(compte) <> FormatNumber(max)) & " " & compte
Loop Until (FormatNumber(compte) < FormatNumber(max))
msgbox "je sors" & compte & " ret : " & ret
Je crée une variable max, que je mets à 2700, et je compare les 2, avec FormatNumber, ça fonctionne très bien
Des Loop imbriquées tu m'étonnes que ça dure !!!
et une appli structurée ainsi , en Debug .... bonjour l'ambiance
Sinon on voit bien l'appli industrielle ( du costaud) et ici malgré le haut niveau qui parfois m'échappe aussi
c'est pas évident si on a pas le fichier
Donc si tu juges RESOLU :
Edite ton 1er message > Modif > et met entre [] puis enregistrer ( le motif est facultatif)
Bonne continuation