一旦制御を手放して、また戻ってくる方法
2019-07-29 14:47
一覧表から別の画面を呼び出すようなものを作っています。
一覧表からいくつかの項目を別の画面に渡し、その画面で渡された値を用いてDBから検索してデータを表示するようなものです。
これを一連のアクションセットで実施しようとすると、検索したデータが画面に表示されません。(検索はちゃんとされているっぽいです)
検索のあとにポップアップメッセージを1個出すと表示されます。
待機ではダメです。
つまり、検索して表示するときに、アクションセットが制御を一旦手放さなければならないと思うのですが、
Excel VBAでそのようなことをやるときはsetTimeoutを使いますよね。(たとえばポップアップメッセージでOKを押したいとかのとき)
こんな感じ
objIE.document.Script.setTimeout "javascript:document.getElementByID('sampleID01').click()", 200
こんな感じで、一旦制御を手放してまた戻ってくるようなことって、CELFでもできるのでしょうか。
======
[2019/8/1 追記]
自分でいろいろ試していて、問題は2個ある感じがしています。
具体的なアクションセットのスクショを貼ります!
以下のようにアプリ内にシートを2枚作成し、各々にアクションセットを作成したとします。
《呼ぶほうのシート》
以下のアクションセットを作成し、シート上のボタンに割り付けています。
・呼ばれるほうのシートのセルに値をセット→ポップアップメッセージ表示→呼ばれるほうのシートを新規ウィンドウで表示する(アクティブウィンドウ以外は操作させないにチェックしない)パラメータで値を渡す→「パラメータで渡された値をキーにしてSQLでテーブルからデータを取得」を実行→「シートを閉じる」を実行
《呼ばれるほうのシート》
以下のアクションセットを作成してあります。
・「テーブル情報取得」:パラメータで渡された値をキーにしてSQLでテーブルからデータを取得
・シートを閉じる
この場合、ボタンを押すと、呼ばれるほうのシートは、呼ぶほうのアクションセットでセットされた値と、パラメータで渡された値だけ表示されている状態(つまり、SQLで取得した内容が画面に反映されない)で終了します。
これでは処理結果がわからないので、「シートを閉じる」を実行する前に「シートをExcelで保存する」アクションを入れてみたところ、呼ぶほうのシートでセットした値も、パラメータで渡した値も表示され、SQLで検索された値も表示されていました。
まず1個目の問題として、
値をセットした後に、謎の「ポップアップメッセージ表示」を入れていますが
これがないと、呼ばれるほうのシートに値がセットされないのです。
(貼ったスクショは、このポップアップメッセージのない、うまくいかないほうのバージョンです)
全部されないのではなくて、レコード1件おきにされていたりされなかったりします……。待機を入れてみましたが同じでした。
ここで、ポップアップメッセージ以外の方法で、アクションセットが制御を手放すことがしたいのです。
2個目の問題は
SQLで検索した値が画面に反映されないことです。
「パラメータで渡された値をキーにしてSQLでテーブルからデータを取得」を実行→「シートを閉じる」を実行 の間にポップアップメッセージを表示すれば、SQLで取得した内容が画面に表示されるのですが……。
Excelでいうところの「再計算」とか「画面の更新」みたいなことはどのようにすればできるのでしょうか。
回答を投稿するにはログインが必要です。
モーダル表示(チェックあり)できない、とのことですので、少し複雑ですがサブアプリを利用した方法を考えてみました。
(添付イメージで説明いたします)
①でサブアプリと、サブアプリを呼び出し利用する側のアプリを作成します。
#サブアプリについてはヘルプを参照ください
②でサブアプリ側に、サブアプリ、表示の2つのシートを作成します(名前は何でも構いません)
③で表示シートに、アクション(検索結果を画面表示する)を記述します
④でサブアプリシートに、アクション(表示シートに検索キー(従業員ID)を渡す>マスタ検索を実行>表示シートを表示)を記述します
ここで一旦サブアプリを公開します。次に呼び出し側アプリを作成します。
⑤で呼び出し側メインシートに、アクション(サブアプリに検索キーを渡す>サブアプリのアクション「マスタ検索」を実行)を記述します
--
呼び出し側アプリで従業員IDを指定して、サブアプリ実行ボタンクリックします。
別ウィンドウが表示され、従業員情報が表示されます。
他のID入力しボタンクリックすると、従業員情報もリアルタイムに更新されます。
ありがとうございます。
「アクティブウィンドウ以外は操作させない」チェックボタンをチェックすると、後続ブロックの処理が、呼ばれるほうのシートが閉じてからでないと実行されないので(質問のほうにアクションセットのスクショを足しました)
このシートは自動でも手でも操作するので、呼ばれるほうの起動時実行に書くわけにもいかず、というところで詰んでいます。
http://celf.scskinfo.jp/celf-help/ja/texts/action_use/sheet/transit_other_sheet/transit_other_sheet.html#id3
というのと、理由はわからないんですが、チェックすると、アクションで新規ウィンドウを開いたときに値がうまく渡らない「ことがある」(絶対渡らないわけではないので理由がわからない…)ので、チェックしないでいます。
kurata様がやろうとされていることが、
・メイン画面の条件1をサブ画面に渡し、サブ画面でデータ検索し表示
・メイン画面の条件2をサブ画面に渡し、サブ画面でデータ検索し表示
:
であり、都度サブ画面の検索結果を確認したいのであれば、サブ画面をモーダル表示するのがいいと思います。
⇒「アプリ~のシート~を新規ウィンドウで表示する」でアクティブウィンドウ以外は操作させない、をチェック
ただ、きっと、そういう話でもないんですよね・・・
「シート~を新規ウィンドウで表示する」場合は、「アクティブウインドウ以外操作させない」にチェックを入れるとモーダルに開きますので、そのシートが閉じられまで、シート内のアクションが順次起動されます。
もしチェックしていなければこれで解決する可能性はあると思います。
ありがとうございます、まさにそのようにしています。
問題は
「シート~のセル~に~をセットする」
してから
「シート~を新規ウィンドウで表示する」
して、
その次のアクションセットを実行するまでの間に、ポップアップを1個はさまないと、そのセットした値が表示されないことです。
このアクションセットを単体で起動すると(つまりこのアクションセット自体をなんらかのボタンに紐づけて、順に手でボタンを押していく)ポップアップがなくとも正常に表示されます。
このアクションセットを、他のアクションセット(複数のアクションセットを続けて起動するように書いてある)から起動すると、ポップアップウィンドウがないとダメなのです。
なんででしょう… やってることは同じなのに… (´;ω;`)
「一覧表からいくつかの項目を別の画面に渡し・・」の方法が、
「アプリ~のシート~を新規ウィンドウで表示する」のパラメータ利用であれば
「シート~のセル~に~をセットする」にしてみてはいかがでしょうか。