j'ai crée une routine qui m'ouvre des onglets dans IE
maintenant je souhaite suite à cette ouverture, tout fermer à la fois si possible
Qui à la solution ?
Merci
Christophe
Version imprimable
j'ai crée une routine qui m'ouvre des onglets dans IE
maintenant je souhaite suite à cette ouverture, tout fermer à la fois si possible
Qui à la solution ?
Merci
Christophe
Bonjour,
sans voir comment tu effectues l'ouverture, et notamment les objets instanciés ... c'est comme nous demander de chercher une clé en expliquant simplement que tu as verrouillé "une porte" ... sans nous montrer le trousseau
montre nous ton code
Bonjour
si tu a ouvert IE avec X onglets par vba
normalement la variable Object instancié pour le document utilise "close"
pour l'object IE(internet explorer) c'est ".quit"
si tu n'est plus dans la sub et que tes variables ont été dimée dans la sub
il te faut re récupérer les instance
pour cela tu trouvera dans les contributions ma fonction getIE qui retrouve toutes les instance de IE et tout les pages ouvertes
avec cela tu adapte une variable object et tu utilise les deux fonctions (".close",".quit")
cela dit je te conseille si tu dois instancier des object( IE,IE.document) et que tu reste pas dans la sub ou fonction dim les en public en haut de module
tu pourra les manipuler dans n'importe quelle sub ou fonction
Voila au plaisir
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39 Sub PremierIE() 'Déclaration des variables Dim IE As New InternetExplorer Dim Start As Single, Delay As Integer If Delay = 0 Then Delay = 2 Set IE = New InternetExplorer IE.Visible = True 'Chargement d'une page web Google IE.Navigate "Page Web 1",1 IE.Navigate "Page Web 2", 1 IE.Navigate "Page Web 3", 1 IE.Navigate "Page Web 4" 'Affichage de la fenêtre IE IE.Visible = True 'Attendre que la page soit prète While IE.readyState <> READYSTATE_COMPLETE DoEvents Wend 'Timer (Wait ralenti les autres appli) Start = Timer + Delay ' pour 2 secondes While Timer < Start DoEvents Wend IE.Quit IE.Visible = False End Sub
re
oulala!!!
tu quitte IE après tu veut le rendre visible !!!!!??????????
le .navigate2 tu connais ?????????
bon allez exemple
j'ai bombarder le code de commentaires
le late binding tu connais ????
bonne lecture :mouarf:
voila comment on ouvre plusieur ongets dans IE le dernier c'est ton post marrant non?Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39 Sub test() '********************************************************************************************* Dim IE As Object ' on instancie IE comme un object et non comme l'application internet Set IE = CreateObject("InternetExplorer.Application") ' maintenant on créé l'object internetexplorer ' pourquoi comme ca? ' parce que comme ca on a pas de références a activer c'est ce qu'on appelle du late binding ( en Français déclaration tardive) '******************************************************************************************************************************* IE.Visible = True '******************************************************************************************************* 'le premier onglet on utilisera le .navigate '1er Onglet IE.Navigate ("https://www.google.fr/?gws_rd=ssl") 'on attend que la page soit chargé et que ie ai travaillé au cas ou il y a des script sur la page web le ""busy!!"" tres souvent négligé en vba pourtant important Wait IE ' j'ai volontairement séparer le code d'attente dans une autre sub pour reduire le nombre de ligne de code '******************************************************************************************************* '******************************************************************************************************* 'pour le 2 eme et plus on utilisera le .navigate2 suivi de 2048 séparer par une virgule '2eme Onglet IE.Navigate2 ("https://login.live.com/?wa=wsignin1.0&rpsnv=12&ct=1436041690&rver=6.4.6456.0&wp=MBI_SSL_SHARED&wreply=https%3a%2f%2fdub112.mail.live.com%2fm%2f%3ffl%3d635716384901866965%2c%252fm%252f&lc=1036&id=64855&mspco=1&pcexp=false"), 2048 Wait IE ' idem '******************************************************************************************************* 'idem au 2 '3 eme onglet IE.Navigate2 ("http://www.msn.com/fr-fr/actualite"), 2048 Wait IE 'IE.Visible = True '******************************************************************************************************* 'idem au 2 et 3 etc......... '4 eme onglet IE.Navigate2 ("http://www.developpez.net/forums/d1530660/logiciels/microsoft-office/excel/macros-vba-excel/fermet-onglets-ie-ouverts-code-vba/#post8309164"), 2048 Wait IE 'etc.........etc........ End Sub Sub Wait(IE) 'cette sub d'attente sert pour tout les onglet Do: DoEvents: Loop While IE.readystate <> 4 Or IE.busy End Sub
EDIT
grâce a toi je viens de découvrir quelque chose !!!!!
quand tu ouvre X onglet dans IE par vba tu ouvre X instances de l'application mais dans la même fenêtre
j'ai donc repris ma fonction getobjects que l'on trouve dans les contributions je l'ai meme renommé
elle s'appelle maintenant "GetInsTance_IE"
donc si tu veux fermer IE !!!!
il va te falloir fermer chaque instance !!!!!
voici un exemple qui te montre comment je ferme un onglet parmi les autres
j'ai utilisé une url précédemment ouvertes dans IE avec la 1 ère sub
voilaCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 Sub ferme_un_onglet() Dim instance_IE As Object Set instance_IE = GetInsTance_IE("http://www.msn.com/fr-fr/actualite") 'maintenant que l'on a retrouver notre instance de IE on la ferme instance_IE.Quit End Sub Function GetInsTance_IE(url) As Object Dim objShell As Object, obj As Object Set objShell = CreateObject("Shell.Application") For Each obj In objShell.Windows If TypeName(obj.document) = "HTMLDocument" Then 'ici on va tester une des urls que l'on a utilisé dans la premiere sub au cas ou il y ai plusieurs instance de IE ouvert par vba ou non ' comme ca on est sur de fermer la bonne !!!!! If obj.LocationURL = url Then Set GetInsTance_IE= obj: Exit For End If Next obj End Function
maintenant tu sais comment ouvrir plusieurs onglets et comment fermer l'un d'entre eux
pour fermer complètement il va te falloir adapter une boucle sur toutes les urls et les passer a la moulinettes de ma fonction
j'ai tout dis ;)
Salut, une manière peu élégante et brutale de tout fermer : via un kill.
Code:
1
2
3
4
5
6 Option Explicit Private Sub KillIE() Dim RetVal As Long RetVal = Shell("Taskkill /im iexplore.exe /f", 0) End Sub
Bonjour kiki29
oui mais ne fait pas la distinction entre les instances de l'application ouvertes par vba et les autres
cela dit en cas de plantage ca peut être une alternative afin de débloqué la situation
ca me donne un e idée
si je l'intégrais a ma fonction dans une gestion d'erreur non?
Salut
Bon j'ai presque tout compris...sauf !
Que la fonction getinstance_ie plante
en fait dans : If TypeName(obj.document) = "HTMLDocument" Then......je dois mettre le nom de mon site ?
car quoi que je mette ça plante
et ça me ramene sur cette ligneCitation:
erreur d'exécution
la méthode"Document' de l'objet 'IWebBrower2' a échoué
as tu la solution ?
merci
-------------------------------------
Super efficace mais ca ferme tout...vraiment tout....dommage, je voulais fermer qu'une seule cession....
merci
Christophe
re
non les seules chose que tu dois adapter c'est les urls
teste mes codes dans fichier vierge et dis ou ca plante la condition if tu la laisse comme elle est
peut que tu l'a téléchargé avant que je fasse la petite correction
reprend tout dans un fic... vierge et teste
je sais pq cela ne marche pas, en fait j'ai plusieurs fenetres IE ouvertes et donc la fonction ne trouve pas la bonne et donc erreur....
Alors as tu une solution....je suis compliqué...lol
re
tu dis n'importe quoi!!! la fonction parcours toutes les fenêtres IE même celle qui n'ont pas été ouvertes par vba
si ca le fait pas c'est que tu a un autre soucis
regarde cette capture d'écran a droite tu a l'éditeur vbe avec la macro qui utilise le même code que la fonction
a gauche tu a une fenêtre IE avec 3 urls ouvertes et une autre fenêtre avec Outlook
j'ai lancer la sub et regarde en bas dans la fenêtre d'exécution il y a bien les 4 urls donc le code a bien trouver toutes les fenêtres IE et toutes les pages web ont été trouvées
Pièce jointe 182310
Bonjour Patrick
maintenant cela plante à la ligne instance_EI.Quit.
effectivement j'ai mis la fenetre d"exécution et tout y est...Citation:
erreur d'exécution 91
variable objet ou variable de bloc With non définie
je vais analyser le soucis chez moi aussi quand j'en ferme 1 ca va mais si je ferme toutes les onglet d'une même fenêtre ca plante c'est pas normal
laisse moi du temps OK
Pas de souci Patrick, c'est sympa de t"en occuper...
Christophe
Salut
Attention pour les suppressions, il faut souvent commencer par le bas de la collection ;)
Et donc les boucles For each ne sont pas utilisables, il faut faire une boucle for x = Y to 0 Step -1
Je pense que le souci vient de la.
Sinon autre solution, tu crées une collection d'instance IE, comme ça arrivé à la fin de ton code, tu fermes les instances contenues dans la collection en question.
D'ailleurs comment fais tu par la suite pour manipuler les différentes fenêtres ? Comment les pointes tu sans avoir une variable qui leur fait référence ?
++
Qwaz
Bonjour qwazerty
j'ai esayé la boucle a l'envers et ca fonctionne pas
c'est assez bizarre quand on navigate 2 ca ouvre une instance a chaque fois mais dans la même fenêtre
et quand je veut fermer tout c'a en ferme un et les instances ont disparues et donc le bug se crée sur le 2 eme tour de boucle
c'est assez bizarre comme comportement
je vais chercher si il n'y a pas moyen de fermer le document et non pas l'instance dans le quel il est
Salut
Visiblement pas de solution "simple", du moins en gardant ta façon de faire.
Surement une solution ici, tu as de la lecture en perspective ;)
http://www.ozgrid.com/forum/showthread.php?t=179317
Sinon un truc du genre et comme ça tu sais ce qu'il y a à fermer à la fin..
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 Sub PremierIE() 'Déclaration des variables 'Dim IEs As New InternetExplorer Dim IE(2) As InternetExplorer Dim IEDoc As HTMLDocument Dim Start As Single, Delay As Integer If Delay = 0 Then Delay = 2 Set IE(0) = New InternetExplorer Set IE(1) = New InternetExplorer Set IE(2) = New InternetExplorer 'Affichage de la fenêtre IE IE(0).Visible = True IE(1).Visible = True 'IEs.Visible = True 'Chargement d'une page web Google IE(0).Navigate "www.google.fr" ', 1 IE(1).Navigate "www.developpez.net" ', 1
++
Qwaz