ExcelWriter Ecrire dans un classeur Excel ouvert
ExcelWriter Ecrire dans un classeur Excel ouvert
Bonjour
Je voudrais écrire des résultats d'un programme en PureBasic dans un classeur excel qui est déjà mis en forme.J'ai testé ExcelWriter ça marche, bien,sauf que je ne vois pas comment faire pour écrire dans un classeur ouvert.J'ai l'impression qu'il faut toujours créer à un nouveau fichier avec XLS_ CreateFile.
Existe-t-il une autre façon de faire ou une autre librairie pour travailler avec excel, sachant aussi que je voudrais selectionner des feuilles dans
ce classeur.
Merci par avance pour vos réponses possibles
Je voudrais écrire des résultats d'un programme en PureBasic dans un classeur excel qui est déjà mis en forme.J'ai testé ExcelWriter ça marche, bien,sauf que je ne vois pas comment faire pour écrire dans un classeur ouvert.J'ai l'impression qu'il faut toujours créer à un nouveau fichier avec XLS_ CreateFile.
Existe-t-il une autre façon de faire ou une autre librairie pour travailler avec excel, sachant aussi que je voudrais selectionner des feuilles dans
ce classeur.
Merci par avance pour vos réponses possibles
- Kwai chang caine
- Messages : 6989
- Inscription : sam. 23/sept./2006 18:32
- Localisation : Isere
Bonjour MALO
Comme c'est la premiere fois que je te parle, je te souhaite la "bianvonoue dans notre humble boutique, hihihihihi !!!"
Je ne connais pas trop ExcelWriter, je sais que ça marche bien.
De memoire je crois que c'est de notre ami FLYPE.
Maintenant, en attendant que tu ai une reponse sur cette lib, tu peux aussi peut etre aller jeter un coup d'oeil, sur le formidable travail de SROD.
COMATE Plus qui est un gestionnaire OLE complet tiré de la lib C Dishelper et en plus open source.
Avec ça tu peut tout faire ce que fait VB dans le domaine du COM(Component object model)
Ca fait beaucoup de lecture, parce que y'a des centaines de POST dans ce sujet, mais ça vaut vraiment le coup, car avec COMATE tu n'est pas limité a EXCEL, tu peux gerer tous les softs MICROSOFT si ils sont OLE
http://www.purebasic.fr/english/viewtop ... mate+excel
Y'a aussi la meme chose avec le non moins grand travail de TsSoft et son Puredishelper qui par contre est une LIB et qui n'est pas open source.
Voila voila......bon courage
Comme c'est la premiere fois que je te parle, je te souhaite la "bianvonoue dans notre humble boutique, hihihihihi !!!"

Je ne connais pas trop ExcelWriter, je sais que ça marche bien.
De memoire je crois que c'est de notre ami FLYPE.
Maintenant, en attendant que tu ai une reponse sur cette lib, tu peux aussi peut etre aller jeter un coup d'oeil, sur le formidable travail de SROD.
COMATE Plus qui est un gestionnaire OLE complet tiré de la lib C Dishelper et en plus open source.
Avec ça tu peut tout faire ce que fait VB dans le domaine du COM(Component object model)
Ca fait beaucoup de lecture, parce que y'a des centaines de POST dans ce sujet, mais ça vaut vraiment le coup, car avec COMATE tu n'est pas limité a EXCEL, tu peux gerer tous les softs MICROSOFT si ils sont OLE
http://www.purebasic.fr/english/viewtop ... mate+excel
Y'a aussi la meme chose avec le non moins grand travail de TsSoft et son Puredishelper qui par contre est une LIB et qui n'est pas open source.
Voila voila......bon courage

Bonsoir Kwai chang caine
Merci pour ta bienvenue et pour ta réponse.
J'ai été voir ton lien mais malheureusement je n'ai pas pu l'apprécier à sa juste valeur ne connaissant pas l'anglais, mais bon....
J'ai téléchargé comate pb 4.3 et ComatePlus et j'ai voulu tester les exemples mais à chaque fois j'ai une erreur à l'execution :
" Ligne33 : Structure introuvable iUnknown"
Declare.i COMate_WrapCOMObject(object.iUnknown)
dans COMate_Residents.pbi.
Je teste pour le moment PureBasic avec la version de démo
As-tu une idée?
Merci pour ta bienvenue et pour ta réponse.
J'ai été voir ton lien mais malheureusement je n'ai pas pu l'apprécier à sa juste valeur ne connaissant pas l'anglais, mais bon....
J'ai téléchargé comate pb 4.3 et ComatePlus et j'ai voulu tester les exemples mais à chaque fois j'ai une erreur à l'execution :
" Ligne33 : Structure introuvable iUnknown"
Declare.i COMate_WrapCOMObject(object.iUnknown)
dans COMate_Residents.pbi.
Je teste pour le moment PureBasic avec la version de démo
As-tu une idée?
- Kwai chang caine
- Messages : 6989
- Inscription : sam. 23/sept./2006 18:32
- Localisation : Isere
- Progi1984
- Messages : 2659
- Inscription : mar. 14/déc./2004 13:56
- Localisation : France > Rennes
- Contact :
Je confirme dans les deux cas.Kwai chang caine a écrit :J'ai bien peur que COMATE fasse appel, de nombreuses fois aux API
Et la gestion des API n'est pas possible, je crois avec la demo
Librairies & Applications : https://www.purebasic.fr/french/viewtop ... f=8&t=6220
Site Web : https://rootslabs.net
Site Web : https://rootslabs.net
L'appel direct sans déclaration [ MaFonctionAPI_() ] n'est pas possible, par contre çà devrait être possible en utilisant OpenLibrary(), c'est à dire en utilisant les DLL 'système' (USER32.DLL, etc...) comme des DLL 'utilisateur', la bibliothèque LIBRARY étant fonctionelle dans la démo.Kwai chang caine a écrit :Et la gestion des API n'est pas possible, je crois avec la demo
Merci pour vos réponses. je vais faire l'acquisition de PureBasic , car je vais certainement coincer sur d'autres sujets. Ce language m'a vraiment séduit même avec la version démo. je vais envoyer un chèque à Fred ( je suis un peu parano pour les paiements en ligne... )
Pour les explications de gnozal je n'ai pas bien compris ce que je dois mettre dans OpenLibrary(#Bibliotheque, NomFichier$) à la place de #Bibliotheque, et de NomFichier$.
Pour les explications de gnozal je n'ai pas bien compris ce que je dois mettre dans OpenLibrary(#Bibliotheque, NomFichier$) à la place de #Bibliotheque, et de NomFichier$.
- Kwai chang caine
- Messages : 6989
- Inscription : sam. 23/sept./2006 18:32
- Localisation : Isere
OpenLibrary, c'est pas trop compliqué.....car j'y arrive
(C'est un signe)
Car si tu as la geniale idée de rejoindre notre communauté, tu verras que si KCC, il y arrive.....tout le monde il y arrive
A part peut etre un seul et encore parfois..... il m'epate
Pour OpenLibrary(#Bibliotheque, NomFichier$)
Le #Bibliotheque c'est une constante, donc un chiffre qui ne change jamais dans le programme.
Tu choisi celle que tu veux de 0 à 1000 ou plus meme peut etre.
Mais apres ce chiffre sera attribué a la DLL parmis les DLL et ceci tant qu'elle n'est pas refermée.
Et NomFichier$ c'est plutot le NomDeDll$
Regarde ça :
http://www.purebasic.com/french/documen ... e/dll.html
Si tu envoi ton cheque.....bienvenue dans la famille

Car si tu as la geniale idée de rejoindre notre communauté, tu verras que si KCC, il y arrive.....tout le monde il y arrive

A part peut etre un seul et encore parfois..... il m'epate

Pour OpenLibrary(#Bibliotheque, NomFichier$)
Le #Bibliotheque c'est une constante, donc un chiffre qui ne change jamais dans le programme.
Tu choisi celle que tu veux de 0 à 1000 ou plus meme peut etre.
Mais apres ce chiffre sera attribué a la DLL parmis les DLL et ceci tant qu'elle n'est pas refermée.
Et NomFichier$ c'est plutot le NomDeDll$
Regarde ça :
http://www.purebasic.com/french/documen ... e/dll.html
Si tu envoi ton cheque.....bienvenue dans la famille

Pour OpenLibrary ; #Bibliotheque j'ai bien compris mais pour NomDeDll$ comme tu ecris , si tu as une DLL pas de problème mais dans le cas de COMate , je n'ai pas trouvé de nom de DLL à mettre à la place....J'ai quand même essayé USER32.DLL a tout hasard , mais non..Je dois être mauvais...
Comme je viens de commander ma licence, je pense que d'ici la fin de la semaine je verrais comment fonctionne COMate déjà avec les exemples.
Je pense que " le petit scarabé " devenu grand, est bien plus malin qui ne le laisse croire.
Comme je viens de commander ma licence, je pense que d'ici la fin de la semaine je verrais comment fonctionne COMate déjà avec les exemples.
Je pense que " le petit scarabé " devenu grand, est bien plus malin qui ne le laisse croire.
- Kwai chang caine
- Messages : 6989
- Inscription : sam. 23/sept./2006 18:32
- Localisation : Isere
C'est gentil.....mais ça serait encore mieux si c'etait vraiJe pense que " le petit scarabé " devenu grand, est bien plus malin qui ne le laisse croire.

Pour COMATE c'est pas une DLL, c'est un INCLUDE.....
Un INCLUDE dans ce cas, c'est un fichier qui est une source que tu peux lire....mais attention pas touche aux hieroglyphe....meme si c'est joli...chaque "dessin" est utile.
Et SROD il aime pas trop qu'on lui tripote le COMATE

Donc tu as juste a mettre COMATE.pbi quelque part, donner le chemin de l'include et hop...le COMATE y saute dans ton code et se rajoute a tout ce que tu as ecris....c'est pas magique PB

Quoi qu'il en soit...le COMATE apparement il est pas fait pour etre enfermé dans une DLL.
Il aime avoir les narpions au soleil et que tout le monde les voient

C'est SROD itself qui viens de le dire dans son POST.
Donc INCLUDE il est ...INCLUDE il restera
Quand a PureDisHElper de TsSoft, c'est une lib.
C'est a dire qu'il n'est pas open source, tu le depose dans les fichiers de PB, comme c'est expliqué...et hop tu peux taper les commander OLE de PureDishelper comme si elles etaient native....c'est pas magique PB ...

Ah ouaih j'crois qu'j'lai deja dit

Je te remercie, pour ces explications mais voilà :
Dans le fichier demo il y a ça:
IncludePath "..\"
XIncludeFile "COMate.pbi"
et dans le fichier COMate.pbi il y a ça :
XIncludeFile "COMate_Residents.pbi"
et donc quand je fais F5 sur le fichier démo là survient le problème.
Comme dit précédemment la version de démo pose problème .
Par ailleurs , ça sert à quoi un fichier _Residents.pbi?
Dans le fichier demo il y a ça:
IncludePath "..\"
XIncludeFile "COMate.pbi"
et dans le fichier COMate.pbi il y a ça :
XIncludeFile "COMate_Residents.pbi"
et donc quand je fais F5 sur le fichier démo là survient le problème.
Comme dit précédemment la version de démo pose problème .
Par ailleurs , ça sert à quoi un fichier _Residents.pbi?
- Kwai chang caine
- Messages : 6989
- Inscription : sam. 23/sept./2006 18:32
- Localisation : Isere
Ca c'est l'appel de l'includeDans le fichier demo il y a ça:
IncludePath "..\"
XIncludeFile "COMate.pbi"
Premiere ligne tu as le chemin des includes, selon le chemin que tu entre ici, PB ira chercher tous les includes a cet endroit la
La seconde est l'include COMATE a part entiere
Dans COMATE y'a aussi des includes
En fait tu peux metre des INCLUDES qui incluent d'autre INCLUDES et ainsi de suite pantoufle

Resident.pbi est donc un INCLUDE qui est necessaire a l'INCLUDE COMATE
Evidement il faut que COMATE le trouve, sinon...BOUING

Je pense que SROD a séparé les constantes ou un truc de ce genre...
En fait j'ai meme pas regardé, ce que je sais...C'est qu'il est necessaire.
Encore une fois tu prend COMATE et son resident et tout les fichiers qu'il demande et meme pas tu va mettre le nez dedans
COMATE y marche tout seul comme un grand, faut surtout pas mettre les mains dans le moteur....et encore moins quand on est pas mecano

Je viens de télécharger la version complète sur purebasic.com, et en effet les problèmes sur COMate venaient de la version de démo.
Je vais tester et essayer de comprendre les différents exemples de COMate. Je pense que j'aurais besoin de compléments d'informations sur le travail avec Excel.
Merci et à bientôt pour de nouvelles questions
Je vais tester et essayer de comprendre les différents exemples de COMate. Je pense que j'aurais besoin de compléments d'informations sur le travail avec Excel.
Merci et à bientôt pour de nouvelles questions
sans utiliser les objet com, tu peux peut-être "écrire" dans un classeur ouvert dans excel en utilisant une fonction de l'api windows qui permet d'envoyer des séquences de touche à une application externe ( je m'en sert pour envoyer des commandes dans AutoCAD )
j'utilise la fonction Fenetres_Ouvertes() pour rechercher le fenetre autocad et recuperer son handle.
le deuxieme exemple est un peu plus chiadé (je ne l'ai pas testé et ce n'est pas de moi...)
ces codes ont été récupérés sur les forums anglais et français, et adaptés au fur et a mesure aux différentes versions de pb.
pat
j'utilise la fonction Fenetres_Ouvertes() pour rechercher le fenetre autocad et recuperer son handle.
le deuxieme exemple est un peu plus chiadé (je ne l'ai pas testé et ce n'est pas de moi...)
ces codes ont été récupérés sur les forums anglais et français, et adaptés au fur et a mesure aux différentes versions de pb.
Code : Tout sélectionner
#RC = Chr(13)
#ECHAP = Chr(27)
Structure STR_ACAD_INFO
Acad_title.s
Acad_hWnd.l
EndStructure
Global AutoCAD_TEXT.STR_ACAD_INFO
Global AutoCAD_GRAF.STR_ACAD_INFO
; SendKeys procedure by PB -- do whatever you want with it. :)
; Syntax: r=SendKeys(handle,window$,key$) ; r = 0 for failure.
; Specify either a handle or window$ title to type to, but not both!
; You cannot type curly braces { } as part of the keystrokes, sorry!
Procedure SendKeys(handle,window$,keys$)
If window$<>"" : handle=FindWindow_(0,window$) : EndIf ; Use window$ instead of handle.
If IsWindow_(handle)=0 ; Does the target window actually exist?
ProcedureReturn 0 ; Nope, so report 0 for failure to type.
Else
; This block gives the target window the focus before typing.
thread1=GetWindowThreadProcessId_(GetForegroundWindow_(),0)
thread2=GetWindowThreadProcessId_(handle,0)
If thread1<>thread2 : AttachThreadInput_(thread1,thread2,#True) : EndIf
SetForegroundWindow_(handle) ; Target window now has the focus for typing.
Sleep_(125) ; 1/8 second pause before typing to prevent fast CPU problems.
; Now the actual typing starts.
keybd_event_(#VK_MENU,0,#KEYEVENTF_KEYUP,0) ; Release ALT key before typing.
keybd_event_(#VK_CONTROL,0,#KEYEVENTF_KEYUP,0) ; Release CONTROL key before typing.
keybd_event_(#VK_SHIFT,0,#KEYEVENTF_KEYUP,0) ; Release SHIFT key before typing.
keybd_event_(#VK_LWIN,0,#KEYEVENTF_KEYUP,0) ; Release WINDOWS key before typing.
For r=1 To Len(keys$)
vk$=Mid(keys$,r,1)
If vk$="{" ; Special key found.
s=FindString(keys$,"}",r+1)-(r+1) ; Get length of special key.
s$=Mid(keys$,r+1,s) ; Get special key name.
Select s$ ; Get virtual key code of special key.
Case "ALTDOWN" : keybd_event_(#VK_MENU,0,0,0) ; Hold ALT down.
Case "ALTUP" : keybd_event_(#VK_MENU,0,#KEYEVENTF_KEYUP,0) ; Release ALT.
Case "BACKSPACE" : vk=#VK_BACK
Case "CONTROLDOWN" : keybd_event_(#VK_CONTROL,0,0,0) ; Hold CONTROL down.
Case "CONTROLUP" : keybd_event_(#VK_CONTROL,0,#KEYEVENTF_KEYUP,0) ; Release CONTROL.
Case "DELAY" : vk=0 : Sleep_(1000) ; Delay typing for one second.
Case "DELETE" : vk=#VK_DELETE
Case "DOWN" : vk=#VK_DOWN
Case "END" : vk=#VK_END
Case "ENTER" : vk=#VK_RETURN
Case "ESCAPE" : vk=#VK_ESCAPE
Case "F1" : vk=#VK_F1
Case "F2" : vk=#VK_F2
Case "F3" : vk=#VK_F3
Case "F4" : vk=#VK_F4
Case "F5" : vk=#VK_F5
Case "F6" : vk=#VK_F6
Case "F7" : vk=#VK_F7
Case "F8" : vk=#VK_F8
Case "F9" : vk=#VK_F9
Case "F10" : vk=#VK_F10
Case "F11" : vk=#VK_F11
Case "F12" : vk=#VK_F12
Case "HOME" : vk=#VK_HOME
Case "INSERT" : vk=#VK_INSERT
Case "LEFT" : vk=#VK_LEFT
Case "PAGEDOWN" : vk=#VK_NEXT
Case "PAGEUP" : vk=#VK_PRIOR
Case "PRINTSCREEN" : vk=#VK_SNAPSHOT
Case "RETURN" : vk=#VK_RETURN
Case "RIGHT" : vk=#VK_RIGHT
Case "SPACE" : vk=#VK_SPACE
Case "SHIFTDOWN" : shifted=1 : keybd_event_(#VK_SHIFT,0,0,0) ; Hold SHIFT down.
Case "SHIFTUP" : shifted=0 : keybd_event_(#VK_SHIFT,0,#KEYEVENTF_KEYUP,0) ; Release SHIFT.
Case "TAB" : vk=#VK_TAB
Case "UP" : vk=#VK_UP
Case "WINDOWS" : vk=#VK_LWIN
EndSelect
If Left(s$,3)<>"ALT" And Left(s$,7)<>"CONTROL" And Left(s$,5)<>"SHIFT"
keybd_event_(vk,0,0,0) : keybd_event_(vk,0,#KEYEVENTF_KEYUP,0) ; Press the special key.
EndIf
r+s+1 ; Continue getting the keystrokes that follow the special key.
Else
vk=VkKeyScanEx_(Asc(vk$),GetKeyboardLayout_(0)) ; Normal key found.
If vk>303 And shifted=0 : keybd_event_(#VK_SHIFT,0,0,0) : EndIf ; Due to shifted character.
keybd_event_(vk,0,0,0) : keybd_event_(vk,0,#KEYEVENTF_KEYUP,0) ; Press the normal key.
If vk>303 And shifted=0 : keybd_event_(#VK_SHIFT,0,#KEYEVENTF_KEYUP,0) : EndIf ; Due to shifted character.
EndIf
Next
If thread1<>thread2 : AttachThreadInput_(thread1,thread2,#False) : EndIf ; Finished typing to target window!
keybd_event_(#VK_MENU,0,#KEYEVENTF_KEYUP,0) ; Release ALT key in case user forgot.
keybd_event_(#VK_CONTROL,0,#KEYEVENTF_KEYUP,0) ; Release CONTROL key in case user forgot.
keybd_event_(#VK_SHIFT,0,#KEYEVENTF_KEYUP,0) ; Release SHIFT key in case user forgot.
keybd_event_(#VK_LWIN,0,#KEYEVENTF_KEYUP,0) ; Release WINDOWS key in case user forgot.
ProcedureReturn 1 ; Report successful typing! :)
EndIf
EndProcedure
Procedure Fenetres_Ouvertes()
txt.s
hWnd.l = FindWindow_( 0, 0 )
While hWnd <> 0
If GetWindowLong_(hWnd, #GWL_STYLE) & #WS_VISIBLE = #WS_VISIBLE ; pour lister que les fenêtres visibles
If GetWindowLong_(hWnd, #GWL_EXSTYLE) & #WS_EX_TOOLWINDOW <> #WS_EX_TOOLWINDOW ; pour lister que les fenêtres qui ne sont pas des ToolWindow ou barre d'outils
txt = Space(256)
GetWindowText_(hWnd, txt, 256)
If FindString(UCase(txt),"AUTOCAD LT 2010",1) <> 0
If FindString(UCase(txt),"TEXTE",1) <> 0
AutoCAD_TEXT\Acad_title = txt
AutoCAD_TEXT\Acad_hWnd = hWnd
Else
AutoCAD_GRAF\Acad_title = txt
AutoCAD_GRAF\Acad_hWnd = hWnd
EndIf
EndIf
EndIf
EndIf
hWnd = GetWindow_(hWnd, #GW_HWNDNEXT)
Wend
EndProcedure
Fenetres_Ouvertes()
cmd.s = #ECHAP+#ECHAP+"-accrobj"+#RC+"AUCUN"+#RC
SendKeys(AutoCAD_GRAF\Acad_hWnd,"",cmd)
cmd.s = #ECHAP+#ECHAP+"SCU"+#RC+"O"+#RC+"@"+#RC
SendKeys(AutoCAD_GRAF\Acad_hWnd,"",cmd)
cmd.s = #ECHAP+#ECHAP+"_pline"+#RC+"0,0"+#RC+"100,0"+#RC+"100,10"+#RC+"10,10"+#RC+"10,100"+#RC+"0,100"+#RC+"c"+#RC
SendKeys(AutoCAD_GRAF\Acad_hWnd,"",cmd)
cmd.s = #ECHAP+#ECHAP+"SCU"+#RC+"G"+#RC
SendKeys(AutoCAD_GRAF\Acad_hWnd,"",cmd)
Code : Tout sélectionner
; SendKeys procedure by PB -- do whatever you want with it.
; Syntax: r=SendKeys(handle,window$,keys$) ; r = 0 for failure.
; Specify either a handle or window$ title to type to, but not both!
; You cannot type curly braces { } as part of the keystrokes, sorry!
;
Procedure Alert(m$)
MessageRequester("Alert",m$,#MB_ICONINFORMATION)
EndProcedure
Procedure.s FN_Space(Num)
For Counter = 1 To Num : Tmp$ + " " : Next Counter
ProcedureReturn Tmp$
EndProcedure
Procedure.s FN_readINI(inifile.s, section.s, key.s)
result.s = FN_Space(255)
Empty.s = ""
Ret = GetPrivateProfileString_(section, key, Empty, @result, 255, inifile.s)
ProcedureReturn result
EndProcedure
Procedure.l FN_writeINI( inifile.s,section.s, key.s, value.s)
result = WritePrivateProfileString_(section, key, value, inifile)
ProcedureReturn result
EndProcedure
Procedure SendKeys(handle,window$,keys$)
If window$<>""
handle=FindWindow_(0,window$) ; Use window$ instead of handle.
EndIf
If IsWindow_(handle)=0 ; Does the target window actually exist?
ProcedureReturn 0 ; Nope, so report 0 for failure to type.
Else
; This block gives the target window the focus before typing.
thread1=GetWindowThreadProcessId_(GetForegroundWindow_(),0)
thread2=GetWindowThreadProcessId_(handle,0)
If thread1<>thread2
AttachThreadInput_(thread1,thread2,#True)
EndIf
SetForegroundWindow_(handle) ; Target window now has the focus for typing.
Delay(125) ; 1/8 second pause before typing, to prevent fast CPU problems.
; Now the actual typing starts.
For r=1 To Len(keys$)
vk$=Mid(keys$,r,1)
If vk$="{" ; Special key found.
s=FindString(keys$,"}",r+1)-(r+1) ; Get length of special key.
s$=Mid(keys$,r+1,s) ; Get special key name.
Select s$ ; Get virtual key code of special key.
Case "ALTDOWN" : keybd_event_(#VK_MENU,0,0,0) ; Hold ALT down.
Case "ALTUP" : keybd_event_(#VK_MENU,0,#KEYEVENTF_KEYUP,0) ; Release ALT.
Case "BACKSPACE" : vk=#VK_BACK
Case "CONTROLDOWN" : keybd_event_(#VK_CONTROL,0,0,0) ; Hold CONTROL down.
Case "CONTROLUP" : keybd_event_(#VK_CONTROL,0,#KEYEVENTF_KEYUP,0) ; Release CONTROL.
Case "DELETE" : vk=#VK_DELETE
Case "DOWN" : vk=#VK_DOWN
Case "END" : vk=#VK_END
Case "ENTER" : vk=#VK_RETURN
Case "F1" : vk=#VK_F1
Case "F2" : vk=#VK_F2
Case "F3" : vk=#VK_F3
Case "F4" : vk=#VK_F4
Case "F5" : vk=#VK_F5
Case "F6" : vk=#VK_F6
Case "F7" : vk=#VK_F7
Case "F8" : vk=#VK_F8
Case "F9" : vk=#VK_F9
Case "F10" : vk=#VK_F10
Case "F11" : vk=#VK_F11
Case "F12" : vk=#VK_F12
Case "ESCAPE" : vk=#VK_ESCAPE
Case "HOME" : vk=#VK_HOME
Case "INSERT" : vk=#VK_INSERT
Case "LEFT" : vk=#VK_LEFT
Case "PAGEDOWN" : vk=#VK_NEXT
Case "PAGEUP" : vk=#VK_PRIOR
Case "PRINTSCREEN" : vk=#VK_SNAPSHOT
Case "RETURN" : vk=#VK_RETURN
Case "RIGHT" : vk=#VK_RIGHT
Case "SHIFTDOWN" : shifted=1 : keybd_event_(#VK_SHIFT,0,0,0) ; Hold SHIFT down
Case "SHIFTUP" : shifted=0 : keybd_event_(#VK_SHIFT,0,#KEYEVENTF_KEYUP,0) ; Release SHIFT.
Case "TAB" : vk=#VK_TAB
Case "UP" : vk=#VK_UP
EndSelect
If Left(s$,3)<>"ALT" And Left(s$,7)<>"CONTROL" And Left(s$,5)<>"SHIFT"
keybd_event_(vk,0,0,0) : keybd_event_(vk,0,#KEYEVENTF_KEYUP,0) ; Press the special key.
EndIf
r=r+s+1 ; Continue getting the keystrokes that follow the special key.
Else
vk=VkKeyScanEx_(Asc(vk$),GetKeyboardLayout_(0)) ; Normal key found.
If vk>304 And shifted=0 : keybd_event_(#VK_SHIFT,0,0,0) : EndIf ; Due to shifted character.
keybd_event_(vk,0,0,0) : keybd_event_(vk,0,#KEYEVENTF_KEYUP,0) ; Press the normal key.
If vk>304 And shifted=0 : keybd_event_(#VK_SHIFT,0,#KEYEVENTF_KEYUP,0) : EndIf ; Due to shifted character.
EndIf
Next
If thread1<>thread2
AttachThreadInput_(thread1,thread2,#False)
EndIf ; Finished typing to target window!
keybd_event_(#VK_MENU,0,#KEYEVENTF_KEYUP,0) ; Release ALT key if user forgot.
keybd_event_(#VK_CONTROL,0,#KEYEVENTF_KEYUP,0) ; Release CONTROL key if user forgot.
keybd_event_(#VK_SHIFT,0,#KEYEVENTF_KEYUP,0) ; Release SHIFT key if user forgot.
ProcedureReturn 1 ; Report successful typing!
EndIf
EndProcedure
Procedure GoMacro(x$,t$,m$)
desc$=FN_readINI(m$,"Global","Description"): If (desc$) : Alert(desc$): EndIf
If (RunProgram(x$,"","",0))
Delay(Val(FN_readINI(m$,"Global","Delay"))+1)
maxctr=Val(FN_readINI(m$,"Global","Items"))
For ctr=1 To maxctr
cmd$=FN_readINI(m$,"Macro","Cmd"+Str(ctr))
del=Val(FN_readINI(m$,"Macro","Del"+Str(ctr)))
tit$=FN_readINI(m$,"Macro","Tit"+Str(ctr))
Delay(del)
If (tit$): SendKeys(0,tit$, cmd$): Else: SendKeys(0,t$,cmd$): EndIf
Next
Else
Alert("Couldnt start "+x$)
EndIf
EndProcedure
Dim SPCL.s(40)
SPCL(01)="ALTDOWN"
SPCL(02)="ALTUP"
SPCL(03)="BACKSPACE"
SPCL(04)="CONTROLDOWN"
SPCL(05)="CONTROLUP"
SPCL(06)="DELETE"
SPCL(07)="DOWN"
SPCL(08)="END"
SPCL(09)="ENTER"
SPCL(10)="F1"
SPCL(11)="F2"
SPCL(12)="F3"
SPCL(13)="F4"
SPCL(14)="F5"
SPCL(15)="F6"
SPCL(16)="F7"
SPCL(17)="F8"
SPCL(18)="F9"
SPCL(19)="F10"
SPCL(20)="F11"
SPCL(21)="F12"
SPCL(22)="ESCAPE"
SPCL(23)="HOME"
SPCL(24)="INSERT"
SPCL(25)="LEFT"
SPCL(26)="PAGEDOWN"
SPCL(27)="PAGEUP"
SPCL(28)="PRINTSCREEN"
SPCL(29)="RETURN"
SPCL(30)="RIGHT"
SPCL(31)="SHIFTDOWN"
SPCL(32)="SHIFTUP"
SPCL(33)="TAB"
SPCL(34)="UP"
WID=OpenWindow(1, 100, 100, 400, 600, "MACRO CONTROL", #PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget)
;CreateGadgetList(WindowID(1))
TextGadget(1,10,10,200,16,"List of *Special Keys*"): ComboBoxGadget(2,10,30,200,800)
For x=1 To 40: If SPCL(x): AddGadgetItem(2,-1,SPCL(x)): EndIf: Next: SetGadgetState(1,2)
;TextGadget(3,220,10,200,16,"Open *Special Key* char"): StringGadget(4,360,10,16,16,"{")
;TextGadget(5,220,30,200,16,"Close *Special Key* char"): StringGadget(6,360,30,16,16,"}")
ButtonGadget(7,10,70,100,26,"Launch Program"): StringGadget(8,10,100,170,18,"")
TextGadget(9,10,130,100,16,"Titlebar Text"): StringGadget(10,10,150,170,18,"")
ButtonGadget(11,220,70,100,26,"Open Macro File"): StringGadget(12,220,100,170,18,"")
ButtonGadget(20,220,130,170,46,"Run Macro Against Program"):
TextGadget(13,10,190,380,80,"Nigel_Wale@uk.ibm.com"+Chr(13)+Chr(13)+"nawMacro.exe - simple Macro Program for windows - good for benchmarking or automating certain tasks"+Chr(13)+Chr(13)+"example:")
TextGadget(14,20,270,380,400,Chr(13)+"[Global]"+Chr(13)+"Items=6"+Chr(13)+"Launch=C:\WINNT\NOTEPAD.EXE"+Chr(13)+"Title=Untitled - Notepad"+Chr(13)+Chr(13)+"[Macro]"+Chr(13)+"cmd1=This is a Text Entry{RETURN}"+Chr(13)+"del1=1000"+Chr(13)+"cmd2=This is another Text Entry{RETURN}"+Chr(13)+"del2=1000"+Chr(13)+"cmd3={CONTROLDOWN}h"+Chr(13)+"del3=1000"+Chr(13)+"tit4=Replace"+Chr(13)+"cmd4=another{TAB}"+Chr(13)+"del4=1000"+Chr(13)+"tit5=Replace"+Chr(13)+"cmd5=yet another{ALTDOWN}a"+Chr(13)+"del5=1000"+Chr(13)+"cmd6={RETURN}{RETURN}Hello World{RETURN}"+Chr(13)+"del6=1000")
QUIT=0
Repeat
wevent=WaitWindowEvent()
Select wevent
Case #WM_DROPFILES:
Case #WM_CLOSE
QUIT=1
Case #PB_Event_CloseWindow
QUIT=1
Case #PB_Event_Gadget:
Select EventGadget()
Case 7
SetGadgetText(8,OpenFileRequester("Program To Launch","*.exe","*.exe",1))
Case 11
SetGadgetText(12,OpenFileRequester("Macro File","macro.naw","*.naw",1)):
SetGadgetText(10,FN_readINI(GetGadgetText(10)+GetGadgetText(12),"Global","Title"))
SetGadgetText(8,FN_readINI(GetGadgetText(8)+GetGadgetText(12),"Global","Launch"))
Case 20
If (GetGadgetText(8) And GetGadgetText(10) And GetGadgetText(12))
GoMacro(GetGadgetText(8),GetGadgetText(10),GetGadgetText(12))
Else
Alert("Must Specify:"+Chr(13)+" Open / Close *Special Character"+Chr(13)+"Launch Program & Macro File"):
EndIf
EndSelect
Case #PB_Event_Menu:
Select EventMenu():
Case 1:
Default:
EndSelect
EndSelect
Until QUIT=1
Re: ExcelWriter Ecrire dans un classeur Excel ouvert
Merci pour la piste des API, avant de répondre j'ai voulu voir un peu ce que c'était.
J'ai compris la procédure Fenetres_Ouvertes(), on peut aussi bien écrire dans excel que dans bloc note
ou autre.Effectivement je pourrai en partie l'utiliser dans excel.
Par contre je n'ai pas compris la procédure SendKeys().
Je vais continuer la piste COMate en ouvrant une autre discussion dessus.
A bientôt......
J'ai compris la procédure Fenetres_Ouvertes(), on peut aussi bien écrire dans excel que dans bloc note
ou autre.Effectivement je pourrai en partie l'utiliser dans excel.
Par contre je n'ai pas compris la procédure SendKeys().
Je vais continuer la piste COMate en ouvrant une autre discussion dessus.
A bientôt......