ところが、Excelを起動したままにしていると、タスクスケジューラーから実行されたExcelが別スレッド(別のエクセルのフレーム)で起動されてしまい、「PERSONAL.XLS は編集のためロックされています。」というメッセージが現れExcelが止まってしまいます。
これを回避するにはどのようにしたらよいでしょう?
PERSONAL.XLSには必要なVBAが登録されているので、削除できません。
以下のいづれかの方法があれば、いいのかな?と思っているのですが、もちろん他の方法でも構いません。
(1) タスクスケジューラーからExcelを起動するときに、もしExcelが既に起動済みであれば、そのスレッド内で実行するようにする。
(2) タスクスケジューラーからExcelを起動するときだけ、PERSONAL.XLSを無効にする。
(3) タスクスケジューラーからExcelを起動するときだけ、PERSONAL.XLSを読み取り専用で開く。
よい解決方法があればご教授ください。
よろしくお願いします。
起動オプションで読み取り専用にしても、PERSONAL.xlsは読み取り専用で開けないような気がするのですが。
それでいろいろ試した結果、次の方法で(1)を実現できます。
テキストファイルに次のようなコードを書いて、ファイル名をtask.vbsのように変更します。
つまりvbsファイルからエクセルを起動しようというわけです。
Set objWShell = CreateObject("WScript.Shell") objWShell.Run "rundll32.exe url.dll,FileProtocolHandler C:\Documents and Settings\hogehoge\デスクトップ\task.xls", 1, False Set objWShell = Nothing
※起動するブックのパスに変更してください。
このvbsファイルをタスクスケジューラから実行すると、Excelは同じスレッドで起動されるので回避できます。
ただ単に、エクセル・VBAの問題だけではなく、他のソフトがたまたま邪魔をする場合があります、シンクロ時にほとくにそうなりがちです、代表例がソースネクストの驚速パソコンとかがあります、一度マイクロソフトに詳しい事情を話し、解決策があると思います。インシデントはとらないと思います。
回答ありがとうございます。
これはExcel,VBAのテクニックの問題でした。
やり方を2つ紹介します。たぶん今回のケースだとマクロを分ける方だと思いますが、
起動オプションの方は簡単なので試してください。
【起動オプションで読み取り専用で開く方法】
<Excelのパス>EXCEL.EXE" /r ブック名
【マクロをわける方法】
1.PERSONAL.XLSに書かれているマクロの中身をメモ帳に保存する。(バックアップとして)
2.新規ブックを開き「ツール」「マクロ」「Visual Baic Editor」を選択する。
3.プロジェクト内にある「ThisWorkbook」か「標準モジュール」に必要なマクロをコピーする。
4.自動実行させたいマクロのプロシージャ名はSub Workbook_Open() にする。
(たぶん、PERSONAL.XLSでそうしてるはず)
5.ブックに名前を付けて保存する。
(通常のブックにするか、テンプレートにするかはお任せします。テンプレートにする場合は
ファイルの種類をテンプレートにしてください。)
6.PERSONAL.XLSからマクロを削除する。(プロセスで当たるので使わないようにする。もしかしたらファイル削除かも)
7.タスクスケジューラーに今回作成したBookまたはテンプレートを登録する。
8.同じように、PERSONAL.XLSに残っているマクロを別のテンプレートにする。
(こちらは毎回使うのでテンプレート)
「テンプレート」とは
拡張子がxltになっているファイルです。このテンプレートを開くと新しいブックに内容が
コピーされて開きます。
回答ありがとうございます。
3の回答にありますとおり、起動オプション/r ではPERSONAL.XLSは読み取り専用にはなりませんでした。
マクロを分ける方法は、試してませんがアイデアとしてはいいかもしれません。
起動オプションで読み取り専用にしても、PERSONAL.xlsは読み取り専用で開けないような気がするのですが。
それでいろいろ試した結果、次の方法で(1)を実現できます。
テキストファイルに次のようなコードを書いて、ファイル名をtask.vbsのように変更します。
つまりvbsファイルからエクセルを起動しようというわけです。
Set objWShell = CreateObject("WScript.Shell") objWShell.Run "rundll32.exe url.dll,FileProtocolHandler C:\Documents and Settings\hogehoge\デスクトップ\task.xls", 1, False Set objWShell = Nothing
※起動するブックのパスに変更してください。
このvbsファイルをタスクスケジューラから実行すると、Excelは同じスレッドで起動されるので回避できます。
回答ありがとうございます。
思うような動きになりました。助かりました。
回答ありがとうございます。
思うような動きになりました。助かりました。