none
SHELLで起動したプログラムの入力待機状態を知る RRS feed

  • 質問

  • こんにちは。 当方初心者ですが独学である程度理解してきました。

    しかしどうしてもわからないことがありますのでご教示願います。

    エクセルから他のプログラム(PERONALCOMINICATIONS)をShellExecuteで起動し、

    エクセルのデータから必要な情報をDICに格納し、LOOPさせてそのソフトにSendKeysで入力し

    結果を変数に入れていくプログラムを作成しました。

    しかしSendKeysをしてからプログラムが反応して画面が切り替わるまでに1秒ほどかかることもあるため、

    SendKeysのまえに必ず1秒か2秒ほどWaittimeさせてます。この無駄な時間を

    省きたく何かいい方法がないか検討しています。

    SendKeysを使ってパーソナルコミニケーション内で作成したマクロを実行させたりもするのですが、

    そのマクロの最後にFLG=TRUEとしてそのFLGの判別をエクセルVB側で受け取れれば出来るかとも

    考えたのですが、出来ないようでした。

     

    どなたさまかよきアドバイスをお願いします。

    2009年1月30日 12:32

回答

  • PERONAL COMINICATIONSって、↓これですよね?
    http://www-06.ibm.com/jp/software/network/pcomm/

     この中でPERONAL COMINICATIONSをPCOMMと省略されていたため、それをそのまま使いました。
    (混乱させてしまったのであればごめんなさい)

    あとPERONAL COMINICATIONSのバージョンは何ですか?
    IBMで公開されている資料を見ると、外部アプリケーションとの機能は一通り持っているみたいです。
    http://www-06.ibm.com/jp/domino01/mkt/cnpages1.nsf/ec7481a5abd4ed3149256f9400478d7d/4925722f004efd2b4925724100015f92/$FILE/PCOMMV590HODV1000Comp.pdf

    紹介記事を見るとOLEやJava Beans、(おそらくPCOMM上での)VB Scriptもあるみたいです。
    また、サンプルプログラムもインストールされるようですので、サンプルプログラムがあるか確認してみてはどうでしょうか?
    http://www-06.ibm.com/jp/software/network/pcomms/fb.html

    • 回答としてマーク sk7474 2009年2月18日 7:50
    2009年2月3日 15:19
  •  個人的にはですが、PCOMMからExcelのオブジェクトが開けるのであれば、PCOMM側からExcelのオブジェクトを操作してホストコンピュータへ送信する方がすっきりするような気がします。
    ※Excelのオブジェクトの操作方法は、検索エンジンで検索すれば沢山見つかりますし。
     ただし、これはあくまでも個人的な意見なので、最終的にはtetsuyasuperさんが判断してください。

     

    • 回答としてマーク sk7474 2009年2月18日 7:50
    2009年2月10日 15:03
  • PCOMMのマクロに関するサイトを色々見てみました。

    まず、方法としては二つあると思います。
     1.PCOMMのマクロからExcelのオブジェクトを開き、PCOMMのマクロで処理を行う。
     2.ExcelのマクロでPCOMMのオブジェクトを開き、Excelの内容をPCOMMへ送信する。

     自分としては、PCOMMはすでに起動している(と考えられる)ので、PCOMM側でExcelのオブジェクトを開き、PCOMMのマクロで処理した方がいいのではないか?と思います。
     方法ですが、PCOMM側のVBScript(どっちもVBS使っているからややこしいな)で、CreateObject("Excel.Application")ができれば、あとはPCOMMのマクロでExcelが操作できます。
    (もしExcelのオブジェクトを操作する方法が解らなければ、その旨言ってください)

    あと、提示されたサイト(http://excelblog.dtiblog.com/blog-entry-208.html)のサンプルコードを見てみましたが、
    「WaitForAppAvailable」でアプリケーションが使用可能になるまでウェイト、「WaitForInputReady」でキー入力可能になるまでウェイトしていると思われます。
     そのため、PCOMM側のVBScriptで「SendKeys “[enter]”」を送信する前にこの行を追加すれば、余分なウェイトは入れなくてもよくなると思います。
    余談ですが、http://excelblog.dtiblog.com/blog-entry-208.htmlのサンプルでは、PCOMMに送信するデータ(Excelの内容)をマクロとしてファイルに出力しているため、参考程度に留めた方がいいと思います。

     繰り返しになりますが、一度PCOMMのマクロ(VBS)で「CreateObject("Excel.Application")」ができるか試してみてください。

    • 回答としてマーク sk7474 2009年2月18日 7:51
    2009年2月8日 14:09

すべての返信

  • tetsuyasuper の発言:

    こんにちは。 当方初心者ですが独学である程度理解してきました。

    しかしどうしてもわからないことがありますのでご教示願います。

    エクセルから他のプログラム(PERONALCOMINICATIONS)をShellExecuteで起動し、

    エクセルのデータから必要な情報をDICに格納し、LOOPさせてそのソフトにSendKeysで入力し

    結果を変数に入れていくプログラムを作成しました。

    しかしSendKeysをしてからプログラムが反応して画面が切り替わるまでに1秒ほどかかることもあるため、

    SendKeysのまえに必ず1秒か2秒ほどWaittimeさせてます。この無駄な時間を

    省きたく何かいい方法がないか検討しています。

    SendKeysを使ってパーソナルコミニケーション内で作成したマクロを実行させたりもするのですが、

    そのマクロの最後にFLG=TRUEとしてそのFLGの判別をエクセルVB側で受け取れれば出来るかとも

    考えたのですが、出来ないようでした。

     

    どなたさまかよきアドバイスをお願いします。



     PERONALCOMINICATIONSって何かと思ったら、IBMの3270エミュレータだったんですね。
     PCOMMについてはあまり詳しくはないので良い回答ができるかわかりませんが、PCOMMに外部アプリケーションとPCOMMの連携を行うような仕組み(APIみたいなもの)はありませんでしょうか?

     自分が以前に関わった仕事では、日立のT560/20エミュレータだったのですが、画面上の文字を取得/画面上に文字を表示/[送信]処理を行う仕組みが用意されていました。
     それらの機能を使用て、ホストコンピュータのステータスを画面から文字列として読み込み、[キーロック]と表示されていなければ画面に文字列を表示し、最後に[送信]を行うアプリケーションを作成したことがあります。

     PCOMMにこのような機能が提供されていれば、ウェイトしたりSendKeysで文字を送る必要がなくなりますので、マニュアルを参照したり、担当窓口に相談してみてはどうでしょうか?

    2009年2月3日 9:40
  • PCOMMってやつなんですかね? よくわかりません。
    マニュアル読んだのですが、量が多くて何がなんだかよくわかりません。
     
    いろいろ試したのですが、PCOMM側で操作する方法も検討しています。
     
    PCOMM側で画面上の文字を変数に入れる方法がよくわからないです。
     
    しかもクリップボードの値を変数にうまいこと入れることも出来ない状況です。

    だれかお助けください。
    2009年2月3日 14:56
  • PERONAL COMINICATIONSって、↓これですよね?
    http://www-06.ibm.com/jp/software/network/pcomm/

     この中でPERONAL COMINICATIONSをPCOMMと省略されていたため、それをそのまま使いました。
    (混乱させてしまったのであればごめんなさい)

    あとPERONAL COMINICATIONSのバージョンは何ですか?
    IBMで公開されている資料を見ると、外部アプリケーションとの機能は一通り持っているみたいです。
    http://www-06.ibm.com/jp/domino01/mkt/cnpages1.nsf/ec7481a5abd4ed3149256f9400478d7d/4925722f004efd2b4925724100015f92/$FILE/PCOMMV590HODV1000Comp.pdf

    紹介記事を見るとOLEやJava Beans、(おそらくPCOMM上での)VB Scriptもあるみたいです。
    また、サンプルプログラムもインストールされるようですので、サンプルプログラムがあるか確認してみてはどうでしょうか?
    http://www-06.ibm.com/jp/software/network/pcomms/fb.html

    • 回答としてマーク sk7474 2009年2月18日 7:50
    2009年2月3日 15:19
  • Verは5.0でした。
    サンプルプログラムとか探したのですが、全然わかりません。
    サンプルプログラムは私のPCにはないのかもしれません。
    (システム管理者のみが使用可能??)
    IBMのサイトの説明で普通の人は理解できるのでしょうか??
    私にはさっぱりわかりませんが。
    来週火曜日になってしまいますが、今出来ているプログラムを貼り付けます。
    2009年2月5日 14:32
  • tetsuyasuper さん の発言:

    来週火曜日になってしまいますが、今出来ているプログラムを貼り付けます。

    念のため。

    もし、業務で使っているコードなのであれば、それを世に出すことが認められるのか今一度考えてみて下さい。
    社外秘のコードをここに書き込むと、機密保持違反とか服務規程違反とかになるかもしれません。


    参考になった返信には「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に指定できます)。
    2009年2月6日 11:00
    モデレータ
  •  了解しました。
    うちの会社も最近かなり情報に厳しくて、会社内からの書き込みも禁止されています。
    PCOMMのマクロなら問題ないと私は判断していますが・・・

    http://www.ozzne.com/htm/Ozn03-01.html
    の最後にあるマクロは加工して使用可能でした。
       Set autPsObj = autECLSession.autECLPS
    の部分が大きな鍵を握っているのかと思いながら・・・
    http://www005.upp.so-net.ne.jp/khayashi/download.htm
    の中にあるIBM Personal Communication 用 IE 連動マクロはコメントも書いてあり、
    いろいろ勉強になりそうだとおもいながら・・・

    ちなみに今出来ているのは2パターンあります。
    1.エクセルからPCOMMを開いてそこにSendKeysで文字を送り結果を反映するものと
    (基本的に完成・ただしPCOMMからの応答を取得できないためWaittimeで数秒止めている為かなり時間がかかる。)

    2.エクセルから下の方法でPCOMM用のデータ入力マクロを作成する方法
    http://excelblog.dtiblog.com/blog-entry-208.html
    これは未完成。クリックボードにコピーできる容量を超えてしまっている?ため最後までデータをコピーできない。
    もともと1の方法でもクリックボードの容量が足らないため?か、変数にクリックボードの値を入れて、最後に変数から
    クリックボードに貼り付けてエクセルにクリックボードの値を貼り付けたのですが・・・
    PCOMMのマクロ上で変数を定義・クリックボードの扱いの仕方がよくわからなくて止まっている感じです。

    PCOMM上でedit-coppyappendという機能があり、何も選択していない状態だと、画面のテキストをすべてコピーして
    今までコピーしたものに追加してくれるのですが、数十個と量が多くなると、それがなぜかうまくいかない。

    今書いてて思ったのですが、最後に変数からクリックボード値をコピーできるって事はクリップボードのせいじゃないのかも??

    詳細は火曜日になってしまいますが、 皆様良い週末を・・・

    2009年2月6日 15:36
  •   必要なものとしては、PCOMMとアプリケーション間の連携に関する資料なので、今できているプログラムを貼り付けても、アドバイスできないと思います。
     なんらかのマニュアル(紙、オンラインに関わらず)はないですか?

     IBMのPCOMMに関するサイトを見た限り、OLEオートメーションやDDE(今ではあまり使われていないけど)をサポートしているみたいなので、これに関する説明、もしくはサンプルプログラムがあれば回答できると思います。
    (逆に言えば、これらの資料がないと回答できません)

     あと提示されたリンク先の内容をみて、回答できるか考えてみます。
    2009年2月8日 13:33
  • PCOMMのマクロに関するサイトを色々見てみました。

    まず、方法としては二つあると思います。
     1.PCOMMのマクロからExcelのオブジェクトを開き、PCOMMのマクロで処理を行う。
     2.ExcelのマクロでPCOMMのオブジェクトを開き、Excelの内容をPCOMMへ送信する。

     自分としては、PCOMMはすでに起動している(と考えられる)ので、PCOMM側でExcelのオブジェクトを開き、PCOMMのマクロで処理した方がいいのではないか?と思います。
     方法ですが、PCOMM側のVBScript(どっちもVBS使っているからややこしいな)で、CreateObject("Excel.Application")ができれば、あとはPCOMMのマクロでExcelが操作できます。
    (もしExcelのオブジェクトを操作する方法が解らなければ、その旨言ってください)

    あと、提示されたサイト(http://excelblog.dtiblog.com/blog-entry-208.html)のサンプルコードを見てみましたが、
    「WaitForAppAvailable」でアプリケーションが使用可能になるまでウェイト、「WaitForInputReady」でキー入力可能になるまでウェイトしていると思われます。
     そのため、PCOMM側のVBScriptで「SendKeys “[enter]”」を送信する前にこの行を追加すれば、余分なウェイトは入れなくてもよくなると思います。
    余談ですが、http://excelblog.dtiblog.com/blog-entry-208.htmlのサンプルでは、PCOMMに送信するデータ(Excelの内容)をマクロとしてファイルに出力しているため、参考程度に留めた方がいいと思います。

     繰り返しになりますが、一度PCOMMのマクロ(VBS)で「CreateObject("Excel.Application")」ができるか試してみてください。

    • 回答としてマーク sk7474 2009年2月18日 7:51
    2009年2月8日 14:09
  • 返信ありがとうございます。
    [PCOMM SCRIPT HEADER]  
     LANGUAGE=VBSCRIPT 
     DESCRIPTION=  
     [PCOMM SCRIPT SOURCE]  
     OPTION EXPLICIT  
     autECLSession.SetConnectionByName(ThisSessionName)  
     
     REM This line calls the macro subroutine  
     subSub1_  
     
     sub subSub1_()  
     Dim xlApp  
     Set xlApp = CreateObject("Excel.Application")  
     xlApp.Visible = True 
     xlApp.Workbooks.Open "C:\Sample.xls"  
     Set xlApp = Nothing 
     end sub  
     

    以前上記コードをやってみたのですがエラーになりました。
    (合っていないのかも知れないですが・・・)


    http://publib.boulder.ibm.com/infocenter/pcomhelp/v5r9/index.jsp

    マニュアルは最近ネットで見つけた上のリンクを見ています
    (製品のドキュメンテーション ただしVerは5ですが)
    ただ全然といっていいほどわかりません。






    余談ですがの方のサイトのマクロの内容ですが、アレはPCOMMで実行するマクロを作成しています。
    エクセルからPCOMM側に送信したいデータのPCOMMマクロを作成しています。エクセルから必要なデータを抜き出し、
    入力したいデータを含めてマクロを作成しているのでけっこう有用です。
    もう一息のところまできていると思っています。
    2009年2月9日 0:23
  •  特にコードを見る限り、ExcelオのCreateObjectには問題なさそうですね。

     あと別の方法として、Excelでタブ区切りのテキストファイルにエキスポートして、それをPCOMM側のマクロで1レコードずつ読み込んで、画面のフィールドにセットしてみてはどうでしょうか ?

     多分ですがタブ区切りのファイルなので、1レコードすけば、そのまま各フィールドに値がセットされる思います。
    (各項目に値がセットされなければ、splitで項目を分割して一つ一つフィールドにセットすればいいと思います)

     その際、1レコード(もしくは1フィールド)をセットする前後に「WaitForAppAvailable」を追加すけば、キー入力できるまでウェイトすると思われます。(多分2レコード目以降は「WaitForAppAvailable」不要だと思うけど)

    2009年2月9日 16:09
  • 大発見です。
    1.
     REM This line calls the macro subroutine  を
    ’REM This line calls the macro subroutineにしたら上のエクセルの起動が出来てしまいました。  
    これでPCOMMからエクセルを開くことが出来ちゃうわけですが、エクセルを選択することも出来るのでしょうかね?
    こっちでうまく作れるようになるとこっちのほうがいいのかな?と考えたりもしますが・・・
    どっちのほうがいいのでしょうか???

    2.さらに画面の文字を取得することも出来ました。
    buf=autECLSession.autECLPS.gettextで
    bufに画面上の値(テキスト群)を取得することが出来ました。
    ただ最後にエクセルに貼り付けたときにxll.range("A1")=buf2としたときに
    A1セルにすべてを入れようとしてしまいます(セル内に入力)当方希望は1行ずつ貼り付けたいです。
    クリップボードに一度貼り付けようとしたのですが、SET CB = NEW DATAOBJECTとしたところ
    認識しませんでした。

    3.下段コードはエクセルでPCOMMで実行するマクロの一部です。
    この前にエクセルデータからPCOMMで検索したい値をdic2に格納しています。
     (まだ下のコードはCOPY-APPENDしていますが、それをbufに格納するように変更し、"autECLMacro ""[F11_0130]"""  
    の部分はマクロを実行させることが出来ないので、ショートカットキーを設定しSendKeysでキー操作に変更予定です。)
    ただ最後にエクセルに転記 Or クリックボードにコピーさせておいて各自でエクセルに貼り付け加工マクロを実行する
    という方法があったのですが、これも両方いい方法が思いついていません。 
    Const sFilePath = "C:\Program Files\Personal Communications\private\TEST.MAC"   
    'ヘッダー   
    Open sFilePath For Output As #1   
    Print #1, "[PCOMM SCRIPT SOURCE]"   
    Print #1, "OPTION EXPLICIT"   
    Print #1, "autECLSession.SetConnectionByName(ThisSessionName)"   
    Print #1, "REM This line calls the macro subroutine"   
    Print #1, "subSub1_"   
    Print #1, "autECLSession.SetConnectionByName(ThisSessionName)"   
    Print #1, "REM This line calls the macro subroutine"   
    Print #1, "subSub1_"   
    Print #1, "sub subSub1_()"   
    '省略 ‘繰り返し部分(5回繰り返す)   
    For Each x In dic2   
    Print #1, "autECLSession.autECLOIA.WaitForAppAvailable"   
    Print #1, "autECLSession.autECLOIA.WaitForInputReady"   
    Print #1, "autECLSession.autECLPS.SendKeys """ & x & """"   
    Print #1, "autECLSession.autECLOIA.WaitForInputReady"   
    Print #1, "autECLSession.autECLPS.SendKeys ""[enter]"""   
    Print #1, "autECLSession.autECLOIA.WaitForInputReady"   
    Print #1, "autECLSession.autECLOIA.WaitForAppAvailable"   
    Print #1, "autECLMacro ""[edit-copyappend]"""   
    Print #1, "autECLSession.autECLOIA.WaitForInputReady"   
    Print #1, "autECLSession.autECLOIA.WaitForAppAvailable"   
    Print #1, "autECLMacro ""[F11_0130]"""   
     
    Next 'フッター   
    Print #1, "end sub"   
    Close #1   
    MsgBox "完了"   
    'DoEvents   
     
    End Sub   
     
    2009年2月10日 14:37
  •  個人的にはですが、PCOMMからExcelのオブジェクトが開けるのであれば、PCOMM側からExcelのオブジェクトを操作してホストコンピュータへ送信する方がすっきりするような気がします。
    ※Excelのオブジェクトの操作方法は、検索エンジンで検索すれば沢山見つかりますし。
     ただし、これはあくまでも個人的な意見なので、最終的にはtetsuyasuperさんが判断してください。

     

    • 回答としてマーク sk7474 2009年2月18日 7:50
    2009年2月10日 15:03
  •  こんにちは。中川俊輔 です。

    CatTailさん、とても丁寧な回答ありがとうございます。

    tetsuyasuperさん、フォーラムのご利用ありがとうございます。

    有用な情報と思われたため、CatTailさんの回答へ回答マークをつけさせていただきました。

    今後ともフォーラムをよろしくお願いします。
    それでは!
    マイクロソフト株式会社 フォーラム オペレータ 中川 俊輔
    2009年2月18日 7:54