Bonjour à tous,
Voici ma première question alors à vos claviers 🙂
C'est un problème qui me prend la tête depuis 2 ans et j'avais même pas eu l'idée de venir sur un forum pas bien malin le Luc.
Bon passons aux choses sérieuses,
J'ai fait un "robot" qui ouvre une application externe (logiciel propriétaire) et ensuite envoi des informations par un sendkeys.
J'arrive à activer l'application sans difficulté et une fois celle ci ouverte à gérer les flux avec le "NUMLOCK" ce programme ayant la spécificité de d'étaeinde le numlock lorsqu'il est en attente.
Voilà maintenant le problème, avec shell(chemin_du_programme), je ne sais pas quand le logiciel est prêt à recevoir les touches.
J'ai contourné le problème avec un timer qui attend 15s ou plus (selon un paramètre) mais cette solution n'est pas satisfaisante.
Soit le logiciel se lance en 3s et on attend pour rien, soit le serveur est chargé, il met plus que 15s et là tout plante ça fait moche et surtout ça entraine n'importe quoi après.
Donc comment savoir que le programme est prêt à recevoir les données, sachant que je peux tester le nom de sa fenêtre mais je n'y arrive pas.
voici à toutes fins utiles mon code mais malheureusement, il n'est pas testable
	
	
	
	
	
		
	
		
			
		
		
	
				
			Voici ma première question alors à vos claviers 🙂
C'est un problème qui me prend la tête depuis 2 ans et j'avais même pas eu l'idée de venir sur un forum pas bien malin le Luc.
Bon passons aux choses sérieuses,
J'ai fait un "robot" qui ouvre une application externe (logiciel propriétaire) et ensuite envoi des informations par un sendkeys.
J'arrive à activer l'application sans difficulté et une fois celle ci ouverte à gérer les flux avec le "NUMLOCK" ce programme ayant la spécificité de d'étaeinde le numlock lorsqu'il est en attente.
Voilà maintenant le problème, avec shell(chemin_du_programme), je ne sais pas quand le logiciel est prêt à recevoir les touches.
J'ai contourné le problème avec un timer qui attend 15s ou plus (selon un paramètre) mais cette solution n'est pas satisfaisante.
Soit le logiciel se lance en 3s et on attend pour rien, soit le serveur est chargé, il met plus que 15s et là tout plante ça fait moche et surtout ça entraine n'importe quoi après.
Donc comment savoir que le programme est prêt à recevoir les données, sachant que je peux tester le nom de sa fenêtre mais je n'y arrive pas.
voici à toutes fins utiles mon code mais malheureusement, il n'est pas testable
		Code:
	
	
	Option Private Module
Option Explicit
Private Const VER_PLATFORM_WIN32_NT = 2
Private Const VER_PLATFORM_WIN32_WINDOWS = 1
Private Const VK_NUMLOCK = &H90
Private Const KEYEVENTF_EXTENDEDKEY = &H1
Private Const KEYEVENTF_KEYUP = &H2
Dim task As String
Private Type OSVERSIONINFO
  dwOSVersionInfoSize As Long
  dwMajorVersion As Long
  dwMinorVersion As Long
  dwBuildNumber As Long
  dwPlatformId As Long
  szCSDVersion As String * 128
End Type
' declarations API
Private Declare Function GetVersionEx Lib "kernel32" _
   Alias "GetVersionExA" _
   (lpVersionInformation As OSVERSIONINFO) As Long
Private Declare Sub keybd_event Lib "user32" _
   (ByVal bVk As Byte, _
    ByVal bScan As Byte, _
    ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
    
Private Declare Function GetKeyboardState Lib "user32" _
   (pbKeyState As Byte) As Long
Private Declare Function SetKeyboardState Lib "user32" _
   (lppbKeyState As Byte) As Long
Private Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
Sub lancer_saga_t54()
Dim x, i
Dim compte, annee, moi
definition_variables
param_T54.an.Text = Right(param.Cells(1, 2), 2)
param_T54.moi.Text = Month(param.Cells(2, 2))
param_T54.cpte.Text = (Left(ActiveWorkbook.Name, Len(ActiveWorkbook.Name) - 4))
param_T54.Show
If param_T54.an.Text = "" Then Exit Sub
If Not (IsNumeric(param_T54.an.Value)) Then
x = MsgBox("Année : format sur 2 chiffres", vbCritical, "erreur parametres")
Exit Sub
End If
If (param_T54.moi.Value < 1 Or param_T54.moi.Value > 12) And param_T54.moi.Value <> "" Then
x = MsgBox("Le mois n'est pas valide", vbCritical, "erreur parametres")
Exit Sub
End If
compte = param_T54.cpte.Text
annee = param_T54.an.Text
moi = param_T54.moi.Text
i = dern_ligne
journalise "T54 automatique", "Compte : " & compte & " mois : " & moi
deprotege
lance_saga_permanant
SendKeys "T54{ENTER}", True
'Application.Wait (Now + TimeValue("0:0:2"))
attend_reponse
SendKeys "00", True
SendKeys annee, True
SendKeys compte, True
SendKeys "{ENTER}", True
attend_reponse
'début de la boucle de copie
Do
    SendKeys "%e t{ENTER}", True
 attend_reponse
   
        Cells(i, 1).Select
        ActiveSheet.Paste
        
'vérification fin traitement
If Not (Cells(i + 23, 1) Like "DETAIL LIGNE*") Then
Exit Do
End If
If CDbl(Mid(Cells(i + 5, 1), 13, 2)) < moi And moi <> "" Then
'le mois est dépassé on a  tourné assez de pages
Exit Do
End If
If CDbl(Mid(Cells(i + 5, 1), 13, 2)) = moi Or moi = "" Then
'le mois est ok
Range(Cells(i, 1), Cells(i + 27, 1)).Select
T54
i = ActiveCell.Row
End If
      
    
  SendKeys "{ENTER}", True
attend_reponse
Loop
 Selection.ClearContents
 'fermeture sage
 ferme_saga
Cells(4, 1).Select
protege
End Sub
Public Function NumLockOn() As Boolean
    Dim iKeyState As Integer
    iKeyState = GetKeyState(vbKeyNumlock)
    NumLockOn = (iKeyState = 1 Or iKeyState = -127)
    
End Function
Public Sub ToggleNumLock(TurnOn As Boolean)
    'true pour allumer
    'false pour eteindre
    
      Dim bytKeys(255) As Byte
      Dim bnumLockOn As Boolean
      
'Get status of the 256 virtual keys
      GetKeyboardState bytKeys(0)
      
      bnumLockOn = bytKeys(VK_NUMLOCK)
      Dim typOS As OSVERSIONINFO
      
      If bnumLockOn <> TurnOn Then 'if current state <>
                                     'requested stae
        
       If typOS.dwPlatformId = _
           VER_PLATFORM_WIN32_WINDOWS Then  '=== Win95/98
          bytKeys(VK_NUMLOCK) = 1
          SetKeyboardState bytKeys(0)
        Else    '=== WinNT/2000
        'Simulate Key Press
          keybd_event VK_NUMLOCK, &H45, _
             KEYEVENTF_EXTENDEDKEY Or 0, 0
        'Simulate Key Release
          keybd_event VK_NUMLOCK, &H45, KEYEVENTF_EXTENDEDKEY _
             Or KEYEVENTF_KEYUP, 0
        End If
      End If
     
End Sub
Sub lance_saga_permanant()
ToggleNumLock (True)
task = Shell(saga_permanant)
Application.Wait (Now + param.Cells(13, 2))
'AppActivate task, True
End Sub
Sub ferme_saga()
'fermeture puis ouverture pour regler le probleme du verr num
SendKeys "%{F4}", True
 SendKeys "{ENTER}"
 Application.Wait (Now + TimeValue("0:0:2"))
task = Shell(saga_permanant)
Application.Wait (Now + param.Cells(13, 2))
'AppActivate task, True
SendKeys "T54{ENTER}", True
Application.Wait (Now + TimeValue("0:0:2"))
 SendKeys "^{F11}%Q", True
 ToggleNumLock (True)
End Sub
Sub attend_reponse()
While Not NumLockOn
Wend
End Sub