2016-11-21 24 views
0

SAPデータを.XLSXファイルにエクスポートしてから、このファイルをExcelにインポートするVBAコードがあります。ファイルがインポートされた後、私は多くの他のアクションを実行するコードを持っています(例えば、データの解析や整理、セル数のカウントなど)。マクロが終了した後、エクスポートされたSAP .XLSXファイルが開きます。マクロが完了した後にエクスポートされたファイルが開かれます。不要です。

正常に終了するKill関数を使用しようとしましたが、マクロの最後にファイルを開く代わりに、見つからないファイルに関するメッセージが表示されます。

マクロが完了する前にファイルを閉じようとしましたが、ファイルが実際に開かれていないのでエラーになります。

マクロを完了する前にファイルを開いて閉じようとしましたが、正常に終了しましたが、マクロの最後に再びファイルが開きます。

しかし、コードを壊してステップスルーすると、ファイルは最後に開かれません。

私はいくつかの他のさまざまなタイマー機能、DoEventsなどを試しましたが、まだ運がありません。 1.エクスポートされたファイルがコードの最後に開かないようにするか、 を開きません。2.ファイルが見つからないように「ファイルが見つかりません」というメッセージが表示されないようにします。マクロ中に。

サンプルコード

'Opens SAP connection 
Dim SAPGUI 
Dim Applic 
Dim connection 
Dim Session 
Dim WSHShell 

Application.DisplayAlerts = False 

Shell "C:\Program Files (x86)\SAP\FrontEnd\SAPgui\saplogon.exe", vbNormalFocus 

Set WSHShell = CreateObject("WScript.Shell") 
    Do Until WSHShell.AppActivate("SAP Logon ") 
    Application.Wait Now + TimeValue("0:00:01") 
    Loop 

Set WSHShell = Nothing 
Set SAPGUI = GetObject("SAPGUI") 
Set Applic = SAPGUI.GetScriptingEngine 
Set connection = Applic.OpenConnection("04. R3 PRD []", True) 
Set Session = connection.Children(0) 
' Session.findById("wnd[0]").iconify 
    Session.findById("wnd[0]/usr/txtRSYST-MANDT").Text = "100" 
    Session.findById("wnd[0]/usr/txtRSYST-BNAME").Text = Environ("Username") 
    Session.findById("wnd[0]/usr/pwdRSYST-BCODE").Text = sysstart.psswrd 
    Session.findById("wnd[0]").sendVKey 0 

Session.findById("wnd[0]").maximize 
Session.findById("wnd[0]/tbar[0]/okcd").Text = "/nZUI_SELECTION" 
Session.findById("wnd[0]").sendVKey 0 

''Performs some filters and opens data 

' Export from SAP to .xlsx file. 
Session.findById("wnd[0]/usr/cntlGRID1/shellcont/shell").contextMenu 
Session.findById("wnd[0]/usr/cntlGRID1/shellcont/shell").selectContextMenuItem "&XXL" 
Session.findById("wnd[1]/tbar[0]/btn[0]").press 
Session.findById("wnd[1]/usr/ctxt[0]").Text = "C:\Users\" & Environ("Username") & "\Downloads" 
Session.findById("wnd[1]/usr/ctxt[1]").Text = "SAP_export.XLSX" 
Session.findById("wnd[1]/tbar[0]/btn[11]").press 

'Closes SAP connection 
Set Session = Nothing 
    connection.CloseSession ("ses[0]") 
Set connection = Nothing 


'Clear table from SMS Input 
    ThisWorkbook.Worksheets("SMS Input").Select 
    Cells.Select 
    Selection.ClearContents 

'Insert .xlsx file data 
    Cells.Select 
    Selection.Delete Shift:=xlUp 
    Range("A6").Select 
    With ActiveSheet.ListObjects.Add(SourceType:=0, Source:=Array(_ 
     "OLEDB;Provider=Microsoft.ACE.OLEDB.12.0;Password="""";User ID=Admin;Data Source=C:\Users\" & Environ("Username") & "\Downloads\SAP_export.XLSX;Mode=Share Deny None" _ 
     , _ 
     ";Extended Properties=""HDR=YES;"";Jet OLEDB:System database="""";Jet OLEDB:Registry Path="""";Jet OLEDB:Database Password="""";Jet OL" _ 
     , _ 
     "EDB:Engine Type=37;Jet OLEDB:Database Locking Mode=0;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;Je" _ 
     , _ 
     "t OLEDB:New Database Password="""";Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don't Copy Lo" _ 
     , _ 
     "cale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False;Jet OLEDB:Support Complex Data=False;Je" _ 
     , "t OLEDB:Bypass UserInfo Validation=False"), Destination:=Range("$A$6")). _ 
     QueryTable 
     .CommandType = xlCmdTable 
     .CommandText = Array("Sheet1$") 
     .RowNumbers = False 
     .FillAdjacentFormulas = False 
     .PreserveFormatting = True 
     .RefreshOnFileOpen = False 
     .BackgroundQuery = True 
     .RefreshStyle = xlInsertDeleteCells 
     .SavePassword = False 
     .SaveData = True 
     .AdjustColumnWidth = True 
     .RefreshPeriod = 0 
     .PreserveColumnInfo = True 
     .SourceDataFile = "C:\Users\" & Environ("Username") & "\Downloads\SAP_export.XLSX" 
     .ListObject.DisplayName = "Table_export3" 
     .Refresh BackgroundQuery:=False 
     .MaintainConnection = False 
    End With 

ファイルがインポートされた後、私はいくつかの列を解析し、ワークシート全体で情報を整理。

コードの最後に、私は上記のようにさまざまなバリエーションを試しました。まず

'Open the export and then close to avoid it opening at end of macro. 
Workbooks.Open Filename:="C:\Users\" & Environ("Username") & _ 
          "\Downloads\SAP_export.XLSX" 
Workbooks("SAP_export.XLSX").Close savechanges:=False 
Application.Wait Now + TimeValue("0:00:01") 
Kill "C:\Users\" & Environ("Username") & "\Downloads\SAP_export.XLSX" 

は、私は、これはそれがOLEDBを使用して.XLSXをインポートセクションの問題だと思ったが、そうではありません。 SAP接続終了後にコードを終了すると、ファイルは自動的に最後に開きます。 私はこの同じ問題を持つ他の投稿を見ましたが、確かな答えはありません。うまくいけば、これは...私はコメントで説明し何をしようとした任意のフィードバックを事前に

おかげで、

+0

あなたはドン何かをやっているコードを持っている場合、」 "私はいくつかのVBAコードを持っています"そのコードの[関連する部分]を共有すると便利かもしれません。あなたがしていることを推測するように私たちに依頼しないでください。 –

+0

こんにちはティム、申し訳ありません。わかりやすくするために関連するコードを追加しました。エクスポートされた.XLSXファイルをSAPから開く自動機能のようですが、マクロが完了するまでは表示されません。これは私が把握しようとしていると起こるのを防ぐためにしようとしているものです。ありがとう! – jmeddy

+0

こんにちは、私はSAPからデータをインポートするいくつかのことを行います。私は複数の関数とサブルーチンに分割しました。それは私のプロセスがSAPからファイルをエクスポートしてからファイルデータをインポートしてファイルを強制終了して成功したと私はクローズすることができましたが、私の場合は一時ファイルだけです。たぶんあなたの問題のセクションを囲んで次のOn Error ResumeとOn Error Goto 0を囲むかもしれません。私はファイルのオープンやエラーに関して、onエラーコードがなくても問題はありません。元のシートの何かがSAPエクスポートで何かを参照している可能性はありますか?ステップ実行して、どうやって行くか見てみてください。 –

答えて

0

さらに提案:;-)

は、私は問題の次の回避策を提供します以下のスクリプトを実行してください。例えば

. . . 
'Open the export and then close to avoid it opening at end of macro. 
set Wshell = CreateObject("WScript.Shell") 
Wshell.run "c:\tmp\SAP_Workbook_Close.vbs",1,false 
End Sub 

SAP_Workbook_Close.vbs:

SAP_Workbook = "SAP_export.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.Close 


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

よろしく、 ScriptMan

+0

ねえ、ちょうどそれを試してみました - それは動作します!マクロの最後には瞬間的なフラッシュがあります。しかし、少なくともユーザーを混乱させないようにしています。必要に応じて、複数のエクスポートされたワークシートを処理するためにvbsを変更できるとしていますか?私はあなたがVBA/SAPの問題で提出した多くの有益な情報を見つけました – jmeddy

0

明らかです。それは非常にきちんとしていないと私はテストすることができませんでした。 私はいくつかの行を変更していくつかのものを整理しましたが、ファイルデータからの挿入.xlsxセクションではその行が必要とは思われません。 どうやって行くか教えてください。

+0

これは私が実際に持っている方法と非常によく似ています。私は〜30の他のサブを呼び出す1つのメインSubを持っています。私は、ワークブック( "SAP_export.XLSX")を別の場所に閉じて、それが助けになるかどうかを調べるようにしました。ファイルがまだ実際には開いていないため、「下付き文字範囲外」が返されます。ランタイムが完了するまで開かない。このファイルは、コードを壊さずに実行した場合にのみ表示されます。私が壊れた場合、ファイルは最後に開かれません。私は待機時間を試してみましたが、たとえOntimeイベントを使用していても、プログラムで実行時間を壊して再起動しようとしました。 – jmeddy

+0

OLEDB接続とレコードセットを終了していますか?私は彼らがあなたのコードでそれを閉じる必要があると確信しているが、何かが接続を保持し、問題を引き起こしているようだ。 OLEDBのインポート(コメントアウト)せずに同じことをしようとすると、それは動作します。もしそうなら、問題がどこにあるかを知っていて、次にOLEDBのインポートを再構成/カスタマイズすることができます。 –

+0

ええと、.MaintainConnection = Falseを使用してOLEDB接続を閉じます。私は.htm SAPエクスポート(必要な書式も保持しています)を使用しようとしましたが、マクロの最後に開くという問題はありません。私はこれがSAPからの輸出を圧倒していることがわかります。 Err.Numberには= 0そして、出口は 「のMsgBoxを行う場合 err.clear 設定xclwbk = xclApp.Workbooks.Item(SAP_Workbook) の操作を行います。 – jmeddy

0

今日私の回答は削除されないように、もう少し書くようにしています。 (変更なし)あなたのVBAプログラムの終了時

'old codes 
. . . 
Session.findById("wnd[1]/usr/ctxt[1]").Text = "SAP_export.XLSX" 
Session.findById("wnd[1]/tbar[0]/btn[11]").press 
'new codes 
SAP_Workbook = "SAP_export.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 
session.findById("wnd[0]").iconify 
session.findById("wnd[0]").maximize 
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.Close 


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

'old codes 
'Closes SAP connection 
Set Session = Nothing 
connection.CloseSession ("ses[0]") 
Set connection = Nothing 
. . . 

よろしく、 ScriptMan

+0

は、私はあなたが提供されたコードを実行しようとしたが、残念ながらそれはで連続ループに入り、ScriptManありがとう"SAPブックを待つ" wscript.sleep 2000 ループ – jmeddy

+0

実際にSAPから.htmエクスポートを使用して試してみましたが、問題を解決するWebクエリーを介してExcelにインポートしましたが、別の問題が発生しました。私はテーブルのクエリをクリアする方法を見つける必要がありますので、残りのコードはインポートされたデータで動作します...これは別の問い合わせでしょうか?私はまだ.XLSXエクスポートの問題を解決したいので、もしあなたがさらに提案したら、私は試みます。ありがとう! – jmeddy

+0

これは、最初のループ(Excelを待つ)が完了したことを意味します。これで、Excelフォルダの外観がわかります。または、行かない場所のスクリーンショットを表示することもできます。あなたはExcelのフォルダがどのように見えるかを確認する必要がありOW 。 – ScriptMan

関連する問題