除了汤姆在我上面的回答中的评论。我的第一个答案将适用于 For Each..Next 方法,但我确实在 Next 语句中发现了一个语法错误(请参阅我对该行的编辑,上面。
但是,如果您真的不想使用 For Each 方法,或者它对您不起作用,那么您应该能够使索引方法起作用。
VBScript 不是强类型的,因此您不能使用精确的数字类型(如 Integer、Long 或 Byte)对变量进行 Dim。但是,您正在使用的类型库可能需要 Connections 方法的强类型参数。通常,VBScript 或您调用的方法会处理此问题,但您确实提到您正在使用 SAP(我过去已经自动化),所以我假设这是问题的原因.
就像我说的,VBScript 不提供强类型声明,但它确实允许您将值强制转换为特定类型。您说当您提供像 0 或 1 这样的数字文字时,您设法使代码正常工作,因此您的连接方法似乎将接受一个整数,但您的 i 变量可能隐含地是一个 Long,因为它是如何声明的。
您可以通过将数字文字(默认为整数类型)分配给 i 来检查这一点,如下所示:
i = 0
iSessions = application.Connections.Item(i).Sessions.Count
msgbox iSessions & " Sessions for Connection " & i
有时,COM 对象不允许您访问子成员,而无需首先获得父级的完整句柄,因此更复杂的测试将是:
i = 0
Set con = application.Connections.Item(i)
iSessions = con.Sessions.Count
msgbox iSessions & " Sessions for Connection " & i
如果上述任何一个工作,那么您有一个线索 Connections.Item 方法需要一个整数。所以你可能会得到这个工作:
Set SapGuiAuto = GetObject("SAPGUI")
Set application = SapGuiAuto.GetScriptingEngine
'The connections.Count method might coerce a Long or an Integer, or even a Byte
iConnections = application.Connections.Count
If iConnections > 0 Then
'Convert iConnections to an Integer, and i should then be an Integer too
For i = 0 to CInt(iConnections) - 1
set con = application.Connections.Item(i)
iSessions = con.Sessions.Count
msgbox iSessions & " Sessions for Connection " & i + 1
Next
End If