Executar Sap Gui Script escolhendo a sessão
Olá pessoal, nessa postagem vou atender a um pedido de um colega inscrito no meu canal. O seu questionamento era com relação a sessão que o código VBA executa no SAP, acredito que ele já deva ter sessões em aberto e gostaria de utilizar uma sessão para continuar o processo a partir daquele ponto, ou não derrubar um tela que ele esta trabalhando naquele momento.
Para isso vou utilizar uma função que também já postei aqui no canal (clique aqui para ver a postagem), mas como é para um caso especifico eu simplifiquei a função “eu acho rs”, bom vamos lá!
Crie um modulo no seu VBAProject, e cole o código abaixo:
'Autor: Fabio Mitsueda
'Contato: mitsueda.fabio@gmail.com
'Data Criação: 17/07/2023
Option Explicit
'Variaveis publicas de objeto que representão o SAP
Public objSapGui As Object
Public objApplication As Object
Public objConnection As Object
Public Session As Object
'(1)Systema logado
'(2)Nome do usuario
'(3)Transação
'(4)Objeto connection
'(5)Objeto Session
Public Function GetSapUserOpen() As Variant
'Variaveis diversas
Dim vSapInfo() As Variant
Dim vColunas(1 To 5) As Variant
Dim strID As String
Dim strUser As String
Dim strTransacao As String
Dim i, x As Integer
'Variaveis de objeto SAP
Dim objSAP As Object
Dim objSapApp As Object
Dim objConnect As Object
Dim objSession As Object
'Verificando se existe uma instacia do SAP aberta, não necessariamente logada
While x < 10 And objSAP Is Nothing
x = x + 1
On Error Resume Next
Set objSAP = GetObject("SAPGUI")
On Error GoTo 0
Wend
'Verificando se a variavel SAP foi carregada corretamente
If objSAP Is Nothing Then
GoTo Fim
End If
'Carregando variavel que representa a janela do SAP o applicativo
On Error Resume Next
Set objSapApp = objSAP.GetScriptingEngine
On Error GoTo 0
'Caso não tenha sido carregada vá para o fim do código
If objSapApp Is Nothing Then
GoTo Fim
End If
'Percorrendo todas as janelas abertas do SAP e capturando informações
For Each objConnect In objSapApp.Children
'Se a conexão caiu não executar o teste para a janela dessa rodada
If Not objConnect.DisabledByServer Then
For Each objSession In objConnect.Children
'Verificando se a sessão está em execução
If objSession.Busy = False Then
'Verificando se está logado atravez da transação S000 que é a tela de log
If objSession.Info.Transaction <> "S000" Then
'ID do sistema
strID = objSession.Info.SystemName
'Nome do usuario
strUser = objSession.Info.user
'Transação da janela
strTransacao = objSession.Info.Transaction
'Capturando dados
ReDim Preserve vSapInfo(i) 'Redimensionando matriz
vColunas(1) = strID 'Capturando Id do sistema
vColunas(2) = strUser 'Capturando o nome do usuario
vColunas(3) = strTransacao 'Capturando o codigo da transacao
Set vColunas(4) = objConnect 'Capturando objeto conexão
Set vColunas(5) = objSession 'Capturando objeto sessão
vSapInfo(i) = vColunas 'Atribuino colunas capturadas a variavel
i = i + 1 'Aumentado variavel em um para proximo loop
End If
End If
Next
End If
Next
Fim:
'Retornando valores para função
If i = 0 Then
GetSapUserOpen = Empty
Else
GetSapUserOpen = vSapInfo
End If
'Descarregando as variaveis de objeto
Set objSAP = Nothing
Set objSapApp = Nothing
Set objConnect = Nothing
Set objSession = Nothing
End Function
Para esse exemplo vou utilizar um Userform, carregando uma combo box com o retorno da função acima, então no seu VBAProject crie um Userform, com um combo box e um botão de comando para executar o script no SAP, e cole o código abaixo, caso não esteja usando o arquivo que vou disponibilizar logo abaixo, atentar para o nome dos controles
'Autor: Fabio Mitsueda
'Contato: mitsueda.fabio@gmail.com
'Data Criação: 17/07/2023
Option Explicit
'Variavel que ira receber dados do SAP
Dim vSap As Variant
'Evento de inicialiação do Userform
Private Sub UserForm_Initialize()
Dim x As Integer
'Verificando se existe SAP logado
vSap = GetSapUserOpen()
'Caso a varivael não esteja vazia popular o combobox
If Not IsEmpty(vSap) Then
With Me.cbo_Session
'Efetuando looping na variavel recebida
'E adicionando informações ao combo box
For x = LBound(vSap) To UBound(vSap)
.AddItem "Id: " & vSap(x)(1) & " | " & "Tcode: " & vSap(x)(3)
Next
End With
End If
End Sub
'Botão para executar a transação
Private Sub CmdConectar_Click()
'Carregando objeto de sessao conforme seleção no combo box
Set Session = vSap(Me.cbo_Session.ListIndex)(5)
'Aqui utilizando a sessao carregada anteriormente
Session.findById("wnd[0]/usr/ctxtRACCT-LOW").Text = "300000"
Session.findById("wnd[0]/usr/ctxtRBUKRS-LOW").Text = "1000"
Session.findById("wnd[0]/usr/txtRYEAR").Text = "2023"
End Sub
'Descarregando variaveis
Private Sub UserForm_Terminate()
Set objSapGui = Nothing
Set objApplication = Nothing
Set objConnection = Nothing
Set Session = Nothing
vSap = Empty
End Sub
Feito isso é sé executar o código com as janelas abertas, selecionar a sessão que quer executar e pronto. Para baixar o arquivo exemplo dessa postagem clique no aqui.

Olá excelente dia amigo, muito obrigado por compartilhar as informações.
Eu consigo ignorar o tempo de esperar de um código? por exemplo, clicar em executar uma tabela da se16n e em seguida fazer isto em outra página, sem aguardar a tabela gerar