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

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

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

  1. If Not IsObject(sap) Then
  2. Set SapGuiAuto = GetObject("SAPGUI")
  3. Set sap = SapGuiAuto.GetScriptingEngine
  4. End If
  5. If Not IsObject(Connection) Then
  6. Set Connection = sap.Connections.Item(0)
  7. End If
  8. If Not IsObject(session) Then
  9. Set session = Connection.Children(0)
  10. End If

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

  1. Set session = Connection.Children(0)

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

  1. sap.Connections.Count = 2

但是

  1. Connection.Sessions.Count = 0

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

  1. Dim sapSession As SAPFEWSELib.GuiSession
  2. Dim sapCon As SAPFEWSELib.GuiConnection
  3. Set sapCon = sap.Connections.Item(0)
  4. Set sapSession = Connection.sessions.Item(0)
  5. sapsession.createsession

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

  1. Set sapSession = Connection.sessions.Item(0)

这很好但是当我尝试

  1. Dim SessionNumber as integer
  2. ....
  3. SessionNumber = 0
  4. Set sapSession = Connection.sessions.Item(SessionNumber)

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

8qgya5xd

8qgya5xd1#

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

  1. Dim SessionNumber
  2. ....
  3. SessionNumber = 0
  4. Set sapSession = Connection.sessions.Item(Cint(SessionNumber))
0yycz8jy

0yycz8jy2#

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

  1. Const ms as Double = 1.15740741E-08 ' one millisecond, in days = 1/(1000*24*60*60)
  2. Dim sapCon As SAPFEWSELib.GuiConnection
  3. Dim sapSession As SAPFEWSELib.GuiSession
  4. Dim nSessions As Integer
  5. Set sapCon = sap.Connections(0)
  6. Set sapSession = sapCon.Sessions(0)
  7. nSessions = sapCon.Sessions.Count
  8. sapSession.createsession
  9. Do
  10. Application.Wait (Now() + 500*ms)
  11. If sapCon.Sessions.Count > nSessions Then Exit Do
  12. Loop
  13. Set sapSession = sapCon.Sessions.Item(CInt(sapCon.Sessions.Count - 1))
展开查看全部

相关问题