web-dev-qa-db-ja.com

GetObject( "SAPGUI")によって返されるオブジェクトのタイプは何ですか?

TL; DR ---------------

初期化スクリプトで変数を適切に宣言すると、SAPFEWSELib.GuiApplicationの「接続」オブジェクトにアタッチできません。コレクションMyApplication.Children(0)は空ですが、宣言ブロックをコメントアウトすると、機能します!?

TL; DR ---------------

SAPクライアントとExcelアプリケーションの間に、より信頼性の高い接続を作成しようとしています。

私の現在の問題は、接続の確立です。 SAPクライアントは、スクリプト記録機能を使用するときにサンプルvbscriptを提供します。

If Not IsObject(MyApplication) Then
    Debug.Print "yep"
   Set SapGuiAuto = GetObject("SAPGUI")
   Set MyApplication = SapGuiAuto.GetScriptingEngine
End If
If Not IsObject(Connection) Then
   Set Connection = MyApplication.Children(0)
End If
If Not IsObject(session) Then
   Set session = Connection.Children(0)
End If

Stackoverflowに関するこの他の質問はほぼ答えになりましたが、stackoverflow.com/questions/24738998/vba-using-variables-that-were-not-declaredに達しませんでした

元のコードは ここ です。Excel/ vbaで動作するように少し変更しました。 (IsObject(Wscript)を削除し、ApplicationをMyApplicationに置き換える必要がありました)

私が最初にしたいことは、すべての変数を明示的に宣言することです。

次のアドレスで取得したコードを使用してstackoverflow.com/questions/19783180/get-list-of-all-properties-for-an-object「TypeLibInformation」と関数TypeName()を使用して各オブジェクトタイプを決定しました。次のように宣言してみました

Dim session as GuiSession
Dim MyApplication as GuiApplication
Dim Connection as ISapConnectionTarget
Dim SapGuiAuto as object

User-defined type notdefinedエラーが発生します。

少し調べてみると、このアドレスで部分的な答えが見つかりました。

scn.sap.com/thread/3254335

「C:\ ProgramFiles(x86)\ SAP\FrontEnd\SAPgui\sapfewse.ocx」参照を手動で追加すると簡単に壊れてしまうと思います。これを行うためのより良い方法がある場合は、私に知らせてください。

さて、私はこのように宣言することができ、それは機能します。

Dim MyApplication As SAPFEWSELib.GuiApplication
Dim Connection As SAPFEWSELib.GuiConnection
Dim session As SAPFEWSELib.GuiSession
Dim SapGuiAuto As Object

SapGuiAuto As Objectは実際には何であるかを示しておらず、CTRL + SPACEを使用してこのオブジェクトの使用可能なプロパティと関数を表示できないため(VB) =今なしでは生きていけない機能!)

このオブジェクトについて私が知っているのは、.GetScriptingEngine関数(メソッド?)があることだけです。

この質問を書くための調査をしているときに、sap.comフォーラムでこのスレッドに出くわしました。 scn.sap.com/thread/3448120

ここでは、「GetScriptingEngineはGuiApplicationクラスのメソッドである」と述べられています。

そこで、次の宣言を試してみましたが、うまくいくようです。

Dim MyApplication As SAPFEWSELib.GuiApplication
Dim Connection As SAPFEWSELib.GuiConnection
Dim session As SAPFEWSELib.GuiSession
Dim SapGuiAuto As SAPFEWSELib.GuiApplication

「セッション」と入力すると、可能なプロパティのリストが表示されます。しかし問題がある !

次の行を入力すると

Debug.Print session.FindById("wnd[0]").Text

エラーが発生します(以前は問題なく動作していましたが!)。エラーは「オブジェクト変数またはbock変数が設定されていません」です。

変数宣言をコメントアウトすると、問題なく機能します。

セッションが宣言されていないときにTLI関数を使用すると、次のメンバーが得られます

DumpProperties session.FindById("wnd[0]")

ここに出力-> Pastebin.mozilla.org/8882551

しかし、セッションが適切に宣言された状態で同じコマンドを実行すると、同じエラーが発生します。

したがって、もう少し調査したところ、スクリプトの最初は同じように機能しないことがわかりました。

If Not IsObject(MyApplication) Then

MyApplicationがDimMyApplication As SAPFEWSELib.GuiApplicationで宣言されている場合、実行されません

そこで、IFなしでコマンドを実行してみました。

Set MyApplication = SapGuiAuto.GetScriptingEngine
Set Connection = MyApplication.Children(0)
Set session = Connection.Children(0)

これは、Set MyApplication = SapGuiAuto.GetScriptingEngineの「オブジェクト変数またはbock変数が設定されていません」エラーで失敗します

この問題の解決策は、このようなSapGuiAutoの新しいインスタンスを作成することでした。

Set SapGuiAuto = New SAPFEWSELib.GuiApplication

Set Connection = MyApplication.Children(0)で失敗するまで、上記のコードが実行されます。

エラー:「コレクションの列挙子は、指定されたインデックスを持つen要素を見つけることができません」

次の行を使用した簡単なテストでは、.Childrenコレクションが空であることがわかります。

For Each chld In MyApplication.Children: Debug.Print "one exists": Next

これは、現在SAPから切断されている場合に通常発生するエラーと同じですが、接続されて宣言ブロックをコメントアウトすると、問題が修正されます。

Stackoverflowに関するこの回答は不吉ですstackoverflow.com/questions/36751819/sap-gui-scripting-error-the-enumerator-of-the-collection-cannot-find-an-elemen

私は管理者ではありません。金曜日は10 PMで、ITに何かを尋ねるのは悪夢です。うまくいけば、それに頼る必要はありません。

別のコンピューターで試してみます。

試したところ、同じことがわかりました。この時点で私はタオルを投げなければなりません、私はいくつかの助けまたは少なくともおやすみの休息なしではこれを機能させることができません!

アドバイスやコメントをありがとう

私と同じ道を歩む人々にとって、私が見つけたいくつかの追加のリンクは非常に役に立ちました。

SAPGUIスクリプティングAPIPDF

VBAデバッガーを使用してSAPGUIのプロパティと関数を検出するscn.sap.com/docs/DOC-39696

SAP GUIスクリプティングAPIドキュメント(このファイルを開くことができませんでしたが、良いものがたくさんあります)www.sdn.sap.com/irj/scn/go/portal/prtroot/docs/library/uuid/a034a16b-3bfe-2a10- e2bb-8bd880db0b3c

SAP GUIスクリプティングAPI:ユーザーインタラクションを自動化する方法(残念ながら、私のシステムには「スクリプト開発ツール」がありません)scn.sap.com/docs/DOC-4614

また、BIBS機能が役立つ場合がありますが、私のシステムでは機能しませんでしたscn.sap.com/docs/DOC-4612

7
Shodan

これを使用すると、SAPに接続していないかのように0人の子も取得します。
_Set sapCon = New SAPFEWSELib.GuiApplication_

代わりにこれを使用することにより、実際に機能しています。
Set sapCon = GetObject("SAPGUI").GetScriptingEngine

これによると: https://answers.sap.com/questions/12487790/what-are-the-differences-in-vba-methods-to-connect.html?childToView=12494892

1
user 88 91

私は自分でこの問題に遭遇し、「列挙子」エラーの解決策を見つけました。あなたが言及した参照されたstackoverflowの投稿にもそれを投稿しました。

これを変更します:Set Connection = Sap_Application.Children(0)

これに:Set Connection = Sap_Application.Children(1)

そこで説明したように、なぜこれが起こるのか、それが何を意味するのかわからないので、数字をいじっただけでうまくいきました。

手遅れにならないことを願っています。さもないと、他の誰かの助けになるかもしれません。

よろしく

1
Anonygreat