- 12/02 Information!!
- 07/07 【グラブル】バハムートを最終上限解放
- 07/06 【グラブル】光有利の古戦場
- 06/14 【動物園】愛媛県立とべ動物園
- 05/31 【グラブル】開放したシスとエッセルの使用感
This is new entry
続きの記事です。
このブログ横幅狭いんで、コピペしてみたほうがいいと思います・・・。
あとタブが無効にされるみたいなんで、段がちょっと分かりにくいですが。
---------------------エクセルチェック---------------------
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
}
}
このブログ横幅狭いんで、コピペしてみたほうがいいと思います・・・。
あとタブが無効にされるみたいなんで、段がちょっと分かりにくいですが。
---------------------エクセルチェック---------------------
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
プロフィール
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)
ブログ内検索
最新コメント