ENVIAR TECLAS A PROGRAMAS EXTERNOS PELO VBA

JUNIORARI2 16/01/2012 11:48:48
#393314
E ae galera blz!
Bom, não sei se estou pedindo demais, mas ai vai.

Aqui na empresa, as pessoas trabalham fazendo coisas muito repetitivas, por exemplo usamos um sistema da Oracle para lançar produtos e notas e etc.
Ás vezes (e muitas vezes) essas notas possuem mais de 300, 500 itens, e para algumas ações é necessário fazer item a item, e muitas vezes!! o que gera desperdício de tempo às pessoas, sem falar na LER (lesão por esforço repetitivo).

Um exemplo bastante tipico é cancelar itens em uma nota, deve ser item a item, entao eu clico num menu, vou em uma opção, seleciono outra opção num listbox, clico num botao, aparece mais tres janelas para confirmar, só entao é cancelado este item. E vou repetindo essa ação item a item.

Imagina cancelar 500 itens numa nota de 2000 itens!!

No Word e no Excel eu consegui [Ô]contornar[Ô] esse problema gerando uma macro VBA que melhorou e muito a ação de algumas tarefas, porém nesse aplicativo do Oracle fica difícil.

Então gostaria de saber da galera se existe a possibilidade de mandar uma combinação de teclas para outro aplicativo externo atraves de VBA.

Valew ae galera
ASHKATCHUP 16/01/2012 13:16:29
#393326
Procure sobre a API chamada [Ô]SENDKEYS[Ô]
JUNIORARI2 18/01/2012 16:55:16
#393582
valew, ASHKATCHUP eu vi, só que pelo q eu entendi ele envia as teclas mas o foco tem que estar numa janela dentro do Word!

e o que eu tava querendo era assim: deixar o programa [Ô]em espera[Ô] na barra de tarefas, ao acionar uma combinação de tecla pre-definida ele ia se ativar e enviar outra combinação de tecla tambem pré-definida ao sistema ou programa que estivesse em foco (e nao no word).

Acho que em VBA fica meio complicado, entao tava pensando em fazer um pequeno programinha em VB6 ou mesmo VB.NET, se alguem tiver alguma ideia ai, ela é bem vinda!
ASHKATCHUP 18/01/2012 19:11:24
#393596
Uhm, isso é um problema... faz sentido o alcance do VBA ser somente o Word.

MAS, em VB isso é facinho!!

Há meia dúzia de manerias de fazer isso. Uma delas, a mais facil na minha visão, é trazer a janela pra frente e dar sendkeys. Olha exemplo ai:

Cria um form. Poe um textbox e um botão, sem mudar nomes.
Abre o notepad.
Clica no botão


Option Explicit

Private Declare Function FindWindowA Lib [Ô]user32[Ô] (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function SetForegroundWindow Lib [Ô]user32[Ô] (ByVal hwnd As Long) As Long
Private Const SW_MINIMIZE = 6, SW_NORMAL = 1, SW_MAXIMIZE = 3, SW_RESTORE = 9

Function AppToForeground2(Optional sApplicationCaption As String, Optional lHwnd As Long, Optional lWindowState As Long = SW_NORMAL) As Boolean
If lHwnd = 0 Then
lHwnd = DialogGetHwnd(sApplicationCaption)
End If
If lHwnd Then
AppToForeground2 = SetForegroundWindow(lHwnd)
End If
End Function


Sub Test()
Dim lHwnd As Long
lHwnd = DialogGetHwnd(, [Ô]NOTEPAD[Ô])
If lHwnd Then
If AppToForeground2(, lHwnd, SW_NORMAL) Then
SendKeys Text1.Text, 2000
End If
End If
End Sub

Function DialogGetHwnd(Optional ByVal sDialogCaption As String = vbNullString, Optional sClassName As String = vbNullString) As Long
On Error Resume Next
DialogGetHwnd = FindWindowA(sClassName, sDialogCaption)
On Error GoTo 0
End Function

Private Sub Command1_Click()
Test
End Sub

Tópico encerrado , respostas não são mais permitidas