Notifications
Clear all

Clique do Mouse em VBA

7 Posts
4 Usuários
0 Reactions
7,517 Visualizações
(@juauvitor)
Posts: 0
New Member
Topic starter
 

Bom pessoal, sou novo no fórum, e novo em VBA, aprendendo sozinho a mexer... Já cheguei no ponto de abrir outro programa com um botão e uma macro utilizando SendKeys, porém, queria avançar neste programa, para uma aba que infelizmente não tem atalho de teclas, somente com o clique do mouse.
Alguém poderia me ajudar á como colocar estes cliques com o mouse em macro?
Agradeço desde já.

 
Postado : 09/06/2016 8:52 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Boa tarde!!

Já que não esclareceu o que pretende, veja:
https://msdn.microsoft.com/pt-br/librar ... 78486.aspx

Att

 
Postado : 09/06/2016 9:57 am
(@messiasmbm)
Posts: 0
New Member
 

keycode 112 é igual a f1 no teclado

Private Sub UserForm_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)

If KeyCode = 112 Then
MsgBox "Deu certo !"
End If
End Sub

 
Postado : 09/06/2016 10:07 am
(@juauvitor)
Posts: 0
New Member
Topic starter
 

Pois é, talvez eu não tenha sido tão claro.
Oq eu preciso é o seguinte:
Num outro programa aberto pela "SHELL" do VBA, pede-se usuário, senha e selecionar filial. coloquei em minha macro as SendKeys para preencher os campos e separar os campos com o "{TAB}". ok...
porém ao abrir o programa eu consigo a SendKeys "{ALT}" para mexer na barra de ferramentas, aperta-se "M" para abrir uma janela e pronto até ai...
Logo nesta janela, tem abas, que somente podem ser apertadas pelo botão esquerdo do mouse, e eu precisava que uma das abas fosse aberta, para automatizar ainda mais o serviço.
messiasmbm eu vou dar uma olhada neste teu cód. qualquer coisa aviso ai. Obrigado desde já.

 
Postado : 09/06/2016 10:18 am
(@edsonbr)
Posts: 0
New Member
 

Olá, Juauvitor, bem vindo ao Planilhando!

Para vc enviar pressionamento de botões do mouse, use uma combinação de duas API's. Com uma delas (SetCursorPos) vc posiciona o "mouse" no local a ser clicado (posição x e y) e com a outra (mouse_event) vc emula o pressionamento do mouse. Veja que tem duas versões para declarar as API's, conforme seu sistema seja 32 ou 64 bits. Seguem também as rotinas para pressionamento do botão direito e duplo-click, caso haja interesse:

'Para 32bits:
  'Public Declare Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As Long
  'Public Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)
'Para 64bits:
Public Declare PtrSafe Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As Long
Public Declare PtrSafe Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As LongPtr)
'Para ambos:
Public Const MOUSEEVENTF_LEFTDOWN = &H2
Public Const MOUSEEVENTF_LEFTUP = &H4
Public Const MOUSEEVENTF_RIGHTDOWN As Long = &H8
Public Const MOUSEEVENTF_RIGHTUP As Long = &H10
_____________________
Private Sub SimularClickEsquerdoNormal()
  SetCursorPos 50, 50 ''Move o cursor para as coordenadas x e y para posicionar no local clicável
  mouse_event MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0
  mouse_event MOUSEEVENTF_LEFTUP, 0, 0, 0, 0
End Sub
_____________________
Private Sub SimularDuploClick() 'Duplo click rápido
  SetCursorPos 50, 50 ''Move o cursor para as coordenadas x e y para posicionar no local clicável
  mouse_event MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0
  mouse_event MOUSEEVENTF_LEFTUP, 0, 0, 0, 0
  mouse_event MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0
  mouse_event MOUSEEVENTF_LEFTUP, 0, 0, 0, 0
End Sub
_____________________
Private Sub SimularClickBotãoDireitoMouse()
  SetCursorPos 50, 50 'Move o cursor para as coordenadas x e y para posicionar no local clicável
  mouse_event MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0
  mouse_event MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0
End Sub

Veja que usei as coordenadas x e y como sendo 50,50. Ajuste como necessário. Se não for necessário posicionar antes de clicar, pode eliminar a function SetCursorPos na declaração e dentro das procedures.

Atte, Edson.

 
Postado : 10/06/2016 12:29 am
(@juauvitor)
Posts: 0
New Member
Topic starter
 

EdsonBR

Veja que usei as coordenadas x e y como sendo 50,50. Ajuste como necessário. Se não for necessário posicionar antes de clicar, pode eliminar a function SetCursorPos na declaração e dentro das procedures.

EdsonBR, é o seguinte, minha macro está assim,

Sub abrir4()

' Teste Macro

Shell "P:C5ClientTesourariaTesourariaN.exe", vbNormalFocus

SendKeys "joaov"
SendKeys "{Tab}"
SendKeys "jf0905"
SendKeys "{Tab}"
SendKeys "{DOWN}"
SendKeys "{DOWN}"
SendKeys "{DOWN}"
SendKeys "{DOWN}"
SendKeys "{ENTER}"

SendKeys "%"

SendKeys "{M}"
SendKeys "{ENTER}"
SendKeys "{F8}"
SendKeys "{NUMLOCK}"

Public Declare PtrSafe Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As Long
Public Declare PtrSafe Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As LongPtr)
'Para ambos:
Public Const MOUSEEVENTF_LEFTDOWN = &H2
Public Const MOUSEEVENTF_LEFTUP = &H4
Public Const MOUSEEVENTF_RIGHTDOWN As Long = &H8
Public Const MOUSEEVENTF_RIGHTUP As Long = &H10
Private Sub SimularClickEsquerdoNormal()
  SetCursorPos 50, 50 ''Move o cursor para as coordenadas x e y para posicionar no local clicável
  mouse_event MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0
  mouse_event MOUSEEVENTF_LEFTUP, 0, 0, 0, 0
End Sub

' Encerrar()
        ActiveWorkbook.Save
        Application.Quit
End Sub

E então coloquei teus eventos no meio do processo, onde eu realmente precisaria deles, porém dá uma mensagem de erro "Erro de compilação, somente comentários podem aparecer depois de End Sub, End Function e Property." creio que falta apenas um pequeno detalhe para acertar, depois eu só iria trocar os valores X e Y para chegar na aba que preciso. Como eu disse, sou novo em VBA e cheguei até esta parte da planilha pesquisando na internet como se faz. Aguardo alguma ajuda. Muito obrigado desde já. :?:

 
Postado : 10/06/2016 11:55 am
(@edsonbr)
Posts: 0
New Member
 

Olá, Juauvitor

O problema é que vc aninhou uma sub dentro de outra e isso não é válido no VBA. O que vc pode fazer é chamar um procedimento quando o necessita dentro de outro (usando a palavra-chave Call que, embora opcional, deixa o código melhor documentado). Além disso, a parte inicial do código que te passei pertence à área de declarações e também não podem estar dentro de uma sub ou function.
O código deve ser mais ou menos assim (não tenho como testar, pois ele chama o "TesourariaN.exe"):

Public Declare PtrSafe Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As Long
Public Declare PtrSafe Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As LongPtr)
Public Const MOUSEEVENTF_LEFTDOWN = &H2
Public Const MOUSEEVENTF_LEFTUP = &H4
Public Const MOUSEEVENTF_RIGHTDOWN As Long = &H8
Public Const MOUSEEVENTF_RIGHTUP As Long = &H10
'_________________________________________________________________
Private Sub SimularClickEsquerdoNormal()
  SetCursorPos 50, 50 ''Move o cursor para as coordenadas x e y para posicionar no local clicável
  mouse_event MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0
  mouse_event MOUSEEVENTF_LEFTUP, 0, 0, 0, 0
End Sub
'_________________________________________________________________
Sub abrir4()
   ' Teste Macro
   Shell "P:C5ClientTesourariaTesourariaN.exe", vbNormalFocus
   SendKeys "joaov"
   SendKeys "{Tab}"
   SendKeys "jf0905"
   SendKeys "{Tab}"
   SendKeys "{DOWN}"
   SendKeys "{DOWN}"
   SendKeys "{DOWN}"
   SendKeys "{DOWN}"
   SendKeys "{ENTER}"
   
   SendKeys "%"
   
   SendKeys "{M}"
   SendKeys "{ENTER}"
   SendKeys "{F8}"
   SendKeys "{NUMLOCK}"
    
   Call SimularClickEsquerdoNormal
   
   ' Encerrar()
   ActiveWorkbook.Save
   Application.Quit
End Sub

Perceba que vc também poderia chamar diretamente dentro de sua macro a function SetCursorPos etc., etc... e também cada sub mouse_event com os parâmetros MOUSEEVENTF_LEFTDOWN etc., etc.... (baixa o botão esquerdo do mouse) e MOUSEEVENTF_LEFTUP etc., etc... (levanda o botão esquerdo do mouse). Dessa forma, nem precisaria invocar a Sub SimularClickEsquerdoNormal().

Um detalhe, como vc é novo no fórum talvez não saiba, mas para facilitar a leitura de todos os integrantes, quando vc for postar código VBA, sempre use o botão "Code" do editor e insira seu código entre as tags [ code ] e [ /code ]. Fica muito mais legível e fácil de copiar, etc.

 
Postado : 10/06/2016 12:36 pm