Anexar arquivos no SAP com Excel VBA SAP Gui Scripting
Essa solução foi desenvolvida em conjunto com Jose Eduardo Chamon criador do site http://ensinandoexcel.com.br/ que me procurou através deste canal. Trocamos ideias e conhecimentos, ele me apresentou um sistema RPA chamado AutoIt que também apresentou um solução satisfatória e aumentou minhas opções em automação. Assim tenho me beneficiado desse canal, aumentando meu networking, adquirindo, passando e repassando conhecimento.
AutoIt é um programa que grava as ações do usuário e depois replica, é como gravar uma macro que pode ser acessado e customizado por código VBA, apesar de apresentar uma solução satisfatória não será a solução apresentada nessa postagem. Isso porque identificamos duas desvantagens. A primeira por ser um software ele precisa ser instalado e hoje nas organizações nem sempre isso é permitido, a segunda é que ele repete ações gravadas com base na posição da tela, como a solução tende a ser executada em telas de formatos diferentes isso pode gerar um erro. Mas é uma excelente ferramenta de RPA e para propósitos específicos é muito útil.
A solução que vou apresentar nessa postagem consiste em uma combinação de VBA e VBS, vou anexar um arquivo a um documento contábil através da transação FB03, mas a mesma funcionalidade pode ser aplicada a qualquer transação que utilize a chamada Windows padrão para selecionar arquivos.
Primeiro devemos verificar se a opção Exibir caixa de diálogo nativa de Microsoft Windows está ativa.
Na janela de SAP Logon clique em Opções…
Depois verifique se a opção destacada abaixo está selecionada.
Estou utilizando o arquivo de conexão disponibilizado na postagem Sap Script & VBA – Conexão, primeiro vamos criar uma rotina dentro do modulo basTransaction chamada CriarVBS
‘A função abaixo cria um arquivo VBS customizado para o caminho abaixo
Public Sub CriarVBS(ByVal strCaminho As String, ByVal strNomeJanela As String)
‘Referencia à Microsoft Scripting Runtime
Dim myFso As Scripting.FileSystemObject
Dim myTxt As Scripting.TextStream
Dim i As Long
‘Carregando variavel de objeto
Set myFso = CreateObject(“Scripting.FileSystemObject”)
‘Criar o arquivo VBS
Set myTxt = myFso.CreateTextFile(Filename:=ThisWorkbook.Path & “\FileOpen.vbs”, _
OverWrite:=True)
‘Criando o arquivo VBS
With myTxt
.Write “Set Wshell = CreateObject(“”WScript.Shell””)” & vbCrLf
.Write “Do” & vbCrLf
.Write “bWindowFound = Wshell.AppActivate(“”” & strNomeJanela & “””)” & vbCrLf
.Write “WScript.Sleep 1000” & vbCrLf
.Write “Loop Until bWindowFound” & vbCrLf
.Write “bWindowFound = Wshell.AppActivate(“”” & strNomeJanela & “””)” & vbCrLf
.Write “If (bWindowFound) Then” & vbCrLf
.Write “Wshell.appActivate “”” & strNomeJanela & “””” & vbCrLf
.Write “WScript.Sleep 100” & vbCrLf
.Write “Wshell.sendkeys “”” & “” & “%n” & strCaminho & “””” & vbCrLf
.Write “WScript.Sleep 100” & vbCrLf
.Write “Wshell.sendkeys “”{ENTER}””” & vbCrLf
.Write “WScript.Sleep 100” & vbCrLf
.Write “End if”
.Close
End With
‘Descarregando variaveis
Set myTxt = Nothing
Set myFso = Nothing
End Sub
Agora vamos inserir o código que ira fazer a chamada a função acima, o detalhe é que devemos criar o arquivo VBS e chamar sua execução antes da solicitação pelo SAP à chamada do arquivo, porque esse VBS é que ira incluir o caminho do arquivo e depois fechar essa caixa de dialogo permitindo assim a continuidade do código VBA.
Public Sub Executar()
‘Declarando variaveis
Dim strCaminho As String
Dim Wshell As Object
‘Capturando caminho do arquivo a ser anexado
strCaminho = Cells(6, 2).Value
‘Criando arquivo VBS passando o caminho e nome da janela
Call CriarVBS(strCaminho, “Abrir”)
‘Execuntado arquivo VBS
Set Wshell = CreateObject(“WScript.Shell”)
Wshell.Run ThisWorkbook.Path & “\FileOpen.vbs”, 1, False
‘Executando código Sap Scripting
Session.findById(“wnd[0]/tbar[0]/okcd”).Text = Cells(3, 2).Value
Session.findById(“wnd[0]”).sendVKey 0
Session.findById(“wnd[0]/usr/txtRF05L-BELNR”).Text = Cells(4, 2).Value
Session.findById(“wnd[0]/usr/ctxtRF05L-BUKRS”).Text = Cells(5, 2).Value
Session.findById(“wnd[0]”).sendVKey 0
Session.findById(“wnd[0]/titl/shellcont/shell”).pressContextButton “%GOS_TOOLBOX”
Session.findById(“wnd[0]/titl/shellcont/shell”).selectContextMenuItem “%GOS_PCATTA_CREA”
‘Caso queira deletar o arquivo criado em tempo de execução
‘É necessario aguardar alguns segundos para que ele preencha a janela
‘Mas caso não queira aguarda mantenha o arquivo VBS salvo
Application.Wait (Now + TimeValue(“0:00:05”))
‘Deletando o arquivo VBS criado anteriormente
Kill ThisWorkbook.Path & “\FileOpen.vbs”
‘Descarregando variaveis
Set Wshell = Nothing
End Sub
Verifique a linha 10 do código acima [ Call CriarVBS(strCaminho, “Abrir”) ] aqui está o “pulo do gato”, você deve colocar nesse argumento o caminho do arquivo e principalmente o nome que irá aparecer na barra de titulo da sua caixa de dialogo que nesse exemplo é “Abrir”.
Clique aqui para baixar o arquivo Excel com o código dessa postagem
Duvidas, sugestões e comentários são sempre bem vindos, aproveite também o fórum para duvidas.
Boa Noite Fábio ! Tem como criar esse anexo por um Loop no VBA?
Olá Fabio, Boa Tarde na sua publicação em relação ao sap logon não aparece os botões que devem ser ativados. Quais são ?
Olá Fábio, consegui ativar as ferramentas. Porém o “pulo do gato” que você informa no arquivo disponibilizado permanece com o problema de colocar o nome ao anexar. Mesmo executando manualmente o script via reprodução será que faltou alguma coisa ?
Tenho interesse em uma opção ao contrario desta, baixar anexos do SAP de alguma transação, tipo o pdf da Nota fiscal na transação de protocolo, ou alguma coisa anexada a um pedido de compras, tipo um email que foi anexado em arquivo pdf, pois é comum anexarem conversas de e-mail desta forma para justificar ou documentar alguma ação em compras.
Olá. Boa noite.
É possível fazer o contrário? Pegar o arquivo que foi anexado na FB03 e salvar em uma pasta específica?
conseguiu?