VBAまたはVBSからSASを制御されている方は多いと思います。
しかしSASとVBとを同期させる方法が分かりません。
以下のようなVBSがあったとします
(単純にsas.helpclassデータをproc printにて外部ファイルに吐いているだけのものです)。
Set Shell=CreateObject("WScript.Shell")
Set WS = WScript.CreateObject("SAS.Application")
WS.Submit "ods rtf file='D:\Class.rtf';"
WS.Submit "proc print data=sashelp.class; run;"
WS.Submit "ods rtf close;"
WS.Quit
Shell.popup "プリント終了しました",1
上記を実行しますと、"プリント終了しました"のメッセージが明らかに
SASの活動より前に出て来てしまいます
(上記プログラムは単純化されすぎていて、余り時間差が感じられないかも知れませんが、
もう少し複雑なプログラムでしたらよく分かるかと思います)。
SASの活動がQuitされた後に、VBの活動が始まるようなオプションはございますでしょうか。
以上ご教示のほど、よろしくお願いいたします。
izumi123さま
早速のご回答、誠に有難うございました。
ご提示のプログラムを試させて頂いたところ、
確かに設定時間の10秒後にpopupが出てくれました。
同期していると思います。
有難うございました。
Async Propertyが使えるかも知れません。
手元に環境がないのですぐに確認できませんが、時間ある時に試してみます。
http://support.sas.com/rnd/itech/doc/dist-obj/comdoc/ilngca.html
少し納得いっていない部分がありますが、以下のように記述することで私の環境では目的を達成できました。納得できていないのは、「Wait=True」の行が必要なことです。どのような環境でも同じ挙動を示すかどうかはわかりません。ドキュメントにはないプロパティです。。。
(Asyncプロパティは使えませんでした)
Set Shell=CreateObject("WScript.Shell") Set WS = WScript.CreateObject("SAS.Application") WS.Wait = True WS.Submit "data _null_;" WS.Submit "set sashelp.class(obs=1);" WS.Submit "rc = sleep(10);" WS.Submit "run;" Do while x=0 If (WS.Busy) then WScript.Sleep 1000 Else x=1 End If Loop WS.Quit Shell.popup "プリント終了しました",1
参考にした場所:
環境:
SAS9.4M5
Windows10
Microsoft (R) Windows Script Host Version 5.812
お役に立てれば幸いです。
izumi123さま
早速のご回答、誠に有難うございました。
ご提示のプログラムを試させて頂いたところ、
確かに設定時間の10秒後にpopupが出てくれました。
同期していると思います。
有難うございました。
working-dogさま
早速のご回答、誠に有難うございました。
Asyncプロパティを用いてプログラムを下記のように書き換えましたところ、
確かにClass.rtfが出来た後にpopupが出てくれるようになりました。
ただ同期しているのかまでは、よく分かりませんでしたので
Asyncプロパティをもう少し検証してみたいと思います。
Set Shell=CreateObject("WScript.Shell")
Set WS = WScript.CreateObject("SAS.workspace")
Set LS = WS.LanguageService
LS.Async = True
LS.Submit "ods rtf file='D:\Class.rtf';"
LS.Submit "proc print data=sashelp.class; run;"
LS.Submit "ods rtf close;"
WS.Close
Shell.popup "プリント終了しました",1
SAS Innovate 2025 is scheduled for May 6-9 in Orlando, FL. Sign up to be first to learn about the agenda and registration!