• ベストアンサー

WSHで自動化ソフトを作りたいけど、エクセルとの連携、エラー防止はどうすれば?

以下の業務を自動をするために、WSHでプログラムを作っていますが、4点困っていることがあります。 ●●●業務内容●●● 1、業務のメールボックスをactivateする。 2、sendkeys("{Enter}")を使って、メールを開く。 3、AlTからEditツールのEDIT、を選択し、メールを編集状態にする。 4、CTRL+Fで、文字列検索。(「発表日」を検索します。) 5、「発表日」の下に発表される日時が8桁で表示されているので、sendkeysを使い、コピー。 6、業務に使うエクセルファイルをactivateする。 ■■ここでVBAを使いたいのですが、WSH内のプラグラム内で、VBAを入力することは可能でしょうか?■■ 7、エクセルファイルを開いたら、発表日がある列の空白セルのひとつにペースト。(上のセルから順にペーストしていくので、 i=1 activate.cells(F,i) i=i=1 do while i=10のようにコマンドするつもりです。) 8、業務のメールボックスを再びActivateする。 ■■(業務のメールボックスは新しいメールをタブでふぴじする仕組みになっているので、どうのようにActivateすればいいか困っています。)■■ 9、開いてあるメールを閉じる。(Sendkeysで閉じる予定です)(これから処理する全てのメールを開いたまま、プログラムを実行すれば、確実にエラーが起きるような数のメールなので。) 10、メールボックスに戻るので、{down}と{enter}で次のメールを開く。 繰り返し。 ●●●困っていること●●● 1、sendkeysをなるべく使わずに実行したい。 sendkeysでは、たとえば他のプラグラム(セキュリティーソフトなど)が実行された場合でも、そのまま実行され続けるので、リスクが大きい。 2、仮に1で書いたような事態が起きた場合、プログラムを自動的に停止するようにしたいが、どのやってコンピューターにエラーが起きていると判断させるかわからない(違うメールやプログラムを開いている場合に呈する等)。 3、エクセルと連携させて、Sendkeysを減らしたい。 4、繰り返し処理はこの場合、どうやって命令するのか。 ●●●今のコード●●● var WShell = WScript.CreateObject("WScript.Shell"); WShell.AppActivate("業務に使うメールソフト(別のウィンドウに開いてある必要があります)"); WShell.Sendkeys("{ENter}"); WScript.sleep(100); WShell.sendkeys("%"); WScript.sleep(100); WShell.sendkeys("a"); WScript.sleep(100); WShell.sendkeys("d"); WScript.sleep(100); WShell.sendkeys("^F"); WScript.sleep(100); WShell.sendkeys("検索したい文字列"); WScript.sleep(100); WShell.sendkeys("{ESC}"); WShell.sendkeys("{DOWN}"); WScript.sleep(100); WShell.sendkeys("+{RIGHT}{RIGHT}{RIGHT}{RIGHT}{RIGHT}{RIGHT}{RIGHT}{RIGHT}"); WScript.sleep(100); WShell.sendkeys("^c") WScript.sleep(100); WShell.AppActivate("EXCEL"); WScript.sleep(10000); WShell.sendkeys("セルまで移動") WShell.sendkeys("^V"); WShell.AppActivate("業務に使うメールソフト"); WShell.sendkeys("%"); WShell.sendkeys("w"); WShell.sendkeys("window がある番号"); WShell.sendkeys("%"); WShell.sendkeys("^W"); WShell.sendkeys("{DOWN}"); WScript.Echo "作業が完了しました。"

質問者が選んだベストアンサー

  • ベストアンサー
  • SHIMAPEE
  • ベストアンサー率75% (154/203)
回答No.3

回答番号 No.2のお礼へのアドバイスです。 テキストファイル化についてです。Notesの機能に複数のメールの一括exportのようなものはないでしょうか。他のソフトへの移行、あるいは保存などのための機能です。 質問についてです。 1.データ型にも影響しますが、変数を宣言しているのは読みやすさ、変更のしやすさのためです。 2.oExcelはExcelを操作するためのオブジェクトです。 3.私が動作確認しているのは日本語版Windows, Excelですが英語版でも大丈夫だと思います。  SendKeysについてはおわかりのとおり日本語版でも英語版でも他からの割り込みに弱いですから、なるべく避けるべきだと思います。 4.++は変数に1を加える演算子です。i++ は i=i+1 です。 サイトはWSHで検索すればたくさん出てきますが、例えば、 http://www.atmarkit.co.jp/fwin2k/tutor/cformwsh01/cformwsh01_01.html http://www.roy.hi-ho.ne.jp/mutaguchi/wsh/wshtop.htm 特におすすめします。 http://www.happy2-island.com/vbs/ なお、ドキュメントは一通り読み、すぐ参照できるようにしておきましょう。 http://www.microsoft.com/japan/msdn/scripting/ マイクロソフトのスクリプトセンターはサンプルが豊富です。ただしサンプルはVBScriptが多いです。 http://technet.microsoft.com/ja-jp/scriptcenter/default.aspx

choco0213
質問者

お礼

ありがとうございます。 特にお勧めのだけ、自分は知らなかったです。 他は初心者には少々敷居が高いようですから。 Lotusのメールを一括でexportすることはできないようです。 一通一通exportすることはできます。 Export可能なデータの型は、 ASCII text CBM Image Microsoft RTF TIFF Image です。 一括でやろうとすると Calender File(.jcs) Comma seperated Value Lotus 1-2-3 structured text Tabular text で保存できるようですが、文字化けします。 また、化けた文字の数から、おそらくタイトルと送信者などの情報しかexportされていないようです。 1、2、エクセルを操作するためのコマンドということは、たとえばそのコマンドからLotusや、メモ帳などを操作できないので、他のプラグラムが割り込んでも、操作ができないので、エラーとして処理が中止されるという理解でよろしいでしょうか? 重ね重ねありがとうございます。

その他の回答 (9)

  • SHIMAPEE
  • ベストアンサー率75% (154/203)
回答No.10

回答番号 No.9のお礼へのアドバイスです。 >>サンプルで言えばSaveFileNameをNotesのどこかのフィールドにSendkeysで書き込むことで実現されると思います。 >具体的にどういうことでしょうか? >そこが一番思いつかなくて困っています。。。 メモ帳で試してみましょう。 たぶん英語版でも動くと思うのですが、下のスクリプトをNotepadTest.jsなどの名前で保存して実行してみて下さい。やっていることはコメントのとおりです。 注目して欲しいのは★印の箇所です。メモ帳の名前を付けて保存のダイアログではファイル名を指定するフィールドには「ファイル名(N)」のラベルが付いており、Alt+Nでフィールドを選択できます。同様にNotesのexportのダイアログでもファイル名を指定するフィールドがあって、それを選択してSaveFileNameを入力できるのではないかと思います。試してみて下さい。 なお、WScript.Sleepの秒数はこんなにいらないと思います。入力を確認できるようにするため長めにしています。 ----- Fs = WScript.CreateObject("Scripting.FileSystemObject"); Wsh = WScript.CreateObject("WScript.Shell"); SaveFileName = "c:\\test\\notepad.txt"; // testフォルダは作成しておいて下さい。 if (Fs.FileExists(SaveFileName))// SaveFileNameの名前のファイルがあったら Fs.Deletefile(SaveFileName); // あらかじめ消しておく。 Wsh.Run("notepad.exe", 1); // メモ帳を起動する。 WScript.Sleep(3000); // メモ帳を3秒表示する。 Wsh.SendKeys("abcdefghijklmn"); // メモ帳に適当な文字を入力する。 WScript.Sleep(3000); // メモ帳を3秒表示する。 Wsh.SendKeys("%"); // Alt Wsh.SendKeys("F"); // F Wsh.SendKeys("A"); // A(名前を付けて保存) WScript.Sleep(3000); // ダイアログを3秒表示する。 Wsh.SendKeys("%N"); // ★Alt+Nでファイル名フィールドを選択する。 Wsh.SendKeys(SaveFileName); // ★ファイル名フィールドにSaveFileNameを入力する。 WScript.Sleep(3000); // ダイアログを3秒表示する。 Wsh.SendKeys("~"); // Enter(保存) WScript.Sleep(1000); // 1秒待つ。 Wsh.SendKeys("%{F4}"); // メモ帳を終了する。 WScript.Sleep(3000); // 3秒待つ。 Wsh.Run("notepad.exe "+SaveFileName, 1); // 再びメモ帳をファイル名付で起動する。 -----

  • SHIMAPEE
  • ベストアンサー率75% (154/203)
回答No.9

回答番号 No.8のお礼へのアドバイスです。 自分のPCを自分の裁量で使うなら、結果の確認は十分に行う必要がありますけれども、サンプルのまる写しでも動けばいいのではないでしょうか。別の場面で応用するには書き換えが必要になるでしょうから、その時調べればいいのでは。必要に迫られて勉強するのが一番です。 なお、Sendkeysを使った自動化は、通常のプログラミングとは違って対象のアプリケーションのクセもあり、試してみるしかありません。CTRL+Wが効かないから別のキーで実現する、というのはchoco0213さんが発見された一つのノウハウです。ノウハウを積み重ねて何度も試しながら完成を目指すしかないでしょう。 当初の質問の回答のネタは出尽くしたと思いますので、このQ&Aもそろそろ閉じた方がいいですが、最後に一つだけ、exportの処理の中でファイル名の入力が WShell.sendkeys("i"); ではループしてもファイル名が変わらないことになりませんか。サンプルで言えばSaveFileNameをNotesのどこかのフィールドにSendkeysで書き込むことで実現されると思います。

choco0213
質問者

お礼

ありがとうございます。 念のため、きちんとプログラムが動くことを確認してから、質問を締め切らせてください。 >サンプルで言えばSaveFileNameをNotesのどこかのフィールドにSendkeysで書き込むことで実現されると思います。 具体的にどういうことでしょうか? そこが一番思いつかなくて困っています。。。

  • SHIMAPEE
  • ベストアンサー率75% (154/203)
回答No.8

●回答番号 No.7の補足へのアドバイスです。スクリプト例です SaveFile0001.txt、SaveFile0002.txt、SaveFile0003.txt…というファイル名でデータが保存されているものとします。 『// 目的の文字列を抽出してExcelに書き込みます---』の下のコメントのルールで目的の8文字を抽出してExcelに書き込みます。何を検索するか、1行読み飛ばしが必要か等はご判断下さい。 ----- // テキストファイル内を検索してExcelに書き込む var Fs = WScript.CreateObject("Scripting.FileSystemObject"); var ForReading = 1; var ExportDir = "C:\\test\\"; var SaveBase = "SaveFile"; var FileName = "c:\\test\\test.xls"; //★Excelファイル名 var MaxRow = 1000; //★ さしあたり1000行の範囲で処理する。 oExcel = WScript.CreateObject("Excel.Application"); oExcel.Visible = true; oBooks = oExcel.WorkBooks.Open(FileName); for (Row = 1; Row < MaxRow; Row++) { if (oExcel.Cells(Row, 1).Value == null) // A列の空きセルを探す。 break; } Count = 0; for (FileIndex = 1; ; FileIndex++) { Num = "0000" + FileIndex; SaveFileName = ExportDir + SaveBase + Num.substr(Num.length-5, 5) + ".txt"; if (!Fs.FileEXists(SaveFileName)) break; Count++; TextFile = Fs.OpenTextFile(SaveFileName, ForReading); try{ // 目的の文字列を抽出してExcelに書き込みます--------------------- while(!TextFile.AtEndOfStream){ Line = TextFile.ReadLine(); if (Line.match(/DATES:Material ID/)) // タイトル行まで読み飛ばす break; } Line = TextFile.ReadLine(); // 1行読み飛ばす(不要なら削除) Line = TextFile.ReadLine(); // 目的の行を読む if (Line.match(/.*\t.*\t(........)/)){ // 二つ目のタブ直後の8文字を抽出 // 私の環境だと09/04/10は2010/9/4になるので書式を文字列に設定する。 // 必要なら文字を入れ替えて日付として扱うことも可能。 oExcel.Cells(Row + FileIndex-1, 1).NumberFormatLocal = "@"; oExcel.Cells(Row + FileIndex-1, 1).Value = RegExp.$1; } //--------------------------------------------------------------- } finally{ TextFile.Close(); } } WScript.Echo(Count + "件のテキストファイルを処理しました。"); ----- 「ついで」に対しては例えば次のように書き換えます。 ----- // 目的の文字列を抽出してExcelに書き込みます--------------------- while(!TextFile.AtEndOfStream){ Line = TextFile.ReadLine(); if (Line.match(/RFA SPB/)) // タイトル行まで読み飛ばす break; } Line = TextFile.ReadLine(); // 1行読み飛ばす(不要なら削除) Line = TextFile.ReadLine(); // 目的の行を読む if (Line.match(/.*\t.*\t(......)/)){ // 二つ目のタブ直後の6文字を抽出 oExcel.Cells(Row + FileIndex-1, 1).Value = RegExp.$1; } //--------------------------------------------------------------- ----- ●回答番号 No.7のお礼へのアドバイスです。 メール処理のスクリプトはこちらでは試せませんので何とも言えませんが、 ・一覧画面で処理する先頭のメールを選択した状態で開始するのでしたら、いきなり"{DOWN}"はおかしいです。一つのメールを処理した後に"{DOWN}"では。 ・exportの形式はDefaultのままでは不都合がありますか。 ・メールを閉じるのはCTRL+W ("^W") を使うのが簡単では。 ・ファイル名の入力はどこに? ・コメント記号や括弧が抜けています。 メール1件の処理が完成しましたら回答番号5のスクリプトに組み込んでみては。繰り返し処理については一つの解を示しています。

choco0213
質問者

お礼

ご回答とご指摘ありがとうございます。 返事が遅れてすみません。 >・一覧画面で処理する先頭のメールを選択した状態で開始するのでしたら、いきなり"{DOWN}"はおかしいです。一つのメールを処理した後に"{DOWN}"では。 Appメソッドだけでは、なぜか完全にアクティブにはならず、Enterを押しても認識されないのです。そこで、色々なキーを試したら、矢印キーを打てば、アクティブになることがわかったのです。 export作業の自動化をするためのプログラムは補足に記載します。 これは勉強不足を痛感する作業でした。 VBAの勉強は、まずマクロを記録して記録したマクロを読むことでやっていたので、大雑把な知識しかありません。 これから何かを自動化したいというとき、また人に頼るというわけにもいきませんし、教えてもらったのに理解できていないというのは不誠実に感じます。 そのため、いちからプログラミングを勉強しなおそうと思っています。プログラミングは、1を覚えれば1ができるわけではなく、10を覚えてようやく1ができるようになるものだと実感しました。しかし、勉強方法はまだ掴めていないので、よろしければアドバイスを頂けないでしょうか? >・exportの形式はDefaultのままでは不都合がありますか。 Defualtでも問題ありません。 >・メールを閉じるのはCTRL+W ("^W") を使うのが簡単では。 原因はわかりませんが、これもだめでした。 >・ファイル名の入力はどこに? WShell.sendkeys("i"); です。 >・コメント記号や括弧が抜けています。 ありがとうございます。修正しました。

choco0213
質問者

補足

var Wsh = WScript.CreateObject("WScript.Shell"); var MB_YESNO=4, MB_ICONQUESTION=32, MB_TOPMOST=0x40000, IDYES=6; var ExportDir = "C:\\test\\"; var SaveBase = "SaveFile"; var Default = 10; oExcel = WScript.CreateObject("Excel.Application"); try{ while(true){ Count = oExcel.InputBox("処理するメールの件数を指定して下さい。[1-100]", "件数の入力", Default); if (!Count) WScript.Quit(); if ((1<=Count)&&(Count<=100)) break; } } catch(e){} finally{ oExcel.Quit(); } if((Wsh.Popup(Count + "件のメールを \"" + ExportDir + "\" にExportします。\r\r"+ "実行しますか?", 0,"実行の確認",MB_YESNO+MB_ICONQUESTION+MB_TOPMOST))!=IDYES) WScript.Quit(); // 実行 for (i = 1; i <= Count; i++){ Num = "0000" + i; // ついでにファイル名の生成の方法 SaveFileName = ExportDir + SaveBase + Num.substr(Num.length-5, 5) + ".txt"; WScript.Echo(SaveFileName); // ここにexportの処理を書く // {DOWN} WShell.AppActivate("業務に使うメールソフト"); WScript.sleep(10000); WShell.Sendkeys("{DOWN}");//業務のメールソフトを完全にアクティブにする WShell.Sendkeys("{ENter}");//メールを開く WScript.sleep(100); WShell.sendkeys("%");//alt WScript.sleep(100); WShell.sendkeys("f");//fileを選択 WScript.sleep(100); WShell.sendkeys("e");//exportを選択 WScript.sleep(100); WShell.Sendkeys("{ENter}"); WScript.sleep(3000); WShell.sendkeys("i");//ファイル名を入力 WScript.sleep(100); WShell.sendkeys("{Enter}");//ファイル名を決定 WScript.sleep(20000);//20秒まつ WShell.sendkeys("%");//Alt WScript.sleep(100); WShell.sendkeys("f");//file WScript.sleep(1000); WShell.sendkeys("{DOWN}{DOWN}{DOWN}");//closeを選択 WShell.Sendkeys("{ENter}"); WShell.Sendkeys("{Down}")//次のメールを選択 } WScript.Echo(Count + "件のメールを処理しました。");

  • SHIMAPEE
  • ベストアンサー率75% (154/203)
回答No.7

回答番号 No.6のお礼へのアドバイスです。 テキスト化はSendKeysで行うしか手が無さそうですね。回答番号5のスクリプトを参考に、テキスト化の自動化までを作って試してはどうでしょうか。 「// ここにexportの処理を書く」を展開して、SendKeysでメールを開く、ASCII textでexportする、メールを閉じる、ようにすればよいですね。「// {DOWN}」はおわかりかと思いますがSendKeysで一覧画面の下のメールを選択する処理です。 テキスト化ができましたら、実際にテキスト化された注目の箇所の行(2行になりますか)の一例を補足に書き込んで頂けませんか。例えば下のような感じで。 --------------- 発表日 09092818 --------------- 差し支えない範囲でできるだけ生のデータがよいです。見せて頂ければ、WSHを使って検索し、Excelに書き込む具体的なスクリプトをアドバイスできると思います。

choco0213
質問者

お礼

ありがとうございます。 var WShell = WScript.CreateObject("WScript.Shell"); WShell.AppActivate("業務に使うメールソフト(別のウィンドウに開いてある必要があります)"); WScript.sleep(10000); WShell.Sendkeys("{DOWN}") WShell.Sendkeys("{ENter}"); WScript.sleep(100); WShell.sendkeys("%"); WScript.sleep(100); WShell.sendkeys("f"); WScript.sleep(100); WShell.sendkeys("e");exportを選択 WScript.sleep(100); WShell.Sendkeys("{ENter}"); WScript.sleep(3000); WShell.sendkeys("letter"&"i");//unicode8を選択 WScript.sleep(100); WShell.sendkeys("{Enter}"); WScript.sleep(20000); WShell.sendkeys("%"); WScript.sleep(100); WShell.sendkeys("f"); WScript.sleep(1000); WShell.sendkeys("{DOWN}{DOWN}{DOWN}");closeを選択 WShell.Sendkeys("{ENter}"); WScript.Echo "作業が完了しました。" Do while i=10のようなコマンドで、繰り返し処理したいのですが、何かいいアイディアはございませんか? ("letter"&"i")はなぜか0と入力されました。

choco0213
質問者

補足

DATES:Material ID Ann. Dt. FCS Date (GA. Date) Early Order Dt Lim. Avail. Dt. WDFM Date ALL 09/03/31 09/04/10 です。 09/04/10が、Ann.dtで、抽出したいデータです。 ついでといっては何ですが、 RFA SPB (Special Bid) Industry Def. Cat.(+Subgroup) = BA Code Document Number: Function Class Code: Japan Marketing Brand Ind.: Division (Segment Acronym): RFA 10A 47284A から、47284Aを抽出することも可能でしょうか?

  • SHIMAPEE
  • ベストアンサー率75% (154/203)
回答No.6

回答番号 No.5のお礼へのアドバイスです。 メールを開かないとテキスト化できないのであれば開かざるを得ませんね。そうだとしても、ご質問のようにメール画面で注目の箇所を検索するのではなく、exportしたテキストファイル群をWSHで処理するのがよいでしょう、とアドバイス申し上げます。 想像ですが、メール一覧画面からメールを開いてexportし、閉じることはできると思います。問題は、メールを閉じたときにメール一覧画面の選択状態に戻れるかでしょう。これも想像ですが、他のプログラムが動いていない静かな環境なら自然に戻るのではないかと思います。試してみてはどうでしょうか。

choco0213
質問者

お礼

>想像ですが、メール一覧画面からメールを開いてexportし、閉じることはできると思います。問題は、メールを閉じたときにメール一覧画面の選択状態に戻れるかでしょう。これも想像ですが、他のプログラムが動いていない静かな環境なら自然に戻るのではないかと思います。試してみてはどうでしょうか。 実験してみましたが、メール一覧画面に戻りました。 メールを閉じるのは、tool barのfileから、3つめのあるClose、あるいはCTRL+Wで実行できます。 これはsendkeyで自動化するほかに方法はありそうでしょうか?

choco0213
質問者

補足

それに関しては問題ありません。 windowsのプログラム同様、Activateされているタブを閉じた場合、その前にActivateされていたタブが自動でActivateされるようになっています。 ありがとうございます。

  • SHIMAPEE
  • ベストアンサー率75% (154/203)
回答No.5

回答番号 No.4のお礼へのアドバイスです。 exportの処理についてです。 私の想像では、対象のメールが一覧になっていて、それを上から順番に処理するというものです。処理する先頭のメールを選択しておいて開始します。一つのメールをexportしたら{DOWN}で次のメールを選択してループ。 ここで問題になるのは、どうやってループを止めるのかということではないでしょうか。一つの解は、処理するメールの数を入力することです。入力にはVBScriptだと組み込みのInputBox関数が使えるのですが、JScriptにはありません。そこでExcelのInputBoxを使うことにします。 ------ var Wsh = WScript.CreateObject("WScript.Shell"); var MB_YESNO=4, MB_ICONQUESTION=32, MB_TOPMOST=0x40000, IDYES=6; var ExportDir = "C:\\test\\"; var SaveBase = "SaveFile"; var Default = 10; oExcel = WScript.CreateObject("Excel.Application"); try{ while(true){ Count = oExcel.InputBox("処理するメールの件数を指定して下さい。[1-100]", "件数の入力", Default); if (!Count) WScript.Quit(); if ((1<=Count)&&(Count<=100)) break; } } catch(e){} finally{ oExcel.Quit(); } if((Wsh.Popup(Count + "件のメールを \"" + ExportDir + "\" にExportします。\r\r"+ "実行しますか?", 0,"実行の確認",MB_YESNO+MB_ICONQUESTION+MB_TOPMOST))!=IDYES) WScript.Quit(); // 実行 for (i = 1; i <= Count; i++){ Num = "0000" + i; // ついでにファイル名の生成の方法 SaveFileName = ExportDir + SaveBase + Num.substr(Num.length-5, 5) + ".txt"; WScript.Echo(SaveFileName); // ここにexportの処理を書く // {DOWN} } WScript.Echo(Count + "件のメールを処理しました。"); ----- なお、exportの形式は次のステップで検索するためには、rtfではなくtxtにすべきです。注目の箇所は保存できているのですよね。メモ帳やWordで開いてSendKeysで検索するのではなく、WSHでファイルを読み込んで検索します。 ASCIIを選択した後の小さなウィンドウはDefaultのままでよいと思います。 sendkeyの脆弱性についてです。その時点で処理すべきアプリケーションのタイトルがわかっているなら、適宜AppActivateを実行するのは良いアイデアです。ifを使う必要はなく無条件でAppActivateを実行してよいです。そもそもWSH単体ではActiveなWindowのタイトルを得る機能がありません。

choco0213
質問者

お礼

いつもありがとうございます。 ひとつ言い忘れていたことがありました。 メールを閉じた状態で、メールボックス受信メール一覧の画面で、exportすると、 Calender File(.jcs) Comma seperated Value Lotus 1-2-3 structured text Tabular text と、なります。 メールを開くと、 RTFやASCIIを選択できるようになります。この場合はどうなるのでしょうか? 恐らく、非常に申し訳ないのですが、現在アイディアとして出ているものが使えなくってしまうのではないかと心配なのですが・・。

  • SHIMAPEE
  • ベストアンサー率75% (154/203)
回答No.4

回答番号 No.3のお礼へのアドバイスです。 一括でexportできないのは残念ですね…。 Comma seperated Value structured text Tabular text でも文字化けですか。注目の箇所(「発表日」と発表される日時)だけでも見えれば何とかなりそうに思うのですが…。 一括がどうしてもできないのでしたら、2ステップで考えたらどうでしょう。 (1)一通一通exportでASCII text化することを自動化する。 (2)そのtextファイル群を入力としてExcelに書き出すことを自動化する。 一通一通メールを開いて検索するよりは、一通一通exportでASCII text化する方がSendKeysが少なくて済むのではないかと想像しています。ASCII textなら注目の箇所は見えますよね。 ----- 『1、2、エクセルを操作するためのコマンドということは、たとえばそのコマンドからLotusや、メモ帳などを操作できないので、他のプラグラムが割り込んでも、操作ができないので、エラーとして処理が中止されるという理解でよろしいでしょうか?』 書かれた文には誤解があると思います。 回答No.2に書いたスクリプトは、WSHからExcelの機能を使った、いわば独立したプログラムになります。このプログラムの実行中は、他のプログラムが動作しようが、キーやマウスを操作しようが、エラーとして処理が中止されることはありません。Excelの保存まで自動化すれば、Excelの画面を全く表示せずバックグラウンドで動かすこともできます。 『Lotusや、メモ帳などを操作できない』のではなく『Lotusや、メモ帳などがActiveになっても影響を受けずに実行できる』のです。 一方SendKeysは、実行されたときにActiveなプログラムに文字を送りつける機能でしかありません。ですからスクリプトの実行中に意図しないプログラムが動作してActiveになると、誤って文字を送ってしまいます(誤動作)。また、本来意図したプログラムの操作が行われないことになります(これも誤動作)。

choco0213
質問者

お礼

一括exportを使って処理を行うのは、恐らく不可能だと思います。 Lotusに詳しい同僚に聞いてもそれは不可能だといっていました。 その人は同じ同じようなことをしようとして挫折したそうです。。 ステップとして考えられるものは、 前提:Lotusと、業務のメールソフトは開いておき、業務のメールソフトをActivateさせておく。 1、sendkeyでAlt 2、sendkeyでF ツールバーのfile 3、sendkeyでe fileのexportを選択 4、sendkeyでenter exportを決定 5、sendkeyでファイル名を入力 6、sendkeyでtab 拡張子選択のボックスを選択(同時に半角入力なので変換が必要ないため、ファイル名が決定される) 7、sendkeyでM Microsoft RTFを選択 8、sendkeyでenter Microsoft RTFを決定。 この場合は、ASCIIを選ぶよりも手順がひとつ少ないので、こちらを選択しようと思っています。またMS RTFはテーブルも表示されます。今のところ、ちなみにMS WordはViewrしか使えない人もいるのですが、Viewerでも問題ないでしょうか? ASCIIでは、ファイル名を入力し、ASCIIを選択した後、新しい小さなウィンドウがチェックボックスが下記のようになっています。 ●Default ○international UTF-8 ○Unicode InternationalとUnicodeでは、文字化けをせずにメモ帳でもMSwordでも開けます。しかし、Lotus SymphonyのWordでは開けません。またテーブルは削除されています。ちなみに、DefaultはD、InternationalはI、UnicodeはUが、ショートカットとして、設定されています。 困難な点 1、ファイル名入力 (複数のファイルを連続でexportする場合、loopなどをつかって、毎回違うファイル名を入力する方法はありますか?) 2、sendkeyの脆弱性 (sendkeyとsendkeyの間に、もし違うプログラムが割り込んだら、また処理されるべきプログラムをactivateするようなことはできないでしょうか?たとえば、activateされているwindowの名前を毎回読み込んで、Ifを使って、それが処理されるべきファイルと違ったら、elseを使って・・・など。) 詳しい説明ありがとうございます。

  • SHIMAPEE
  • ベストアンサー率75% (154/203)
回答No.2

完成までお付き合いできるかどうかわかりませんが、 まず、既存のExcelファイルに書き込むことは下のようなWSH JScriptで可能です。Excelファイルは閉じておきます。 次の環境で確認しました。Win98以降ならどれでも動くと思います。 Windows XP Pro SP3 + JScript 5.8.22886 + Excel 2002 SP3 Vista Ultimate SP2 + JScript 5.8.18795 + Excel 2007 SP2 ----- var FileName = "c:\\test\\test.xls"; //★Excelファイル名 var MaxRow = 1000; //★ さしあたり1000行の範囲で処理する。 oExcel = WScript.CreateObject("Excel.Application"); oExcel.Visible = true; oBooks = oExcel.WorkBooks.Open(FileName); WScript.Echo("書き込みを始めます。"); for (i = 1; i < MaxRow; i++) { if (oExcel.Cells(i, 1).Value == null) // A列の空きセルを探す。 break; } for (j = 1 ; j <= 10; j++) { // 1から10までの数値を書き足す。 oExcel.Cells(i+j-1, 1).Value = j; } oExcel.Cells(i+j-1, 1).Value = "あいうえお"; // 文字列を書き足す。 ----- あと、メールの処理なのですけれども、メールをテキストファイルにできませんか。 メールソフトは何ですか。例えばOutlookやOutlook Expressでしたらテキストファイルにするソフトがありそうです。もっともOutlook Expressでしたらソフトを使わなくてもドラッグ&ドロップでemlファイルを作れます。 テキストファイルやemlファイルにできればJScriptで処理することは可能だと思います。

choco0213
質問者

お礼

1、メールソフト メールソフトは、Lotus8で起動するデータベースを使っています。英語のソフトを使っているのですが、"Second release of 7.0 IBM Mail Template"をModificationに使っているそうです。Versionは"Notes7V2"です。 2、メールのテキストファイル化 txtにするということでしょうか?メールには、テーブルが挿入されているので、それは難しいかと思われますが、Lotus Symphony Word(MSwordの代用品)にはペーストすることができます。 今は、エクセルの変わりにLotus symphony spreadsheetを使っているのですが、マクロの可読性が極性に低いために、Excelの使用許可を申請し、受諾され、現在はAdministrative Processの段階です。(日本語が拙くて申し訳ありません。) ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー ここから単純に質問です。もし面倒であれば無視してくださってもかまいませんが、もしお答えいただけるなら、後学ためにも非常に助かります。 1、 var FileName = "c:\\test\\test.xls"; //★Excelファイル名 var MaxRow = 1000; //★ さしあたり1000行の範囲で処理する。 で、データ型を宣言し、エクセル以外のファイルを操作することを禁止しているわけですね。 2、oExcelもそれと上記のものと同じでしょうか? 3、実は自分は海外で働いているので、windowsも、Lotusも、Excelも英語のものを使っています。その点は大丈夫でしょうか?WShell.sendkeys("検索したい文字列");をtxtファイルで実行したら、[になっていしまいました。Dimでできるものでしょうか?もしできるようなら自分でがんばってみようと思います。 4、for (i = 1; i < MaxRow; i++)の++とはなんでしょうか?もしよろしければ、SHIMAPEEさんが勉強に使っているwebサイトだけでも教えていただければ助かります。 5、

  • rivoisu
  • ベストアンサー率36% (97/264)
回答No.1

よくコードは見ていないのですが ExcelのWorkbook.Openイベントではいけないのでしょうか? ExcelにOpenしたときにVBAが動いてくれれば問題は解決しませんか?

choco0213
質問者

補足

ありがとうございます。 自分はエクセルのマクロを作りたいわけではなく、WSHでセルの指定し、プラグラムが一巡した後、次のセルに移るというJsファイルを作りたいので、Openイベントでは実現することは難しいと思います。 また、Excelを開いた時ではなく、すでに開いている業務のexcelファイルを操作するものなので、その点でもOpenイベントでは難しいかと思われます。

関連するQ&A

  • VBSのsendkeysで日本語を出力したいです

    WshShell.Run "explorer" WScript.Sleep 100 WshShell.AppActivate "explorer" WScript.Sleep 100 WshShell.SendKeys "C:\Users\Default\" WScript.Sleep 100 WshShell.SendKeys "デスクトップ" WScript.Sleep 100 WshShell.SendKeys "{ENTER}" WScript.Sleep 100 *.VBS ファイルに書き込んで、直接実行したいのですが、エラーになります。 どんなコマンドを足すといいのですか?

  • デフラグのスケジュールによる自動化

    デフラグをタスクから自動化する為にJSで下記の様に設定したのですが最適化のボタンをクリックしてくれないので困っています。誰か教えて下さい。 var WShell = WScript.CreateObject("WScript.Shell"); WShell.Run("%SystemRoot%\\system32\\dfrg.msc"); WShell.AppActivate("ディスク デフラグ ツール"); WScript.Sleep(2000); WShell.Sendkeys("{TAB}{TAB}{TAB} ");   上記のまま設定すると分析のボタンをクリック後 終了するだけです。

  • JP1からvbs(PSExec)が起動できない

    突然失礼します。 以下のサーバーAにあるvbsを、JP1から起動しようとしていますが、うまく起動しないので、もし原因が分かる方がいたら、ご教授願いたいです。 起動しようとしているサーバーAの「test.vbs」は、簡単に言うと、PsExecを利用して、サーバーBの「hoge.bat」を実行する内容です。 ***test.vbs*** Set WshShell = WScript.CreateObject("WScript.Shell") WshShell.Run "PsExec.exe サーバーBIPアドレス -u 実行ユーザ -p 実行ユーザーパスワード cmd" WshShell.AppActivate "cmd " WScript.Sleep 3000 WshShell.SendKeys "cd C:\" WshShell.SendKeys "{enter}" WshShell.SendKeys "hoge.bat" WshShell.SendKeys "{enter}" WScript.Sleep 10000 WshShell.AppActivate "cmd" WshShell.SendKeys "exit" WshShell.SendKeys "{enter}" ************************ 上記バッチを手動で実行するとうまくいくのですが、 JP1で起動しようとすると、うまくいきません。 そもそもPsExecが実行出来ていないかも。。。。 宜しくお願いします。

  • VBScript

    下記、プログラムを実行すると、コマンドプロンプトの画面が 消えずに、そのまま残ってしまいます。 どうしたら、画面を消すことができるでしょうか。 お力添えをお願いいたします。 Set WshShell = Wscript.CreateObject("WScript.Shell") Set WshEnv = WshShell.Environment("user") WshEnv("C:\NET\aaa.txt") = "administrator" Wshshell.Run("cmd.exe") WScript.Sleep(500) WshShell.SendKeys("runas /user:administrator " + chr(34) + "xcopy D:\NET\aaa.txt C:\NET\aaa.txt" + chr(34)) WshShell.SendKeys("{Enter}") WScript.Sleep(500) WshShell.AppActivate "C:\WINDOWS\system32\runas.exe" WshShell.SendKeys("XXXXX") WshShell.SendKeys("{Enter}") WScript.Sleep(500)

  • Windows 7 でのWSH の挙動

    お世話になります。 msdnにある「電卓をアクティブにするサンプルを Vistaで実行すると、電卓がアクティブになり、 計算結果を吐き出しますが、 Windows7(Pro,SP1)で実行すると 最前面に電卓が出るものの アクティブになっていない上に、 複数の電卓がどんどん立ち上がってきます。 Vistaと7で、プロセス(?)の管理が 変わっているのだと思います。 7でも電卓をアクティブにするには、 どうすればいいのでしょうか? 以下コードです。 ================================================ set WshShell = WScript.CreateObject("WScript.Shell") WshShell.Run "calc" WScript.Sleep 100 WshShell.AppActivate "Calculator" WScript.Sleep 100 WshShell.SendKeys "1{+}" WScript.Sleep 500 WshShell.SendKeys "2" WScript.Sleep 500 WshShell.SendKeys "~" WScript.Sleep 500 WshShell.SendKeys "*3" WScript.Sleep 500 WshShell.SendKeys "~" WScript.Sleep 2500 ================================================

  • マザーボードを換えたらVBSからの休止が出来なくなりました。

    こんにちは。 表題の件ですが、以前容易に”休止”に移行する為にVBSを使用しての 休止をアドバイスしていただいたのですが、今回表題に記したように マザーボードを換えたら以下のスクリプトで休止できなくなりました。 Set wShell=CreateObject("WScript.Shell") wShell.SendKeys "^+{esc}" Do While Not wShell.AppActivate("Windows タスク マネージャ") WScript.Sleep 100 Loop wShell.SendKeys "%uh%fx" '休止状態 なぜなのでしょう?アドバイスをお願いします。 ちなみに以前のマザーボード(ASUS P5-VMDO)で効果のあったScript.Sleep 100と記されてる行の数値を弄って見ましたが待機時間が変わるだけで”休止”になりませんでした。 現在のマザーボードはASUS P5Q Deluxeです。

  • WSHスクリプトでブラウザ更新

    教えてください。 WSHスクリプトでブラウザの更新をF5ではなくてControl + Rしたいのです。 Set WshShell = WScript.CreateObject("WScript.Shell") WScript.Sleep 2000 WshShell.AppActivate "テスト" WScript.Sleep 2000 WshShell.SendKeys "^R" WScript.Sleep 2000 WScript.Echo "終了" 最初の一回目の実行時はできるのですが、それ以降更新してくれません。 よろしくお願いいたします。

  • 実行中のSendkeysのVBSを途中で停止したい

    下記のような実行中のSendkeysのVBSを途中で 停止するにはどうすればよいのでしょうか? Set s = WScript.CreateObject("WScript.Shell") for i=1 to 100 s.SendKeys i WScript.Sleep 500 next ご存知の方がおられましたらご回答をよろしくお願いします。

  • WSHを使いTELNETで%USEPROFILE%\デスクトップにファイルを複写したい

    WSHをはじめたばかりです。TELNETで接続した現在の相手のデスクトップにファイルを複写させたいと考えています。 DOSのように指定したのですがカナ文字や%がうまく渡されていないようなのですがどのように設定すればよいか教えてください。 下記のように作成しています。 よろしくお願いします。 set WshShell = WScript.CreateObject("WScript.Shell") WshShell.AppActivate "確認" WScript.Sleep 1000 adr = InputBox("端末IPアドレスを入力してください。", 1) adr = "telnet " & adr & "~" rem telnet ホスト名 WshShell.SendKeys adr WScript.Sleep 2000 rem ユーザー名 WshShell.SendKeys "administrator~" WScript.Sleep 1000 rem パスワード WshShell.SendKeys "administrator~" WScript.Sleep 1000 rem コマンド WshShell.SendKeys "cd %USEPROFILE%\デスクトップ~" WScript.Sleep 3000 rem あとCOPYによる複写コマンドの記述

  • 特定のフォルダを階層下まで表示を変えたい

    ほかのカテゴリで質問したのですが回答がありませんでした。 すべてのフォルダではなく、ある特定のフォルダの表示だけを階層下まで「詳細」に変更したいのです。 すべてのフォルダですとWindowsの処理で可能ですし、階層下までをしなくてもいいのなら、WSHで下のように書いて、その中へフォルダをドラッグしたらできました。 '----------------------------------------------------- Set objShell = WScript.CreateObject("WScript.Shell") objShell.SendKeys "{ENTER}" WScript.Sleep 200 objShell.SendKeys "%V" WScript.Sleep 200 objShell.SendKeys "^D" WScript.Sleep 200 objShell.SendKeys "%{f4}" '---------------------------------------- どなたか、階層下まで同じ処理をする方法か、それともそのような処理ができるフリーソフトをご存知ないでしょうか?