- 11/07 [PR]
- 11/18 jscriptでエクセル多重起動の制御を考える(LimechatVer)
- 11/07 WARGs1.01β
- 11/03 k-booksリニューアル
- 10/31 WARGs
- 10/28 W.A.R.S
Title list of this page
jscriptでのエクセルの多重起動の制御について。
(特定のファイルが開いていることを知る方法)
◇まずは必要性について
エクセルをデータロガーのように、開いた状態にしておいて、Limechatから自動で必要な発言だけを収集する。などといった動作をさせたいとします。
エクセルの操作をjscriptで行いたいとき、開くときにはWorkbooks.Open等を使うと思います。また、既に開いているエクセルにアクセスする際にはGetobject等を使うと思われます。
結構これらは曲者で、トリガのたびにWorkbooks.Openなんてしてたらウィンドウがガンガン増えていきますし、Getobjectはちゃんと指定したエクセルが既に開いている状態でないといろいろ予期しない動作をします。
特に二回目以降は読み取り専用で開いていくので厄介です。
なので特定のファイルがいま開いています。と言う状態を知りたいわけです。
そして確かに開いてます。と分かればGetobjectで安全にアクセスできると言うわけです。
多重起動と書いてますが、私のメインの使用目的は上記のようなものです。
◇考え方
jscriptでの多重起動は結構厄介です。
VB.NETをやったあとだと特にそう感じます。
多重起動のチェックは通常はファイル名等を見る
・MainWIndowTitleプロパティ
・Mutexクラス
等の方法があるのですが、今回はLimechatでのVerについて限定します。
このVer5.8.22886ではこれらが使えません。
なので代案として、
プロセス監視
を用います。
基本的な考え方としては
・既にそのプロセスが存在していたら多重起動をさせないように制御する
具体的にいえばプロセスにEXCEL.EXEが既にあったら制御を掛けるといったふうになります。
しかし、エクセルは開くたびにプロセスが個数分増えていきます。
3つのエクセルファイルを開けば3つのEXCEL.EXEプロセスが生まれます。
なのでこのエクセルファイルの多重起動を制御したい。と言う場合にはプロセスの監視だけでは不十分です。
つまり以下の問題が発生します。
①プロセスではファイル名が分からない。
②ファイル名を取得する手法がjscript5.8.22886では使えない
③エクセルは複数プロセスを発生させる(すべてEXCEL.EXE)
以上の理由によって複数のエクセルが開いている場合には、特定のエクセルファイルの判別が困難になっています。
じゃぁ固有の属性は何か無いかと考えたときに、プロセスIDがあります。
・プロセスIDは同時には重複しない
・開くたびに割り振られるIDが変わる
・開いている間はずっと固定
こういう特徴があります。
多重起動を制御するということは、一度は既に開いた状態なのですから、その初回のときにEXCEL.EXEのプロセスIDを記憶させておいて、以後プロセスIDを指定してアクセスするようにすれば、他のエクセルが混じっていても特定のエクセルファイルを操作できますし、多重起動のチェックも出来ます。
しかしこの手法には、「初回起動時に他のエクセルが起動していないこと」が必須条件になります。
というのもプロセスIDを取得するにはやはりプロセスからEXCEL.EXEを探して、それに付随するプロセスIDを記憶させるからです。他のEXCEL.EXEが混ざっていると正しく取得が出来なくなります。
◇必要な機能
まとめるとだいたい以下のような機能を持ったスクリプトを組まないといけません。
①特定ファイルの初回起動時に他のEXCELが開いてないかチェックする機能
②起動させるときにプロセスIDを記憶させる機能
③エクセルにアクセスするトリガが発生したときに、PIDを使って特定のファイルにアクセスする機能
ソースと解説はまた後日追記します。
(特定のファイルが開いていることを知る方法)
◇まずは必要性について
エクセルをデータロガーのように、開いた状態にしておいて、Limechatから自動で必要な発言だけを収集する。などといった動作をさせたいとします。
エクセルの操作をjscriptで行いたいとき、開くときにはWorkbooks.Open等を使うと思います。また、既に開いているエクセルにアクセスする際にはGetobject等を使うと思われます。
結構これらは曲者で、トリガのたびにWorkbooks.Openなんてしてたらウィンドウがガンガン増えていきますし、Getobjectはちゃんと指定したエクセルが既に開いている状態でないといろいろ予期しない動作をします。
特に二回目以降は読み取り専用で開いていくので厄介です。
なので特定のファイルがいま開いています。と言う状態を知りたいわけです。
そして確かに開いてます。と分かればGetobjectで安全にアクセスできると言うわけです。
多重起動と書いてますが、私のメインの使用目的は上記のようなものです。
◇考え方
jscriptでの多重起動は結構厄介です。
VB.NETをやったあとだと特にそう感じます。
多重起動のチェックは通常はファイル名等を見る
・MainWIndowTitleプロパティ
・Mutexクラス
等の方法があるのですが、今回はLimechatでのVerについて限定します。
このVer5.8.22886ではこれらが使えません。
なので代案として、
プロセス監視
を用います。
基本的な考え方としては
・既にそのプロセスが存在していたら多重起動をさせないように制御する
具体的にいえばプロセスにEXCEL.EXEが既にあったら制御を掛けるといったふうになります。
しかし、エクセルは開くたびにプロセスが個数分増えていきます。
3つのエクセルファイルを開けば3つのEXCEL.EXEプロセスが生まれます。
なのでこのエクセルファイルの多重起動を制御したい。と言う場合にはプロセスの監視だけでは不十分です。
つまり以下の問題が発生します。
①プロセスではファイル名が分からない。
②ファイル名を取得する手法がjscript5.8.22886では使えない
③エクセルは複数プロセスを発生させる(すべてEXCEL.EXE)
以上の理由によって複数のエクセルが開いている場合には、特定のエクセルファイルの判別が困難になっています。
じゃぁ固有の属性は何か無いかと考えたときに、プロセスIDがあります。
・プロセスIDは同時には重複しない
・開くたびに割り振られるIDが変わる
・開いている間はずっと固定
こういう特徴があります。
多重起動を制御するということは、一度は既に開いた状態なのですから、その初回のときにEXCEL.EXEのプロセスIDを記憶させておいて、以後プロセスIDを指定してアクセスするようにすれば、他のエクセルが混じっていても特定のエクセルファイルを操作できますし、多重起動のチェックも出来ます。
しかしこの手法には、「初回起動時に他のエクセルが起動していないこと」が必須条件になります。
というのもプロセスIDを取得するにはやはりプロセスからEXCEL.EXEを探して、それに付随するプロセスIDを記憶させるからです。他のEXCEL.EXEが混ざっていると正しく取得が出来なくなります。
◇必要な機能
まとめるとだいたい以下のような機能を持ったスクリプトを組まないといけません。
①特定ファイルの初回起動時に他のEXCELが開いてないかチェックする機能
②起動させるときにプロセスIDを記憶させる機能
③エクセルにアクセスするトリガが発生したときに、PIDを使って特定のファイルにアクセスする機能
ソースと解説はまた後日追記します。
PR
どうもシュクレールです。
WARGsのほうは大きな仕様変更をしてます。
やっぱりサイズが大きくて邪魔だと言う話があったので、カスタマイズできるようにしました。ウィンドウもまとめてたのを分離して3つにしました。それぞれMAPとリンクフラッグとギルマス表示兼操作パネル。
MAPはROのMAPに被せるとSEの砦でも自分の居場所がわかるように作ってます。
まぁ、それよか今日は入間航空ショーだったのですが、行けなかったです。
戦闘機好きとしては・・・とても残念。
で、どこに行ってたかと言うと、k-booksのリニューアルイベントwwwwwwww
↑これがチョー欲しかったのです。
DSケースです。4000円の買い物でもらえます。
使わないけどね!
ねこみみだから必死になりました。
開店の10時にいったんですがー・・・
レジ並びに40分掛かりました。
リニューアルなんでレイアウトが大きく変わって↓
こんなかんじです。
コミックを8冊くらい選んで4000円超えるようにして真ん中のレジに並びました。
私が並び始めたときは地図の×印のところです。
でまぁ、40分後に会計済ませたら、最終的には倍くらいの長さになってました。
軽く1hこえるってwwwww
奥の同人のほうとかはみてないっす。てか人が多すぎて見てる隙間がないというか。
どこ行こうとしてもレジ待ちの列に邪魔されて棚が見れないという。
まぁ、しばらくして落ち着いたらゆっくりみにいきますわー。
あ、あとパイ30000個がんばりました。
WARGsのほうは大きな仕様変更をしてます。
やっぱりサイズが大きくて邪魔だと言う話があったので、カスタマイズできるようにしました。ウィンドウもまとめてたのを分離して3つにしました。それぞれMAPとリンクフラッグとギルマス表示兼操作パネル。
MAPはROのMAPに被せるとSEの砦でも自分の居場所がわかるように作ってます。
まぁ、それよか今日は入間航空ショーだったのですが、行けなかったです。
戦闘機好きとしては・・・とても残念。
で、どこに行ってたかと言うと、k-booksのリニューアルイベントwwwwwwww
↑これがチョー欲しかったのです。
DSケースです。4000円の買い物でもらえます。
使わないけどね!
ねこみみだから必死になりました。
開店の10時にいったんですがー・・・
レジ並びに40分掛かりました。
リニューアルなんでレイアウトが大きく変わって↓
こんなかんじです。
コミックを8冊くらい選んで4000円超えるようにして真ん中のレジに並びました。
私が並び始めたときは地図の×印のところです。
でまぁ、40分後に会計済ませたら、最終的には倍くらいの長さになってました。
軽く1hこえるってwwwww
奥の同人のほうとかはみてないっす。てか人が多すぎて見てる隙間がないというか。
どこ行こうとしてもレジ待ちの列に邪魔されて棚が見れないという。
まぁ、しばらくして落ち着いたらゆっくりみにいきますわー。
あ、あとパイ30000個がんばりました。
こんばんはシュクレールです。
なんやかんやあって名称をWARGsとしました。
β版ですが、98%完成です。
画像はWikiからのを自分で二次加工することにしました。
フル透過モードと透過解除モードを追加。
ギルマスライブラリについてはちょっと力技で解決しました。
起動時にアプリケーションが起動しているパスは取得してるので、それにMasterLibraryをくっつけて、フォルダ内部のファイルをGetfileで全部取り出します。サブディレクトリは含まないで。
一気に配列に入れるのも考えたんですが、テキストファイル以外が混ざると困るので、For Each inでひとつひとつ調べて拡張子がテキスト以外のものは除外するようにしました。
で、テキストのファイル名(拡張子を省く)をGetFileNameで取り出して、コンボボックスに追加すると同時に、配列を作って、そのファイルのパスをひとつひとつ加えていきます。このとき配列の番号はカウンターをiで作って追加するたびに回していきます。
で、個々までが初回起動時。
次に実際にコンボボックスで選択された場合。
実は配列の番号とコンボボックスのSelectedIndexが一致するので(するように最初追加させたから)、このSelectedIndexを配列番号にして配列からアドレスを引っ張ってきます。あとはStreamReaderでファイルの中身を読んで、テキストラベルボックスに反映させるだけです。
一応うまく動いてよかったです。
あと何気にアイコンも自作してみました。4つくらい作って一番アイコンとしてみやすいものを選びました。
なんやかんやあって名称をWARGsとしました。
β版ですが、98%完成です。
画像はWikiからのを自分で二次加工することにしました。
フル透過モードと透過解除モードを追加。
ギルマスライブラリについてはちょっと力技で解決しました。
起動時にアプリケーションが起動しているパスは取得してるので、それにMasterLibraryをくっつけて、フォルダ内部のファイルをGetfileで全部取り出します。サブディレクトリは含まないで。
一気に配列に入れるのも考えたんですが、テキストファイル以外が混ざると困るので、For Each inでひとつひとつ調べて拡張子がテキスト以外のものは除外するようにしました。
で、テキストのファイル名(拡張子を省く)をGetFileNameで取り出して、コンボボックスに追加すると同時に、配列を作って、そのファイルのパスをひとつひとつ加えていきます。このとき配列の番号はカウンターをiで作って追加するたびに回していきます。
で、個々までが初回起動時。
次に実際にコンボボックスで選択された場合。
実は配列の番号とコンボボックスのSelectedIndexが一致するので(するように最初追加させたから)、このSelectedIndexを配列番号にして配列からアドレスを引っ張ってきます。あとはStreamReaderでファイルの中身を読んで、テキストラベルボックスに反映させるだけです。
一応うまく動いてよかったです。
あと何気にアイコンも自作してみました。4つくらい作って一番アイコンとしてみやすいものを選びました。
どうもシュクレールです。
ハード屋なのにソフトが楽しくなってきました。
VB.NETは出来ることが多いので、jscriptのように代案を考える必要もないので。
あとぐぐるとすぐ出てくるのでいいっすねー・・・。
というわけで開発途中経過です。
ちょっとスクリプトの部分が裏に見えてますが気にしないでください。
リンクフラッグナビゲーションの部分が出来ました。
左上のコンボボックスに同期して変わるようになってます。
右下の部分はいろいろテスト用のものです。
この部分にマスター情報を出力させようかなと思っています。
ただ、ライブラリから読み込んでコンボボックスにファイル名を表示させるのは出来たのですが、そのファイル名の中身とどうやってリンクさせようかなーと思っています。
なんかif文でSelectedText="同盟名"で分岐させようとしても、文字列をうまく拾ってくれなくてどうしようかと・・・。DropDownだと文字列拾えないとかMSDNに書いてあるし・・・。なんか前もってリンクさせておく必要がありそうですなぁ。
悩み中・・・。
あとレイアウトを左右入れ替えられるようにしようかなと思っています。
チェックボックスで各デザインの座標を変えるだけなのでこれは簡単に出来そうでした。
まぁ、全部出来上がらないと書き込めないスクリプトなのでさいごっすね。
そんな感じです。
今週中にはβ版完成させたいんですが、まぁ、週末あれだからねぇ・・・。
来週になりそうなよかん。
あと、地味に名前を付けてみました。
War Asist for Ragnarok SE
略してW.A.R.S
どうだ!中2っぽいだろ!英語おかしいあたりが!
あとすぐ英語にしたがるあたりが!
でもRagnarok SEっておかしいからせめてGVGを入れようか迷ってるがどうでもいいところです。
W.A.R.G.S?
プロフィール
HN:
komyu/シュクレール/修造
性別:
非公開
自己紹介:
こうぶつはけものみみとのーびす(♀)とエリーン
主にROとTERAとラノベと雑多なkomyuの日記帳です。
主にROとTERAとラノベと雑多なkomyuの日記帳です。
TERAキャラ紹介
シュクレール(バサ)
syuzo(エレ)
サケマス(アチャ)
その他サブ
ウリエルキゥィス(スレLv54)
Vermillion(サラLv56)
パズドラ
157,318,362
フレンド募集中
枠なきゃ増やす
最終プレイ3日以上になったら消す
カレンダー
10 | 2024/11 | 12 |
S | M | T | W | T | F | S |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
最新記事
(12/02)
(07/07)
(07/06)
(06/14)
(05/31)
ブログ内検索
最新コメント