過去の桐井戸端BBS (桐ver.9)
23942 一括処理からエクセル書き出しを行い開いたエクセルを終了させるにはどうしたらよいのでしょうか 新井 2003/12/17-22:28
桐の表から,絞り込みをかけた上で3,4個のシートをもつブックを50ほどつくる必要があります。
一括処理で エクセルの書き出し を使うとできるはずですが,1回目でエクセルを開かない 設定にしているのに
エクセルが起動していると メッセージが出て,終わってしまう。

この起動しているエクセルを終了させる方法が分かりません。

これが,成功できると,一気に作れるのですが。

次のステップは,逆に,多数のエクセルファイルを桐の表に変更する
一括処理も考えているのですが,きっと同じところで躓きそうです。

よろしくお願いいたします。

23944 Re:エクセル書き出しの終了 hidetake 2003/12/18-01:03
記事番号23942へのコメント
>この起動しているエクセルを終了させる方法が分かりません。

これは「終了させる」では無くて,「終了するのを待つ」のだと思いますが,
たゆーさんも困られていた内容ですね!

次のスレッドに関係すると思います。

エクセル書き出しの<終了状態>
http://www2u.biglobe.ne.jp/~s_tanaka/cgi-bin/bbs/bbs.cgi?function=logview_html&no=89#4431


待つ方法(外部ツールを使う方法)は上記スレッドを見てもらえば,
参考になる方法もあろうかと思います。

なお,(無理やり)終了させる(終了するようにお願いする)方法は
例えば次のような VBS で可能になります。

例えば,実行状態にある「桐(kiri8.exe)」を全て終了させるスクリプト!

i = 0
For Each Process in
GetObject("winmgmts:{impersonationLevel=impersonate}").ExecQuery("SELECT
* FROM Win32_Process WHERE NAME='kiri8.exe'")
Process.Terminate
MsgBox "PIDが" + CStr(Process.ProcessId) + "の「桐」を終了しました。"
i = i + 1
Next

何れのスクリプトも WSH(VBS) で WMI を使いますので,環境に使えません。
23953 Re:エクセル書き出しの終了 新井 2003/12/18-22:28
記事番号23944へのコメント
hidetakeさん

>>この起動しているエクセルを終了させる方法が分かりません。
>
>これは「終了させる」では無くて,「終了するのを待つ」のだと
>思いますが,たゆーさんも困られていた内容ですね!
>
>次のスレッドに関係すると思います。
>
>エクセル書き出しの<終了状態>
>http://www2u.biglobe.ne.jp/~s_tanaka/cgi-bin/bbs/bbs.cgi?function=logview_html&no=89#4431

ありがとうございました。上のスレッドを参考に試してみましたが,
===================================
Do
WScript.Sleep 3000← 'ループをまわしとく。100msec 待つ。
Set oEvt = oEvent.NextEvent(3000)←
'SWbemEventSourceオブジェクトのNextEventメソッド。
'500msecでタイムアウトする。
===================================
と変更して,ブックが40ほどでワークシートは270ほどが作成できました。
上の数値と下の数値の意味がもう一つ分からないですが,
どちらの数値を変えればよかったのでしょうか。

また,実行時の
sh excel_wait.vbs,プ=&秒
kill &秒
は,桐の変数&秒を使うようですが,

sh excel_wait.vbs,プ=&i
kill &i
&i=&i+1
などと変更しました。これも&秒を使う意味がよく分かりません。
詳しいことはよく分からないのですが,もし,教えてくださるなら,よろしくお願いいたします。


23954 Re:エクセル書き出しの終了 hidetake 2003/12/18-23:18
記事番号23953へのコメント
hidetake です。年取ると直ぐに思い出せない部分もありますが・・・ (^^;

>===================================
> Do
> WScript.Sleep 3000← 'ループをまわしとく。100msec 待つ。
> Set oEvt = oEvent.NextEvent(3000)←
> 'SWbemEventSourceオブジェクトのNextEventメソッド。
> '500msecでタイムアウトする。
>===================================

WScript.Sleep 3000 の方は,ループ回す時の空回りで CPU の負荷率を
下げるための Wait なので,特にレスポンス性を気にしなければ大きいほど,
CPU の負荷的には下げられたと思います。

で,oEvent.NextEvent(3000) の方は,イベントが発生するまでのタイムオーバーするまでの
待機時間だから,イベントを発生するのを WSH が状態を監視しながら待ち続けるので
CPU 負荷的には大きくなる方向だったと思います。

だから,この値で機能しなかったというのは,どういう理由なのか良くわかりませんが,
どちらかというと WScript.Sleep の方で Wait は増やす方が CPU 効率的には良かったと思います。

こう言う,CPU の負荷に関わる Wait やループさせる作業には,
タスクマネージャーを使って CPU の使用率も見ながら良い値に調整した方が良いと思います。

でも,そのままでは機能しなかったのですか? 何故だろう?


>また,実行時の
>sh excel_wait.vbs,プ=&秒
>kill &秒
>は,桐の変数&秒を使うようですが,

別に何でも良いです。例ですので桐で最初から持ち合わせている変数を利用したに過ぎません。

ちなみに .WFM & .KEV によるイベント処理内でなく,.CMD を使うならば,桐内部だけで済ませられる,
「遅延」コマンドを使った遅延やシステムコマンドを使った同期処理でも済ます方法もあろうかと思います。
kill (プロセス終了)コマンドって・・・ (^^;


23955 Re:エクセル書き出しの終了 hidetake 2003/12/18-23:25
記事番号23954へのコメント
>sh excel_wait.vbs,プ=&i
>kill &i
>&i=&i+1

ちなみに,最後の &i=&i+1 って意味無いですよ!
&i て,最初の行のコマンドで代入されて(返り値を受け取るための変数),
2行目でその結果を利用しているだけですから・・・

詳しくは,ここやたゆーさんのところで kill なり
プロセス終了で検索してみて下さい。
いつ使えなくなるかわからないような禁じ手です。 :-)
23957 Re:エクセル書き出しの終了 新井 2003/12/19-20:07
記事番号23954へのコメント
>ちなみに .WFM & .KEV によるイベント処理内でなく,.CMD を使うなら
>ば,桐内部だけで済ませられる,「遅延」コマンドを使った遅延や
>システムコマンドを使った同期処理でも済ます方法もあろうかと思います。
>kill (プロセス終了)コマンドって・・・ (^^;

説明ありがとうございました。スクリプトは見たことも,実行したこともなかった。
難しいですね。最後にかかれている「遅延」コマンドを見て,ひょっとすると

試してみました。
遅延 50 (5秒間)で 待つのがいやなので,余所に行って仕事をしていると
途中でメールが入ったりして,一時停止状態でしたが,再実行で課題をクリアしました。
この方がよかったみたいです。

表のレコードは12000程度,これを単一化して270程度のレコードを書き出して,
それを1つ1つ読み込んで,元表に絞り込みをかけて,エクセルファイルに書き出す。
この作業で50ほどのブックをつくる。1つのブックには3〜5のワークシートを含んでいる。
という仕事をしたかったのです。
エクセルファイルが終了できないので,「待ってやる」ために時間設定が必要だったように思います。

遅延の時間はもう少し短くてもよいのかもしれませんが,
使っているコンピュータの性能に依存するのでしょうね。

どうも,ありがとうございました。助かりました,今後の方針に目鼻が立ちました。
次は,エクセルから桐へという場面で,何か質問するかもしれませんが,
よろしくお願いいたします。


23958 Re:エクセル書き出しの終了 hidetake 2003/12/19-20:46
記事番号23957へのコメント
>>ちなみに .WFM & .KEV によるイベント処理内でなく,.CMD を使うなら

しかし,桐っていつまでこんな条件がつきまとうのですかね?
早く制限無しで「遅延」や「システム」や「プレビュー」など普通に使いたいものです。


>説明ありがとうございました。スクリプトは見たことも,実行したこともなかった。
>難しいですね。最後にかかれている「遅延」コマンドを見て,ひょっとすると
>試してみました。
>遅延 50 (5秒間)で 待つのがいやなので,余所に行って仕事をしていると
>途中でメールが入ったりして,一時停止状態でしたが,再実行で課題をクリアしました。
>この方がよかったみたいです。

コマンドからの実行ですと,遅延が手っ取り早いし,桐内部の動作で完結できてその方が良いと思います。 (^^;

あとはどの程度のエラー対策を持たせるか?も,あろうかと思いますが,
時には決まった時間内では終了しなかったり,できるだけ短い時間の待ち時間を指定し
次に進みたいのならば,最低限の遅延を持たせた上で次の処理に進み,
その処理が正常しなかった場合は,まだエクセルが終わりきっていなかった?と言う事で
再度,遅延させて,それを規定回数だけ繰り返してトライしてみる。と言うのが
正しい(途中で止まるのを防ぐ)処理なのでしょうね。


23961 終了状態で判定できるのでは 佐田 守弘 2003/12/19-22:25
記事番号23942へのコメント
新井さん
エクセルExcel書き出しで、起動したExcelが終了するのを待つのだとしたら、
このコマンドの終了状態を取る事で、エラー回避ができるのではないでしょうか。
終了状態の値が、233の場合には、すでにExcelが起動している事を意味します。
CPUの負担にはなるかも知れませんが、終了状態が233の間は、エクセル書き出し
コマンドを繰り返せば良いと思います。

つまり
代入 &実行リターン=233
繰り返し (&実行リターン=233)
 エクセル書き出し ・・・・・,終了状態=&実行リターン
繰り返し終了

佐田守弘(KS-00119)
23963 Re:エクセル書き出しの終了 hidetake 2003/12/19-22:58
記事番号23957へのコメント
>説明ありがとうございました。スクリプトは見たことも,実行したこともなかった。

ちなみに,たゆーさんのところで出してあるスクリプトは WMI を使ったものです。
ですので,通常の WSH (VBS) とは大きく異なります。

どちらかというと,最新の機能を使ったより OS と密着した機能を使ったものでより高度なテクニックです。
(より簡単に今までできなかった事もできます)

Windows はこれからシステムの設定やファイルなどがデータベース化され SQL で
操作できるようになる方向にあります。それを操作できるインターフェースとなるのが WMI であると思います。
ですので,システムを弄る人はより SQL で簡単にできると言うか,SQL も必要になってきます。

より詳しい内容は下記などを参照して下さい。

WMI Fun !! 〜 WMI に興味がある方・システム管理者必見 !! 〜
http://wmifun.atinfinity.net/

WMI スクリプト入門 : 第 1 部
http://www.microsoft.com/japan/msdn/columns/scripting/scripting06112002.asp
WMI スクリプト入門 : 第 2 部
http://www.microsoft.com/japan/msdn/columns/scripting/scripting08132002.asp

# 桐でこのような機能を扱える時代は来るのだろうか?
# あるいは Excel の終了などを桐内部で検知したり制御する機能など・・・


23965 Re:終了状態で判定できるのでは hidetake 2003/12/19-23:31
記事番号23961へのコメント
>代入 &実行リターン=233
>繰り返し (&実行リターン=233)
> エクセル書き出し ・・・・・,終了状態=&実行リターン
>繰り返し終了

ただ,こんだけですと,気付かずに Excel を任意に起動した状態で
この桐の処理が実行された場合には,Excel を人為的に終了させない
限り無限ループになってしまいます。
それに気付いて自分で Excel を終了してくれれば良いのですが,
人を選ばない処理を希望するなら,一定回数(あるいは一定時間)トライしてダメだったら警告を出して中止するような
仕組みを組み込んた方が良いのでしょうね。

それと,ウエイト無しでループさせると桐は CPU を全部使い果たすけど,
Excel と桐のループとどちらにシステムは重きを持って CPU を割り当てるか?
まぁ〜終わる処理ではあろうけど無駄ななぁ〜

この無駄をやっていたのが「i-mode 桐」で出されていた kiri-cgi.exeだったですね!
桐からの返事を待っている間,ウエイトも入れられずにループ回して待機していたので,
桐が動いていようといまいと CPU を 100% 使い切っていた!
そんな状況だから,桐側の動きも遅くなって仕方ない状態だったのでしょう・・・


で,何故にイベントでは「遅延」が」使えないのでしょうか?

23966 Re:終了状態で判定できるのでは 新井 2003/12/19-23:38
記事番号23961へのコメント
佐田 守弘さん


>エクセルExcel書き出しで、起動したExcelが終了するのを待つのだとしたら、
>このコマンドの終了状態を取る事で、エラー回避ができるのではないでしょうか。
>終了状態の値が、233の場合には、すでにExcelが起動している事を意味します。
>CPUの負担にはなるかも知れませんが、終了状態が233の間は、エクセル書き出し
>コマンドを繰り返せば良いと思います。
>
>つまり
>代入 &実行リターン=233
>繰り返し (&実行リターン=233)
> エクセル書き出し ・・・・・,終了状態=&実行リターン
>繰り返し終了

ありがとうございます。今,バックグラウンドで一括処理が動いています。
支障もなく実行されています。
こんな方法があるのですか? 
書き出し続けるなんて,思いもよらぬ発想です。

ファイル名が同じだ!動いているぞ!という怒声が聞こえる気がしますが。

びっくりです。


戻る