忍者ブログ
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

続きの記事です。
このブログ横幅狭いんで、コピペしてみたほうがいいと思います・・・。
あとタブが無効にされるみたいなんで、段がちょっと分かりにくいですが。

---------------------エクセルチェック---------------------
var LimechatPath; //ユーザ設定のパスを格納する
var ExlExistCheck; //ExcelCheck.jsでの結果を格納する。
var ExlOpenCheck; //ExcelCheck.jsでの結果を格納する。

LimechatPath="絶対パスを記述"

ExlExistCheck = false; //初期化
ExlOpenCheck = false; //初期化
var ExlCheckCounter = 0;

var fso = new ActiveXObject('Scripting.FileSystemObject');
if(!fso.FileExists(LimechatPath)){
ExlExistCheck = false;
}else{
ExlExistCheck = true;
var e= new Enumerator(GetObject("winmgmts:").InstancesOf("Win32_Process"));
for (;!e.atEnd();e.moveNext()){
var Process = e.item();
if(Process.Name == "EXCEL.EXE"){
ExlCheckCounter++;
}
}
if(ExlCheckCounter == 0){
ExlOpenCheck = true;
}else{
ExlOpenCheck = false;
}
e = null;
}
fso = null;
}
---------------------------------------------------------

Limechatpathに多重制御したいエクセルファイルの絶対パスを格納します。
ここでは、
①そのパスにちゃんとファイル存在してる?
②いまエクセル開いてない?
と言うことを最初にチェックしています。
フラグを2つ用意してます。
ExlExistCheck はファイルが見つかればtrue
ExlOpenCheck は他にエクセルが開いてなければtrue
となっています。
細かく見ていくと
if(!fso.FileExists(LimechatPath))
の部分でファイルの存在を見ています。
エクスクラメーション「!」は否定を意味します。
なのでファイルが存在していない場合にはifの内部に分岐し、ファイルが存在していればelseに分岐します。

Enumerator(GetObject("winmgmts:").InstancesOf("Win32_Process"));
これがプロセスを見るおまじないです。

for (;!e.atEnd();e.moveNext()){
var Process = e.item();
if(Process.Name == "EXCEL.EXE"){
ExlCheckCounter++;
}
}
続くこの部分で、プロセスを1つ1つ見て、プロセスを全部見終わるまでこのforから抜けません。
もしEXCEL.EXEが見つかったらExlCheckCounterを1つ加算しなさいという無いようです。

if(ExlCheckCounter == 0)
エクセルが開いてないってことはこのExlCheckCounterが0だということなので、0の場合はtrueを、そうじゃないときはfalseを返します。

なので、ファイルがあってエクセルは今何も開いてないよ。となると
2つのフラグがtrueで返るようになっています。がExlOpenCheckがtrueになるにはfileExistがtrueになってないといけないので、実際このあとの判定はExlOpenCheckだけで行っています。

----------------------フラグを受け取ったあと-----------
if (ExlOpenCheck == true) {
var objExcel = new ActiveXObject("Excel.Application");
objExcel.Visible = true;
objExcel.Workbooks.Open(LimechatPath);
objExcel.DisplayAlerts = false;
objExcel = null;
var e= new Enumerator(GetObject("winmgmts:").InstancesOf("Win32_Process"));
for (;!e.atEnd();e.moveNext()){
var Process = e.item();
if(Process.Name == "EXCEL.EXE"){
var objFileSys = new ActiveXObject("Scripting.FileSystemObject");
var PC=テキストファイルの名前
var objOutFile = objFileSys.OpenTextFile(PC, 2);
objOutFile.WriteLine("ProcessID="+Process.ProcessID);
objOutFile.Close();
objFileSys = null;
objOutFile = null;
}
}
---------------------------------------
最初のほうはエクセルを開く作業なので特に解説はいらないかと。
で、プロセスIDをゲットするには、エクセルを開いたあとに再びプロセスを見に行きます。↓またこれです。
Enumerator(GetObject("winmgmts:").InstancesOf("Win32_Process"));
さっきは解説してなかったですがvar Process = e.item();はプロセスをみたときに色々情報を収集する命令です。itemを収集しないとプロセス名もプロセスIDもみれません。これを行うことによってProcessにはプロセス名とかプロセスIDとかいろんな情報が格納されます。で、実際に参照するにはProcess.NameのようにドットとNameなどを付けて、集めた情報から名前だけを見せてください。と命令します。

コレを使って、まずはEXCEL.EXEを見つけます。そして見つかったら、
var objFileSys = new ActiveXObject("Scripting.FileSystemObject");
var PC="テキストファイルのパス"
var objOutFile = objFileSys.OpenTextFile(PC, 2);
でプロセスIDを格納するテキストファイルを指定します。
えーっと本来であればメモリ空間を確保してそこにプロセスIDを覚えさせればいいんでしょうが、テキストファイルにプロセスIDを書き込んじゃいます。こうしている理由は色々ありますが、一番の理由がそのやり方がわからない。です!

objOutFile.WriteLine("ProcessID="+Process.ProcessID);
いまちょうどテキストファイルにアクセスしている状態なので、ライトラインでプロセスIDを書き込んじゃいます。先のとおりProcess.ProcessIDは集めた情報からプロセスIDだけ見せてくれと言う命令です。

さて、コレで初回起動が終わって、多重起動を制御する準備は出来ました。

あとはこのファイルにアクセスする際には、同じようにプロセスIDをテキストファイルから持ってきてマッチングを取れば、確かにそのエクセルファイルが立ち上がっていると(ファイル名が取得できなくても)確信がもてるようになります。

また、上のソースをRUNさせるトリガですが、Limechatなので、コマンドによってRUNするようにします。そうすれば、二回目にコマンドで起動しても、他のエクセルが立ち上がっていると認識されて多重起動が制御できます。手動で立ち上げてもウィンドウがアクティブになる程度です。

*上記ソースはそのままでは使えません。
・エクセルファイルへの絶対パスを記述する必要があります。
・テキストファイルを指定する必要があります
・RUNのためのトリガがひつようです
・2つ目のソースはフラグがfalseで返ってきたときの処理の記述が抜けています。てきとうにエラーメッセージを吐く記述が必要です。

一例ですがプロセスIDの参照方法(functionにしちゃってます)
--------------------------
function ExcelCheck2() {

ExlExistCheck = false; //初期化。親元でグローバルで宣言してるので引数としてもらう必要はなし
ExlOpenCheck = false; //おなじく初期化。
PIDExistCheck = false; //されど初期化
//事前に取得したPIDを格納するよ。
var file = OpenFile(PC); //PCにはPID.dllへのパスが格納されている。
if (file){
PIDExistCheck = true; //PID.dllがあったらtrue
var s;
while(s=file.readLine()){
if(s.match(/ProcessID=/)){
var PID = s.replace(/ProcessID=/,"");
}
}
file.close();



var fso = new ActiveXObject('Scripting.FileSystemObject');
if(!fso.FileExists(LimechatPath)){
ExlExistCheck = false; //エクセルがないときはExistをfalse
}else{
ExlExistCheck = true; //エクセルがあったらExistをtrue
var e= new Enumerator(GetObject("winmgmts:").InstancesOf("Win32_Process"));
for (;!e.atEnd();e.moveNext()){
var Process = e.item();
if(Process.Name == "EXCEL.EXE"&&Process.ProcessID == PID){ //AND条件
ExlOpenCheck = true; //エクセルのPIDが一致したらOpenをtrue
}
}
e = null;
}
fso = null;
}else{
PIDExistCheck = false; //PID.dllがなかったらfalse
}
}
PR
COMMENT
name
title
text
color   Vodafone絵文字 i-mode絵文字 Ezweb絵文字
mail
URL
pass
secret
TRACKBACK
TrackbackURL:
PREV ←  HOME  → NEXT
プロフィール
HN:
komyu/シュクレール/修造
性別:
非公開
自己紹介:
こうぶつはけものみみとのーびす(♀)とエリーン
主にROとTERAとラノベと雑多なkomyuの日記帳です。
新生FF14
TERA紋章しみゅ
ROサポートツール
タイムライン
RSSボットが記事更新をつぶやくのがほとんどっス…
ROキャラクター紹介


TERAキャラ紹介

シュクレール(バサ)



syuzo(エレ)



サケマス(アチャ)


その他サブ

ウリエルキゥィス(スレLv54)

Vermillion(サラLv56)

パズドラ

157,318,362
フレンド募集中
枠なきゃ増やす
最終プレイ3日以上になったら消す
カレンダー
03 2024/04 05
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
ツリーカテゴリ
ブログ内検索
最新コメント
[04/30 のな]
[03/22 NEIN]
[03/22 NEIN]
[10/31 イロイ]
[05/02 NONAME]
Copyright (C) 2024 のーびす監察日記 All Rights Reserved.
Photo by 戦場に猫 Template Design by kaie
忍者ブログ [PR]