• ベストアンサー

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

SHIMAPEEの回答

  • 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 + "件のメールを処理しました。");

関連する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}" '---------------------------------------- どなたか、階層下まで同じ処理をする方法か、それともそのような処理ができるフリーソフトをご存知ないでしょうか?