2016-11-21 23 views
0

SAPの巨大なレポートからデータを取り出し、Excelでクリーンアップを実行してAccessにロードするスクリプトを作成しようとしています。少なくとも、それは私の最終目標です。 SAPのデータは汚染されているため、私たちは、私たちの部門に特有のデータを整理した場所としてAccessに頼っています。
私は20年後に私が知っていたことを覚えていませんが、スクリプト作成の新人ですが、私はSAPとExcelの両方で組み込みのマクロジェネレータを使用しています。が欲しいです。私が今実行しているのは、「Microsoft Excelは、別のアプリケーションがOLEアクションを完了するのを待っています」というエラーです。これは、私のレポートが実行に非常に時間がかかるために起こりうると思われます。それはプロセスを停止し、これは私が設定して忘れることができ、午前中にデータを持っていると思われます。 スクリプトはExcelでマクロとして起動し、SAPに接続してレポートをトリガします。レポートが実行され、SAPを使用してExcelにエクスポートされます。レポートのサイズを考えると、1か2か月のチャンクでしか実行できませんが、1年分のデータを取得する必要があります。私はスクリプトを6回、2ヶ月ずつ繰り返すことができます。 2か月以上経過していれば、レポートは何かを生成する前にタイムアウトになります。私はこれを簡素化するためにSAPのバックグラウンドで」ファイル名を指定して実行を使用しようとしましたが、生成された出力が役に立たないほど文字化けしている。ここで私はこれまで持っているものである。SAPからExcelに戻って再び戻るスクリプト

Sub Experimental1() 

' start the SAP portion 

Dim SapGuiAuto, application, connection, session, WScript 
If Not IsObject(application) Then 
    Set SapGuiAuto = GetObject("SAPGUI") 
    Set application = SapGuiAuto.GetScriptingEngine 
End If 
If Not IsObject(connection) Then 
    Set connection = application.Children(0) 
End If 
If Not IsObject(session) Then 
    Set session = connection.Children(0) 
End If 
If IsObject(WScript) Then 
    WScript.ConnectObject session, "on" 
    WScript.ConnectObject application, "on" 
End If 
' 
' ***the above is key to opening a script in SAP. SAP must be running for this to work*** 
' begin ZSPWAR launch 
session.findById("wnd[0]").maximize 
session.findById("wnd[0]/tbar[0]/okcd").Text = "zspwar" 
session.findById("wnd[0]").sendVKey 0 
session.findById("wnd[0]").sendVKey 17 
session.findById("wnd[1]/usr/txtENAME-LOW").Text = "" 
session.findById("wnd[1]/usr/txtENAME-LOW").SetFocus 
session.findById("wnd[1]/usr/txtENAME-LOW").caretPosition = 0 
session.findById("wnd[1]").sendVKey 8   session.findById("wnd[1]/usr/cntlALV_CONTAINER_1/shellcont/shell").currentCellRow = 8 
session.findById("wnd[1]/usr/cntlALV_CONTAINER_1/shellcont/shell").selectedRows = "8" 
session.findById("wnd[1]").sendVKey 2 
' adjust the date 
session.findById("wnd[0]/usr/ctxtS_DATE-LOW").Text = (Date) 
session.findById("wnd[0]/usr/ctxtS_DATE-HIGH").Text = (Date) 
session.findById("wnd[0]/usr/ctxtS_LGORT-LOW").SetFocus 
session.findById("wnd[0]/usr/ctxtS_LGORT-LOW").caretPosition = 0 
session.findById("wnd[0]/tbar[1]/btn[8]").press 
'begins save portion of script 
'ignore warning from excel and keep going through long task 
'application.IgnoreRemoteRequests = True 
' end caffeine like behavior 
session.findById("wnd[0]").maximize 
session.findById("wnd[0]/mbar/menu[0]/menu[3]/menu[1]").Select 
session.findById("wnd[1]/usr/cmbG_LISTBOX").Key = "08" 
session.findById("wnd[1]/tbar[0]/btn[0]").press 
session.findById("wnd[1]/tbar[0]/btn[0]").press 
session.findById("wnd[1]/usr/subSUBSCREEN_STEPLOOP:SAPLSPO5:0150/sub:SAPLSPO5:0150/radSPOPLI-SELFLAG[0,0]").Select 
session.findById("wnd[1]/usr/subSUBSCREEN_STEPLOOP:SAPLSPO5:0150/sub:SAPLSPO5:0150/radSPOPLI-SELFLAG[0,0]").SetFocus 
session.findById("wnd[1]/tbar[0]/btn[0]").press 
session.findById("wnd[1]/tbar[0]/btn[0]").press 

'Ends Save portion 

'back into Excel 

    ChDir _ 
     "G:\Warranty\Strategy's\Special Projects\001 Process and Procedure  Documentation\Databases\Core Return Database" 
    ActiveWorkbook.SaveAs Filename:= _ 
     "G:\Warranty\Strategy's\Special Projects\001 Process and Procedure  Documentation\Databases\Core Return Database\ZSPWAR test1.xlsx" _ 
    , FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False 

をこれは、私を除いて、私が何をしたいんExcelのエラーメッセージを介して子守しなければならないと私はあなたの問題を解決する方法を提供するSAPに戻って、あなたが私に。

+0

てみてください。[ファイル] - > [オプション]> [詳細設定、および一般的な下DDE_ –

+0

Application.DisplayAlertsを使用_Ignore他のアプリケーションをチェック= Falseの 私はその行を実行し、別のマクロを作成したときに動作するようです最初にメインマクロをサブルーチンとして組み込みます。 –

答えて

0

を指示することができます任意のヘルプまたは物品のための

おかげで、フォーカスを取得する方法を知りません。例えば、

Sub Experimental1() 

' start the SAP portion 

Dim SapGuiAuto, application, connection, session, WScript 
Set SapGuiAuto = GetObject("SAPGUI") 
Set SAPapplication = SapGuiAuto.GetScriptingEngine 
Set connection = SAPapplication.Children(0) 
Set session = connection.Children(0) 
' 
' ***the above is key to opening a script in SAP. SAP must be running for this to work*** 
' begin ZSPWAR launch 
session.findById("wnd[0]").maximize 
session.findById("wnd[0]/tbar[0]/okcd").Text = "zspwar" 
session.findById("wnd[0]").sendVKey 0 
session.findById("wnd[0]").sendVKey 17 
session.findById("wnd[1]/usr/txtENAME-LOW").Text = "" 
session.findById("wnd[1]/usr/txtENAME-LOW").SetFocus 
session.findById("wnd[1]/usr/txtENAME-LOW").caretPosition = 0 
session.findById("wnd[1]").sendVKey 8 
session.findById("wnd[1]/usr/cntlALV_CONTAINER_1/shellcont/shell").currentCellRow = 8 
session.findById("wnd[1]/usr/cntlALV_CONTAINER_1/shellcont/shell").selectedRows = "8" 
session.findById("wnd[1]").sendVKey 2 
' adjust the date 
session.findById("wnd[0]/usr/ctxtS_DATE-LOW").Text = (Date) 
session.findById("wnd[0]/usr/ctxtS_DATE-HIGH").Text = (Date) 
session.findById("wnd[0]/usr/ctxtS_LGORT-LOW").SetFocus 
session.findById("wnd[0]/usr/ctxtS_LGORT-LOW").caretPosition = 0 
session.findById("wnd[0]/tbar[1]/btn[8]").press 
'begins save portion of script 
'ignore warning from excel and keep going through long task 
'application.IgnoreRemoteRequests = True 
' end caffeine like behavior 
session.findById("wnd[0]").maximize 
session.findById("wnd[0]/mbar/menu[0]/menu[3]/menu[1]").Select 
session.findById("wnd[1]/usr/cmbG_LISTBOX").Key = "08" 
session.findById("wnd[1]/tbar[0]/btn[0]").press 
session.findById("wnd[1]/tbar[0]/btn[0]").press 
session.findById("wnd[1]/usr/subSUBSCREEN_STEPLOOP:SAPLSPO5:0150/sub:SAPLSPO5:0150/radSPOPLI-SELFLAG[0,0]").Select 
session.findById("wnd[1]/usr/subSUBSCREEN_STEPLOOP:SAPLSPO5:0150/sub:SAPLSPO5:0150/radSPOPLI-SELFLAG[0,0]").SetFocus 
session.findById("wnd[1]/tbar[0]/btn[0]").press 
session.findById("wnd[1]/tbar[0]/btn[0]").press 

'Ends Save Portion 

'for the SAP German version 
'SAP_Workbook = "Tabelle von Basis (1)" 

'for the SAP English version (?) 
SAP_Workbook = "Worksheet in ALVXXL01 (1)" 
EXCEL_Path = "G:\Warranty\Strategy's\Special Projects\001 Process and Procedure Documentation\Databases\Core Return Database" 
myWorkbook = "ZSPWAR test1.xlsx" 


On Error Resume Next 
Do 
Err.Clear 
Set xclapp = GetObject(, "Excel.Application") 
If Err.Number = 0 Then Exit Do 
'msgbox "Wait for Excel session" 
wscript.sleep 2000 
Loop 


Do 
Err.Clear 
Set xclwbk = xclapp.Workbooks.Item(SAP_Workbook) 
If Err.Number = 0 Then Exit Do 
'msgbox "Wait for SAP workbook" 
wscript.sleep 2000 
Loop 


On Error GoTo 0 


Set xclsheet = xclwbk.Worksheets(1) 

xclapp.Visible = True 
xclapp.DisplayAlerts = False 

xclapp.ActiveWorkbook.SaveAs EXCEL_Path & "\" & myWorkbook 
xclapp.ActiveWorkbook.Close 


Set xclwbk = Nothing 
Set xclsheet = Nothing 
'xclapp.Quit 
Set xclapp = Nothing 

'only if an information on the display 
session.findById("wnd[1]/tbar[0]/btn[0]").press 

よろしく、あなたの助けをみんなに ScriptMan

0

ありがとう!

問題への最終的な解決策は、より小さなモジュールにダウンスクリプトを分割することと、その後

application.DisplayAlerts = false 

は、全体的なプログラムの最初の行であることと、それらを順次実行することになりました。 これで3つのマクロがExcelにあります。最初は私の初期のコードで、最後の行は一番下のセーブを取り除こうとしています。これにより、機能している堅固なコアが残されます。私はちょうどいい動作する別の保存マクロを作成しました。 3番目のマクロは、最初にアラートを殺す行を実行し、他のマクロを順番に実行します。その間に1分間の強制停止があります。これは、作業中のマシンで制御を前後に渡すのにかかる時間が一体。

誰かが実際のコードを見たいと思えば、私はそれを置くでしょうが、かなり長いです。私はちょうどチャンクを構築し、次にこのように別々にストリングするという一般的な手法を共有したいと思っていました。それは私のために多くのプロジェクトに取り組んできましたが、なぜ私が最初にそれを試していないのか分かりません。

もう一度、ありがとうございました。私はこれが将来他の誰かに役立つことを願っています。

SAPでは
0

あなたは最大6セッションを実行することができます

  1. は6セッションを作成

  2. は6で(例えば、10日ごとに)自分の時間を分割し

  3. 作成s1.vba、S2 .vbs、s3.vbs、s4.vbs、s5.vbs、s6.vbs(このファイルにあなたのコードをコピーしてください)

  4. vbaエディタでは以下を使用して6セッションすべてを実行しますsim ultaneously

0
sub test 
    Dim wsh 
    Set wsh = VBA.CreateObject("WScript.Shell") 
    wsh.Run ("cscript ""C:\your path\s1.vbs""") 
    wsh.Run ("cscript ""C:\your path\s2.vbs""") 
    wsh.Run ("cscript ""C:\your path\s3.vbs""") 
    wsh.Run ("cscript ""C:\your path\s4.vbs""") 
    wsh.Run ("cscript ""C:\your path\s5.vbs""") 
    wsh.Run ("cscript ""C:\your path\s6.vbs""") 
end sub 
+1

コードは答えかもしれませんが、説明を追加すると良いでしょう – DeKaNszn

関連する問題