2017-06-25 21 views
2

たぶん誰かがVBAのSAPののCreateSession

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 

ほとんどの場合にこの1つの作業の罰金を、問題を理解するために、VBAエクセル

いくつかのコードを使用して、新しいSAPセッションを作成して私を助けることができます。しかし、時には、この部分は、SAPのタイムアウトが(いくつかのアイドル時間後に自動ログオフ)を発生した場合、それは例えば起こる

Set session = Connection.Children(0) 

動作しません。その場合 は私が

sap.Connections.Count 
= 2

しかし

Connection.Sessions.Count 

= 0
タイムアウトし、接続がまだSAPのどこかにハングアップしたように見えます

を持っています。最初の接続の最初のセッションに接続しようとすると、最初の接続にセッションがないというエラーが表示されます。

私がしたいことは、新しいセッションを作成することです。 私はこの1つは、[OK]を動作しますが、それは私はまだ最初のセッションを設定する必要がクーゼを助けない

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) 

これは、[OK]を動作しますが、私は

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

をしようとすると、エラー「コレクションにアクセスするための不正なインデックス・タイプを」スロー

答えて

1

Excelは、セッション数が整数であるので、あなたができることが必要ですCint()の型変換を使用します。これは、SessionNumberが整数として定義されている場合でも、これが推奨され、必要であることを奇妙に思っています。

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

が戻ったばかりの、このようになったし、解決策は '' 設定しsapSession = Connection.sessions.Item(Cintの(SessionNumber))であります – Sphinx

0

の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)) 
関連する問題