ExcelWriter Ecrire dans un classeur Excel ouvert

Programmation d'applications complexes
Malo
Messages : 79
Inscription : dim. 09/août/2009 17:48

ExcelWriter Ecrire dans un classeur Excel ouvert

Message par Malo »

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
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

Bonjour MALO

Comme c'est la premiere fois que je te parle, je te souhaite la "bianvonoue dans notre humble boutique, hihihihihi !!!" :D

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 :wink:
Malo
Messages : 79
Inscription : dim. 09/août/2009 17:48

Message par Malo »

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?
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

Je ne savais pas que tu avais la version de demo.
J'ai bien peur que COMATE fasse appel, de nombreuses fois aux API :cry:
Et la gestion des API n'est pas possible, je crois avec la demo

C'est vraiment dommage, car la puissance de COMATE est impressionnante. 8O
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Kwai chang caine a écrit :J'ai bien peur que COMATE fasse appel, de nombreuses fois aux API :cry:
Et la gestion des API n'est pas possible, je crois avec la demo
Je confirme dans les deux cas.
gnozal
Messages : 832
Inscription : mar. 07/déc./2004 17:35
Localisation : France
Contact :

Message par gnozal »

Kwai chang caine a écrit :Et la gestion des API n'est pas possible, je crois avec la demo
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.
Malo
Messages : 79
Inscription : dim. 09/août/2009 17:48

Message par Malo »

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$.
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

OpenLibrary, c'est pas trop compliqué.....car j'y arrive :D (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 :lol:
A part peut etre un seul et encore parfois..... il m'epate :roll:

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 :D
Malo
Messages : 79
Inscription : dim. 09/août/2009 17:48

Message par Malo »

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.
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

Je pense que " le petit scarabé " devenu grand, est bien plus malin qui ne le laisse croire.
C'est gentil.....mais ça serait encore mieux si c'etait vrai :lol:

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 :D

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 :D
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 ... :D

Ah ouaih j'crois qu'j'lai deja dit :oops:
Malo
Messages : 79
Inscription : dim. 09/août/2009 17:48

Message par Malo »

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?
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

Dans le fichier demo il y a ça:
IncludePath "..\"
XIncludeFile "COMate.pbi"
Ca c'est l'appel de l'include
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 :D
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 :wink:
Malo
Messages : 79
Inscription : dim. 09/août/2009 17:48

Message par Malo »

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
Patrick88
Messages : 1564
Inscription : mer. 21/janv./2004 18:24

Message par Patrick88 »

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.

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
pat
Malo
Messages : 79
Inscription : dim. 09/août/2009 17:48

Re: ExcelWriter Ecrire dans un classeur Excel ouvert

Message par Malo »

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......
Répondre