excel 超时后VBA SAP GUI重新创建会话

xzlaal3s  于 2023-06-25  发布在  其他
关注(0)|答案(2)|浏览(137)

也许有人可以帮助我使用VBA Excel创建新的SAP GUI会话。
一些代码来理解这个问题:

If Not IsObject(sap) Then
    Set SapGuiAuto = GetObject("SAPGUI")
    Set sap = SapGuiAuto.GetScriptingEngine
End If
If Not IsObject(Connection) Then
    Set Connection = sap.Connections.Item(0)
End If
If Not IsObject(session) Then
    Set session = Connection.Children(0)
End If

在大多数情况下,这一个工作得很好。但有时这部分不起作用:

Set session = Connection.Children(0)

例如,当发生SAP GUI超时时(在一段空闲时间后自动注销),就会发生这种情况。在这种情况下,我有:

sap.Connections.Count = 2

但是

Connection.Sessions.Count = 0

看起来超时连接仍然挂起在SAP GUI中的某个位置。因此,当我尝试连接到第一个连接的第一个会话时,我得到了一个错误,因为第一个连接中没有会话。
我想做的是创建新会话?
我可以通过

Dim sapSession As SAPFEWSELib.GuiSession
 Dim sapCon As SAPFEWSELib.GuiConnection
 Set sapCon = sap.Connections.Item(0)
 Set sapSession = Connection.sessions.Item(0)

 sapsession.createsession

这一个工作正常,但它没有帮助,因为我仍然需要设置会话第一。
在设置连接后,是否有方法创建会话?比如sapCon.createsession
有谁知道我如何使用特定的会话使用变量?

Set sapSession = Connection.sessions.Item(0)

这很好但是当我尝试

Dim SessionNumber as integer 
....
SessionNumber = 0 
Set sapSession = Connection.sessions.Item(SessionNumber)

它抛出一个错误:
集合访问的索引类型不正确

8qgya5xd

8qgya5xd1#

Excel要求会话号为整数,因此可以使用Cint()的类型转换。奇怪的是,即使SessionNumber被定义为整数,也建议/要求这样做。

Dim SessionNumber  
....
SessionNumber = 0 
Set sapSession = Connection.sessions.Item(Cint(SessionNumber))
0yycz8jy

0yycz8jy2#

CreateSession命令快速执行并返回到Excel,但SAP需要一段时间才能完成打开新会话。因此,您需要让Excel代码等待。
下面是一个例子:

Const ms as Double = 1.15740741E-08  ' one millisecond, in days = 1/(1000*24*60*60)

Dim sapCon As SAPFEWSELib.GuiConnection
Dim sapSession As SAPFEWSELib.GuiSession
Dim nSessions As Integer

Set sapCon = sap.Connections(0)
Set sapSession = sapCon.Sessions(0)

nSessions = sapCon.Sessions.Count

sapSession.createsession

Do
    Application.Wait (Now() + 500*ms)
    If sapCon.Sessions.Count > nSessions Then Exit Do
Loop

Set sapSession = sapCon.Sessions.Item(CInt(sapCon.Sessions.Count - 1))

相关问题