re
sisi!!! mais ta bidouille ne fonctionne pas !!!!j'ai essayer au moins 10 fois
re
sisi!!! mais ta bidouille ne fonctionne pas !!!!j'ai essayer au moins 10 fois
mes fichiers dans les contributions:
mail avec CDO en vba et mail avec CDO en vbs dans un HTA
survol des bouton dans userform
prendre un cliché d'un range
si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
et n'oublie pas de voter
Ce n'est pas une bidouille mais un contournement d'un dysfonctionnement coutumier de Seven !
Et aucun souci de mon côté sur différents ordinateurs sous Seven en modifiant le répertoire courant
via Enregistrer sous … : il suffit juste de pointer sur le dossier System32 de Windows puis Annuler …
As-tu au moins vérifié la présence de la dll indiquée dans les Références dans le répertoire System32 ?
Sinon l'astuce est qu'une fois les dll activées puis le classeur enregistré
et ce même sous Windows 8.1 (Edit : oui mais pas à vide, avec du code, pièce jointe corrigée …)
c'est disponible pour un autre ordinateur sous Seven (un autre de mes tests) :
C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)
Bonjour Marc,
J'ai testé ton code #76 , pour la dll ton contournement fonctionne très bien.
Par contre je ne peux ouvrir directement le fichier CSV, j'ai d'abord un menu déroulant
du coup j'ai fait cela et ça fonctionne
edit : sous W7 64BIT et IE11 et office 2010
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111 #If Win64 Then Private Declare PtrSafe Function FindWindowExA& Lib "user32" (ByVal hParent&, ByVal hChild&, ByVal ClassName$, ByVal WindowName$) Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal MilliSeconds&) #Else Private Declare Function FindWindowExA& Lib "user32" (ByVal hParent&, ByVal hChild&, ByVal ClassName$, ByVal WindowName$) Private Declare Sub Sleep Lib "kernel32" (ByVal MilliSeconds&) #End If Const MSG = "DemoEuroNextCsvIEAuto :", PROC = "ThisWorkbook.IEAuto" '##############ajout oliv Const PROCSave = "ThisWorkbook.IEAutoEnregistrer" '############## Dim IE As New InternetExplorer, D As Date, H&, T! Sub DemoEuroNextCsvIEAuto() Const EG = "edit-go" T = Timer IE.Navigate "https://www.euronext.com/fr/popup/data/download?ml=nyx_pd_stocks&cmd=default&formKey=nyx_pd_filter_values%3A1006ef55d4998cc0fad71db6a6f38530" While IE.Busy Or IE.ReadyState < READYSTATE_COMPLETE: DoEvents: Wend If Not IsObject(IE.Document.all(EG)) Then IE.Visible = True: T = 0: Beep: Set IE = Nothing Else With Application If IIf(.UseSystemSeparators, .International(xlDecimalSeparator), .DecimalSeparator) = "," Then _ IE.Document.all("edit-decimal-separator-2").Checked = True End With IE.Document.all("edit-format-2").Checked = True IE.Document.all(EG).Click Do: H = FindWindowExA(IE.Hwnd, 0&, "Frame Notification Bar", vbNullString): Loop Until H ' Sleep 700 IE.Visible = True '##############modif oliv IEAutoEnregistrer '############## End If End Sub Private Sub IEAuto() Debug.Print "ieauto debut" Dim oIUIAIP As IUIAutomationInvokePattern, oCUIA As New CUIAutomation On Error Resume Next Set oIUIAIP = oCUIA.ElementFromHandle(ByVal H).FindFirst(TreeScope_Subtree, _ oCUIA.CreatePropertyCondition(UIA_NamePropertyId, "Ouvrir")). _ GetCurrentPattern(UIA_InvokePatternId) oIUIAIP.Invoke Set oIUIAIP = Nothing: Set oCUIA = Nothing If Err.Number Then Debug.Print MSG; Err.Number T = 0: Beep: Set IE = Nothing Else D = Now + 0.00002: Application.OnTime D, PROC End If End Sub '##############ajout oliv Private Sub IEAutoEnregistrer() Debug.Print "IEAutoEnregistrer debut" Dim oIUIAIP As IUIAutomationInvokePattern, oCUIA As New CUIAutomation On Error Resume Next Set oIUIAIP = oCUIA.ElementFromHandle(ByVal H).FindFirst(TreeScope_Subtree, _ oCUIA.CreatePropertyCondition(UIA_NamePropertyId, "Enregistrer")). _ GetCurrentPattern(UIA_InvokePatternId) If oIUIAIP Is Nothing Then D = Now + 0.00002: Application.OnTime D, PROC oIUIAIP.Invoke Set oIUIAIP = Nothing: Set oCUIA = Nothing If Err.Number Then Debug.Print "IEAutoEnregistrer"; Err.Number T = 0: Beep: Set IE = Nothing Else D = Now + 0.00002: Application.OnTime D, PROCSave End If End Sub '############## Private Sub Workbook_Deactivate() If ActiveWorkbook.Name Like "*_Equities_EU_*.csv" And T Then Debug.Print MSG; Format$(Timer - T, " 0.000s") On Error Resume Next Application.OnTime D, PROC, , False T = 0: IE.Quit: Set IE = Nothing On Error GoTo 0 Application.ScreenUpdating = False With ActiveWorkbook.ActiveSheet.Cells(1).CurrentRegion Feuil1.Name = .Cells(2, 1).Value & " " & .Cells(3, 1).Text .Cells(4, 1).Clear: Feuil1.UsedRange.Clear .Cells(5, 1).CurrentRegion.Copy Feuil1.Cells(2, 2) With Feuil1.Cells(2, 2).CurrentRegion Union(.Columns(5), .Columns(11)).HorizontalAlignment = xlCenter Union(.Columns("F:I"), .Columns(13)).NumberFormat = "#,##0.000 " .Columns(12).NumberFormat = "#,##0 " .Columns("A:D").AutoFit: .Columns(10).AutoFit: .Columns(13).AutoFit End With .Rows(1).Copy Feuil1.Cells(2) End With ActiveWorkbook.Close False With Feuil1 .[G1:N1].HorizontalAlignment = xlCenter .Cells(2).CurrentRegion.Columns(4).Replace "é", "é", xlPart .Activate: Cells(2, 1).Select: ActiveWindow.FreezePanes = True End With Application.ScreenUpdating = True End If End Sub ' Temporisations : - ligne 27 : conditionne l'ouverture du premier coup (effet "flash") ' - ligne 45 : délai du prochain IEAuto en cas de loupé (1 jour = 86400s * 0.00002 = 1.7s) ' Ligne 37 : bouton à déclencher
Salut Oliv et merci de ton retour !
Le contournement n'est pas compliqué s'agissant juste de changer le lecteur courant …
Je viens de tester sur Windows 8.1 & IE11 & Office 2010 : le bandeau affiche directement le bouton Ouvrir,
je n'ai pas comme toi la première partie avec le bouton Enregistrer, est-ce dû à un paramétrage ? …
Au passage dans cette version de Windows la dll est par défaut dans SysWOW64 …
J'ai ajouté mon code à la pièce jointe de mon précédent message avec les dll activées
car sans code sur certains ordinateurs je n'ai pas toujours ces dll activées ! Microsoft, tout un poème !
Sinon les deux boutons pourraient être inclus dans une seule procédure mais tu t'es bien débrouillé, félicitations !
C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)
re
bonjour ok c'est bon ca fonctionne
marc n'y aurait il pas moyen avec le dialog save as de le faire par macro ton astuce
peut être devrions nous enregistrer la 32 bit elle se trouve dans les deux chez moi (syswow et system 32) "UiAutomationcore.dll"
sinon ca fonctionne
j'aimerais quelque explication sur le code de ieauto :que fait elle exactement elle clique ou elle shunt cette étape et envoie le message au bandeau comme si c'était le bouton qui l'avait fait ?????
il faut maintenant que j'étudie cet api
en tout ca nickel quand ca fonctionne après selon les PCS c'est plus ou moins long on dirait j'ai vérifier sur mes 3 pc en utilisation ils n'ont pas la même versions
bravo!! depuis le temps que l'on cherchait ce purée de purée de click sur le bouton
dans la macro ieauto h est bien le handle ????
donc si tu arrive a envoyer le message je pense que les api post et sendmessage ne sont pas a la ramasse comme je croyais a étudier !!!!
reste a trouver l'astuce pour gérer cette erreur de chargement de DLL celle que tu propose reste un truc perso il faut trouver le moyen de rendre cela universel
ENCORE BRAVO !!! +3
mes fichiers dans les contributions:
mail avec CDO en vba et mail avec CDO en vbs dans un HTA
survol des bouton dans userform
prendre un cliché d'un range
si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
et n'oublie pas de voter
Je répète : m'étant déjà renseigné sur le sujet, c'est spécifique à Seven, aucun souci sous Windows 8.1 et
ce n'est pas un problème d'enregistrement de dll car si j'ouvre un classeur sauvegardé avec les dll activées sous Windows 8.1
sur un ordinateur sous Seven cela fonctionne sans souci, les dll restant bien activées, voir la pièce jointe de mon post #82 …
Par contre, pour un Seven 64 bits autant pointer sur SysWOW64 comme le fait Windows 8.1.
J'ai essayé sous Seven les dll de chaque dossier et je n'ai pas rencontré de souci …
Et franchement ce n'est pas compliqué de changer le répertoire courant via Enregistrer sous !
« C'est simple ! » comme il dit le p'tit gars de chez Renault.
L'astuce habituelle du net étant de copier la dll dans le répertoire courant …
Et maintenant avec ma pièce jointe il n'y a même pas à contourner !
La procédure appelle le bouton, c'est comme un click.
En consultant la documentation sur MSDN, Invoke active le contrôle et déclenche son action …
La variable H globale au niveau module est bien le handle du bandeau, elle est initialisée par la ligne de code n°26 …
Quant aux API post et sendmessage c'est bien plus usine à gaz qu'avec UIAutomation, j'y ai déjà laissé des plumes !
Patrick de ton côté tu as le bandeau avec Ouvrir direct ou c'est comme pour Oliv ?
C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)
re
ben en fait ca dépends des pages des fois j'ai simplement ouvrir des fois j'ai bien la combo a droite du bouton
c'est ce qui explique que les sendkeys déraillaient quelquefois si ca tombait sur la combo le enter ne faisant que développer la combo
attention quand même :hier a ma grande surprise j'ai notre bonne vielle fenêtre de téléchargement
c'est pour cela quand dans mes dernière version dans la discutions d'abc bourse dans le do loop je mettait les deux recherche de handle
je vais essayer de retrouver la page je t'envoie le lien si je la retrouve j'en visite tellement en ce moment j'apprend le JavaScript et jquery
après pour ton astuce sur la dll :je reste persuadé qu'il y a quelque chose a faire
imagine que tu distribue un code et que celui qui va l'utiliser ne pige pas une miette de ce que tu raconte (ca existe crois moi) et ben walouh!!!
si la dll avec dans le dossier du classeur fonctionne pourquoi pas faire une copie dynamique puis un kill je dis ca juste comme ca je n'ai jamais essayé
ps :attention marc la dll je l 'ai bien dans les deux dossier sur mes trois ordi en fonction
donc ton astuce doit être portée en fonction de la version 64/32 bits) de excel
sur mon seven ultimate c'est le syswow ultimate étant qu'en 64 bits et je tourne avec excel 2013 dedans j'ai testé!!!!
mes fichiers dans les contributions:
mail avec CDO en vba et mail avec CDO en vbs dans un HTA
survol des bouton dans userform
prendre un cliché d'un range
si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
et n'oublie pas de voter
Avec UIAutomation cela m'arrangerait de toujours avoir une fenêtre de téléchargement au lieu du bandeau
(est-ce paramétrable dans IE ?) comme avec Firefox car cela permettrait aussi de
détecter quand le téléchargement est vraiment disponible une fois le bouton OK non grisé,
je n'aurais plus besoin de la temporisation de la ligne de code n°27 pour déclencher l'ouverture du premier coup …
C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)
Je pense que c'est lié à la méthode qu'utilise le site pour envoyer le fichier excel.
re
un truc simple marc plus de manipulation a faire
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 Private Sub IEAuto() FileCopy "C:\Windows\System32\UIAutomationCore.dll", ThisWorkbook.Path & "\UIAutomationCore.dll" On Error Resume Next ThisWorkbook.VBProject.References.AddFromFile (ThisWorkbook.Path & "\UIAutomationCore.dll") Err.Clear Dim oIUIAIP As IUIAutomationInvokePattern, oCUIA As New CUIAutomation On Error Resume Next Set oIUIAIP = oCUIA.ElementFromHandle(ByVal H).FindFirst(TreeScope_Subtree, _ oCUIA.CreatePropertyCondition(UIA_NamePropertyId, "Ouvrir")). _ GetCurrentPattern(UIA_InvokePatternId) oIUIAIP.Invoke Set oIUIAIP = Nothing: Set oCUIA = Nothing If Err.Number Then Debug.Print MSG; Err.Number T = 0: Beep: Set IE = Nothing Else D = Now + 0.00002: Application.OnTime D, PROC End If Kill ThisWorkbook.Path & "\UIAutomationCore.dll" End Sub
je ne suis même pas sur que le file copy soit nécessaire finalement lurl dur fichier d'origine pourrait suffire finalement (pas testé!!)
mes fichiers dans les contributions:
mail avec CDO en vba et mail avec CDO en vbs dans un HTA
survol des bouton dans userform
prendre un cliché d'un range
si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
et n'oublie pas de voter
Patrick,
cela sert strictement à rien dans la procédure IEAuto car si la dll n'est pas référencée
cela bloque forcément à la compilation donc bien avant de pouvoir exécuter le code ‼
De toute manière une référence s'active manuellement avant d'écrire le code (Intellisense)
ou au plus tard lors de la première tentative d'exécution qui est forcément avortée
avec le message d'erreur que tu as pourtant publié dans ton post #77 !
Si au moins tu avais testé en copiant ton code dans un nouveau classeur en référençant juste Microsoft Internet Controls …
J'ai pourtant été clair : sous Seven, soit on modifie le répertoire courant pour activer la référence et une fois le classeur
enregistré c'est fini, soit on télécharge mon classeur du post #82 ! Pas besoin d'aucune autre manipulation …
C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)
re
fait moi plaisir marc test ca dans un fichier vierge enregistré en xls ou xlm
et regarde tes références
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 Sub test() FileCopy "C:\Windows\System32\UIAutomationCore.dll", ThisWorkbook.Path & "\UIAutomationCore.dll" On Error Resume Next ThisWorkbook.VBProject.References.AddFromFile (ThisWorkbook.Path & "\UIAutomationCore.dll") Err.Clear End Sub
en tout cas chez moi ca fonctionne !! je viens de faire le test 3 fois en reprenant ton code dans un fichier neuf a chaque fois
pour certaines reference VBA ne les reconnaissant pas il faut avoir activé "microsft visual basic extentibility x.x"
sans ca vbproject..... plante
mes fichiers dans les contributions:
mail avec CDO en vba et mail avec CDO en vbs dans un HTA
survol des bouton dans userform
prendre un cliché d'un range
si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
et n'oublie pas de voter
Une procédure dans un classeur séparé, oui …
Mais franchement pour une manipulation de deux secondes ! Et comme c'est définitif une fois le classeur enregistré …
Le gars qui n'arrive pas à simuler un Enregistrer sous ou encore à télécharger ma pièce jointe,
il est bon pour sucrer les fraises ‼
C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)
Voici une mise à jour de la procédure IEAuto du post #76 afin de déclencher d'abord le bouton Enregistrer
en cas d'absence du bouton Ouvrir lors de l'ouverture du bandeau de téléchargement (cf post #83 d'Oliv) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 Private Sub IEAuto() Dim oELMT As IUIAutomationElement, oIPAT As IUIAutomationInvokePattern, oCUIA As New CUIAutomation On Error GoTo Fin Do Set oELMT = oCUIA.ElementFromHandle(ByVal H).FindFirst(TreeScope_Subtree, _ oCUIA.CreatePropertyCondition(UIA_NamePropertyId, "Ouvrir")) If oELMT Is Nothing Then Set oIPAT = oCUIA.ElementFromHandle(ByVal H).FindFirst(TreeScope_Subtree, _ oCUIA.CreatePropertyCondition(UIA_NamePropertyId, "Enregistrer")) _ .GetCurrentPattern(UIA_InvokePatternId) oIPAT.Invoke Sleep 100 End If Loop While oELMT Is Nothing Set oIPAT = oELMT.GetCurrentPattern(UIA_InvokePatternId) oIPAT.Invoke Set oIPAT = Nothing: Set oELMT = Nothing: Set oCUIA = Nothing D = Now + 0.00002: Application.OnTime D, PROC Exit Sub Fin: Debug.Print MSG; Err.Number T = 0: Beep: Set IE = Nothing Set oIPAT = Nothing: Set oELMT = Nothing: Set oCUIA = Nothing End Sub
C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)
Marc,
excellente idée de passer par UIAutomationClient...idée à creuser :
Pour la déclaration des API en 64 bits :
Il y a cependant un problème quand je teste ta procédure sur Excel 2010 64 bits : la procédure va au bout mais Excel cesse de fonctionner et je dois le redémarrer.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 #If Win64 Then Private Declare PtrSafe Function FindWindowExA Lib "user32" _ (ByVal hWnd1 As LongPtr, ByVal hWnd2 As LongPtr, _ ByVal lpsz1 As String, ByVal lpsz2 As String) As LongPtr Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal MilliSeconds As Long) Dim h As LongLong #Else Private Declare Function FindWindowExA Lib "user32" _ (ByVal hParent&, ByVal hChild&, ByVal ClassName$, ByVal WindowName$) Private Declare Sub Sleep Lib "kernel32" (ByVal MilliSeconds&) Dim h As Long #End If
C'est la Sub Workbook_Deactivate qui fait planter Excel.
A+
Ah mince ! Je vais retarder alors ma version se configurant automatiquement pour le Sleep effet "flash" …
Je suppose que tu as bien pointé sur le dossier SysWOW64 pour la dll …
Sinon en mode pas à pas, à quel endroit cela plante-t-il ?
La variable H en Long ne passe pas en 64 bits ?
C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)
par défaut c'est le system32 qui est pointé...et même si je fais Outils>références>cocher UIAutomationClient>parcourir et que je vais sélectionner la chemin de dossier C:\Windows\SysWOW64\UIAutomationCore c'est celui placé dans System32 qui est pointé lorsque j'active UIAutomationClient.Je suppose que tu as bien pointé sur le dossier SysWOW64 pour la dll …
Nulle part : la procédure va jusqu'à son terme puis Excel cesse de fonctionner.Sinon en mode pas à pas, à quel endroit cela plante-t-il ?
Non cela engendre une erreur d'incompatibilité de type...logique car ie.Hwnd ramène un LongLong en 64 bits donc donc il est logique que h qui a besoin de la valeur de ie.Hwnd soit également un LongLong.La variable H en Long ne passe pas en 64 bits ?
D'ailleurs il me paraît a priori plus logique de déclarer FindWindowExA en 64 bits comme celaet non avec des LongPtr à la place des LongLong mais cela fonctionne dans les deux cas donc...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 Private Declare PtrSafe Function FindWindowExA Lib "user32" _ (ByVal hWnd1 As LongLong, ByVal hWnd2 As LongLong, _ ByVal lpsz1 As String, ByVal lpsz2 As String) As LongLong
A+
Sur Windows 8.1 64 bits c'est SysWOW64 qui est automatiquement pointé pour la dll et sans besoin d'une manip …
(pièce jointe du post # 82)
Pour le plantage avec ton Excel en 64 bits je ne vois pas …
Tente en modifiant le code du post #76 ainsi :
• ligne n°10 : Dim IE As InternetExplorer, D As Date, H&, T!
• ajouter avant la ligne n°15 : Set IE = New InternetExplorer …
C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)
Quand j'ouvre la PJ du post #82 c'est system32 qui est automatiquement pointé.
Ce n'est pas un problème de déclaration et d'instanciation de l'objet IE...ce n'est pas la 1ère fois que l'un de tes codes plante chez moi lorsque l'événement Deactivate est utilisé, même si dans la plupart des cas cela fonctionne. Je n'ai pas d'explication pour l'instant.
A+
Merci de ton retour;
je n'ai jamais eu ce souci sur plusieurs ordinateurs mais il est vrai leurs différentes versions d'Excel sont en 32 bits …
Sur l'autre discussion tu déclares IE avec SHDocVw.InternetExplorer, as-tu essayé ainsi ici ?
C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager