Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

copier une donne dans un autre programme et revenir collé dans excel

26 réponses
Avatar
pellet15
Bonjour =E0 tous

Je voudrait corriger la proc=E9dure suivante:
a la premier ligne j'ouvre un programme qui me permet de r=E9cup=E9rer la d=
onn=E9 GPS=20
mais je voudrait l'ouvrire plus t=F4t a l'ouverture de EXCEL (parce que il =
prend un peut de temps pour capter les satellite,3=E05 min)

Pr=E9sentement il ouvre un autre a chaque fois que je l'ex=E9cute.

Pour le reste de la proc=E9dure =E7a fonctionne mais il y a que=20
je pr=E9f=E9rerais revenir a Excel et ne pas voire le tableau du programme =
(g7towin.exe)a l'avant plan.
Il y a t'il une autre fa=E7ons que Alt_Tal et Ctrl-P
ou que cela s=92ex=E9cute en arri=E8re plan.

Sub Ouvrir_g7()
MyAppID =3D Shell("C:\g7towinwithhelp\g7towin.exe", 1)
Application.Wait (Now + TimeValue("00:00:02"))
SendKeys "^p", True ' ----copie la longitude et la latitude----
Application.Wait (Now + TimeValue("00:00:01"))
SendKeys "%{tab}", True ' ---retourne a EXCEL ---
Dim Presspp As New DataObject
Set Pressp =3D New DataObject
Presspp.GetFromClipboard
Sheets("Donne").Select
Range("AY1").Select
ActiveSheet.Paste ' ----colle la donn=E9 longitude et la latitude----
End Sub

Merci

10 réponses

1 2 3
Avatar
Gloops
pellet15 a écrit, le 25/03/2012 18:13 :
MyAppID = Shell("C:g7towinwithhelpg7towin.exe", 1)




Je viens de relire l'aide de la fonction Shell : elle renvoie un
identifiant de tâche.

Dans un appel Automation on appellerait l'application par

objApp = CreateObject(chemin)

quand il s'agit d'ouvrir l'application, ou

objApp = GetObject(chemin)

quand il s'agit de sélectionner une application ouverte.
En retour, on obtient des objets qui représentent l'application visée .

On utilise ça quand on veut envoyer des commandes Automation à
l'application, il faut a priori que ce soit une application
programmable, comme le sont les applications du pack Office avec VBA. Il
faut aussi que l'application assure le support d'Automation.

Puisque soit l'application source n'assure pas le support d'Automation
soit tu n'as pas souhaité approfondir la question, il s'agira de
sélectionner la fenêtre pour y envoyer une simulation de touche, pour
cela on utilisera les API. Ce qu'on obtiendra, en retour de FindWindow,
sera non pas un identifiant de tâche, ni un objet, mais un identifiant
de fenêtre.
On ne peut donc pas mélanger les deux approches -trois même, si on
distingue Shell de GetObject ou CreateObject.

Il me semble que allapi.mentalis.org présente clairement l'utilisation
des API, avec toutefois le défaut de n'exister qu'en Anglais.
Avatar
Gloops
Gloops a écrit, le 26/03/2012 22:35 :
De toute manière c'est simple, une fois que tu as réussi à envoye r ton
Ctrl P au programme, tu ouvres un bloc-notes pour coller le résultat
dedans : si tu as bien les infos voulues c'est que cette partie est
réussie, après il reste à vérifier l'intégration du presse-pa piers à
Windows.



Oups, je voulais dire la récupération du contenu du presse-papiers
depuis Excel.
Tu auras corrigé j'imagine ?
C'est la suite de ta procédure.
Avatar
Gloops
Gloops a écrit, le 26/03/2012 23:04 :
Je viens de relire l'aide de la fonction Shell : elle renvoie un
identifiant de tâche.



J'imagine que les programmeurs de niveau avancé qui pratiquent le
multi-tâches / multi-threading, sont en mesure d'en dire plus sur
l'utilisation de cet identifiant de tâche. Ce qui ne signifie pas
nécessairement que tu y comprendrais grand-chose.

Pour ma part, la seule utilisation que j'aie eu l'occasion d'en faire,
c'est de vérifier qu'il est différent de zéro, pour m'assurer que
l'application a bien été ouverte.

Il est vrai que je m'en sers moins maintenant que je recours un peu plus
systématiquement à Automation (par exemple pour un export vers Excel,
depuis Access). C'est une opération qui suppose de maîtriser la
programmation de modules dans les deux applications (l'application
appelée qu'on appelle serveur, et l'application appelante qu'on appelle
client -lesquelles peuvent se trouver sur la même machine, ou sur des
machines distantes).
Avatar
Gloops
Gloops a écrit, le 26/03/2012 22:43 :
Pour que ça marche, il faut placer en tête de module les signatures des
API, et bien respecter la syntaxe d'appel. Le mieux est de bien
s'inspirer des exemples fournis sur allapi.mentalis.org (les liens vers
les pages d'exemples sont en bas des pages de descriptions).



L'exemple le plus proche est "Foreground window".

Quelques commentaires peut-être :
Les signatures des API, en tête du module, sont précédées de Priv ate,
car Form_Load en dessous suppose que nous sommes dans un module lié à un
formulaire Access. Un module de formulaire Access ne peut pas contenir
de déclaration publique d'une API.

Pour adapter à Excel :
- la clause Private, dans un module, n'est pas obligatoire, mais dans la
mesure où l'API sera appelée du même module, il vaut autant la lais ser,
ça évitera, en voulant lancer une procédure par Alt F8, de se retro uver
avec les signatures des API dans la liste, ce qui ne ferait qu'apporter
de la confusion
- Form_Load sera à remplacer par un nom de procédure Sub plus appropr ié,
comme SelectionneFenetre
- le titre de la fenêtre doit être modifié, puisque là il ne s'ag it pas
d'ouvrir ThunderRT5Form. Il est possible de le passer en argument de la
procédure si on veut pouvoir sélectionner d'autre fenêtres que g7to win

Ah oui attention, le premier argument est la classe. Tu ne la connais
pas nécessairement, je ne me rappelle plus si il faut ne rien mettre, o u
mettre une chaîne vide, c'est un des deux. Ci-dessous j'essaie avec une
chaîne vide.

Si je synthétise tout ce que je viens de dire ça donne un module qui
contient ce qui suit. Pour l'appel, la première ligne de ta procédure
sera remplacée par SelectionneFenetre, suivi du titre de la fenêtre,
attention à l'orthographe, et attention à ne pas oublier des guilleme ts
autour.

Le SendKeys vient juste après, pas de changement.

________________________ Début du module modSelFenetre
'Déclaration des API
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long

Private Declare Function SetForegroundWindow Lib "user32" _
(ByVal hwnd As Long) As Long

Declare Function SetFocus Lib "user32" Alias "SetFocus" _
(ByVal hwnd As Long) As Long

Declare Function SetActiveWindow Lib "user32.dll" _
(ByVal hwnd As Long) As Long

' *************************************************

Public Sub SelectionneFenetre(TitreFenetre As String)
' ne pas oublier de mettre Public pour cette procédure,
' dans la mesure où on la met dans un module à part.
' Public permettra de l'appeler depuis
' la procédure principale.

'adapté de :
'KPD-Team 1999
'URL: http://allapi.mentalis.org/apilist/SetActiveWindow.shtml
'exemple Set Active Window

Dim hWnd As Long, lHandle As Long

hWnd = FindWindow("", TitreFenetre)
SetFocus hWnd
ActivateWindow hWnd


'lHandle = SetForegroundWindow(hWnd)

'foreground, c'est le premier plan ;
'si on prend le nom au premier degré, pas nécessaire
'pour envoyer une simulation de touche
'surtout que tu as précisé préférer
'que l'application reste en arrière plan.
'A vérifier toutefois si le focus fonctionne sans ça


End Sub


____________ Fin du module modSelFenetre

A toi de voir quels commentaires il est utile de laisser ;)

Ceux indiquant la source du code sont à laisser, par correction.

Ah tiens j'ai mis ça à jour, ils ont laissé l'ancienne adresse du s ite.
Pour la même raison j'ai enlevé leur e-mail (d'ailleurs c'est vrai qu e
le publier dans un newsgroup n'est pas nécessairement une bonne idée) ,
il vaut autant utiliser le lien "Contact form", à gauche de la page.
Enfin à supposer qu'il y ait une question qui ne trouve pas réponse i ci,
et j'imagine que sur le site il vaudra autant poser la question en Anglai s.
Avatar
MichD
Bonjour,

Sous Windows 64 bits, la déclaration des API est un peu différente :
Vous pouvez télécharger un petit fichier qui vous donne le texte des déclarations Version 64 bits à cette adresse :
http://www.microsoft.com/download/en/details.aspx?id™70
Après avoir exécuté le petit fichier, vous devriez retrouver dans un fichier Texte "Win32API_PtrSafe.TXT" dans le répertoire
:
C:Office 2010 Developer ResourcesDocumentsOffice2010Win32API_PtrSafe


Déclaration des API dans le haut du module
'--------------------------
Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr

Declare PtrSafe Function SetFocus Lib "user32" (ByVal hwnd As LongPtr) As LongPtr
Declare PtrSafe Function SetActiveWindow Lib "user32" (ByVal hwnd As LongPtr) As LongPtr
Declare PtrSafe Function SetForegroundWindow Lib "user32" (ByVal hwnd As LongPtr) As Long
'--------------------------

'--------------------------
Public Sub SelectionneFenetre(TitreFenetre As String)
Dim X As LongPtr
X = FindWindow(vbNullString, TitreFenetre)
SetFocus X
SetActiveWindow X
End Sub
'--------------------------

Sub test()
Dim Titre As String
Titre = "Microsoft Excel - FindWindow.xlsm"
SelectionneFenetre Titre
End Sub
'--------------------------

IMPORTANT : Est-ce que quelqu'un veut tester les procédures précédentes?
Dans mon environnement, ceci X = FindWindow(vbNullString, TitreFenetre) retourne
le "Handle" de la fenêtre seulement si le titre de l'application est celui de l'application
dans lequel il se retrouve.

Exemple : 2 classeurs ouverts
Si le classeur actif (présent à l'écran) est le classeur dans lequel la procédure est écrite, c'est OK
sinon, X est toujours égale à 0.



MichD
------------------------------------------
Avatar
Gloops
MichD a écrit, le 27/03/2012 17:46 :
Bonjour,

Sous Windows 64 bits, la déclaration des API est un peu différente



Il a un système 64 bits, pellet ?
Ah, je ne savais pas ...
Avatar
MichD
| Il a un système 64 bits, pellet ?

Je n'en ai point d'idée!

Une autre manière de procéder pour Windows 64 bits ou les autres Windows 32 bits :

'Déclaration des API dans le haut du module standard
#If Win64 = True Then 'Pour Windows 64 bits
Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Declare PtrSafe Function BringWindowToTop Lib "user32" _
(ByVal hwnd As LongPtr) As Long
Else 'Pour Windows 32 bits
Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Declare Function BringWindowToTop Lib "user32" (ByVal hwnd As Long) As Long
#End If

'Un exemple de code :

'--------------------------------------------------
Sub Test()
Dim T As String, S As String
Dim X As Long, Wk As Workbook

'ThisWorkbook représente le classeur où est écrite la macro
Set Wk = ThisWorkbook
'Ou le classeur que l'on veut
'set Wk = Workbooks("Mon_Classeur.xlsm")

'Le titre de la barre de titre de l'application
T = "Adobe Reader"

X = FindWindow(vbNullString, T)

'Envoie de la séquence des touches
SendKeys "%e" 'Pour les fins de l'exemple

'La fenêtre demandée devient affichée à l'écran
BringWindowToTop X

'Affiche l'application Excel à l'écran
BringWindowToTop Application.hwnd

'S'assure que le classeur d'origine est le classeur actif
Wk.Activate

End Sub
'--------------------------------------------------


MichD
------------------------------------------
Avatar
Gloops
C'est vrai que je n'y pense pas souvent, aux systèmes 64 bits.
On les trouve dans quels secteurs, scientifiques surtout j'imagine ?
Et chez les entrepreneurs de statistiques ?


--- Posted via news://freenews.netfront.net/ - Complaints to ---
Avatar
MichD
Et pour ceux qui voudraient consulter la liste des API 32 bits,
voir à cette adresse : http://www.microsoft.com/download/en/details.aspx?id427



MichD
------------------------------------------
Avatar
pellet15
Le mercredi 28 mars 2012 14:52:13 UTC-4, MichD a écrit :
Et pour ceux qui voudraient consulter la liste des API 32 bits,
voir à cette adresse : http://www.microsoft.com/download/en/details.as px?id427



MichD
------------------------------------------



Bonjour MichD

La procédure suivant fonctionne bien, mais je voudrait avant de retourn é a EXCEL fermer le programme ("C:g7towinwithhelpg7towin64.exe", 1)...

Sub Ouvrir_g7()
Application.ScreenUpdating = False
MyAppID = Shell("C:g7towinwithhelpg7towin64.exe", 1)
SendKeys "^p", True ' ----copie la longitude et la latitude----

' ICI ----fermer le programme ( g7towin64 ) ---

SendKeys "%{tab}", True ' ---retourne a EXCEL ---
Dim Presspp As New DataObject
Set Pressp = New DataObject
Presspp.GetFromClipboard
Sheets("Donne").Select
Range("AZ1").Select
ActiveSheet.Paste ' ----colle la donné longitude et la latitude----
End Sub

Comment écrire cette ligne ?

Merci pour votre Aide....
1 2 3