自分のPC上で、Windowsタスクスケジューラーに VBAでロジックが書かれたExcelを登録して毎晩、夜中に実行しています。

ところが、Excelを起動したままにしていると、タスクスケジューラーから実行されたExcelが別スレッド(別のエクセルのフレーム)で起動されてしまい、「PERSONAL.XLS は編集のためロックされています。」というメッセージが現れExcelが止まってしまいます。
これを回避するにはどのようにしたらよいでしょう?
PERSONAL.XLSには必要なVBAが登録されているので、削除できません。

以下のいづれかの方法があれば、いいのかな?と思っているのですが、もちろん他の方法でも構いません。
(1) タスクスケジューラーからExcelを起動するときに、もしExcelが既に起動済みであれば、そのスレッド内で実行するようにする。
(2) タスクスケジューラーからExcelを起動するときだけ、PERSONAL.XLSを無効にする。
(3) タスクスケジューラーからExcelを起動するときだけ、PERSONAL.XLSを読み取り専用で開く。

よい解決方法があればご教授ください。
よろしくお願いします。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2010/01/26 15:06:37
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:SALINGER No.3

回答回数3454ベストアンサー獲得回数969

ポイント55pt

起動オプションで読み取り専用にしても、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は同じスレッドで起動されるので回避できます。

id:beatgoeson

回答ありがとうございます。

思うような動きになりました。助かりました。

2010/01/26 15:04:59

その他の回答2件)

id:de6 No.1

回答回数20ベストアンサー獲得回数0

ポイント5pt

ただ単に、エクセル・VBAの問題だけではなく、他のソフトがたまたま邪魔をする場合があります、シンクロ時にほとくにそうなりがちです、代表例がソースネクストの驚速パソコンとかがあります、一度マイクロソフトに詳しい事情を話し、解決策があると思います。インシデントはとらないと思います。

http://q.hatena.ne.jp/1264473007

id:beatgoeson

回答ありがとうございます。

これはExcel,VBAのテクニックの問題でした。

2010/01/26 15:03:00
id:heke2mee No.2

回答回数162ベストアンサー獲得回数43

ポイント20pt

やり方を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になっているファイルです。このテンプレートを開くと新しいブックに内容が

コピーされて開きます。

id:beatgoeson

回答ありがとうございます。

3の回答にありますとおり、起動オプション/r ではPERSONAL.XLSは読み取り専用にはなりませんでした。

マクロを分ける方法は、試してませんがアイデアとしてはいいかもしれません。

2010/01/26 15:04:32
id:SALINGER No.3

回答回数3454ベストアンサー獲得回数969ここでベストアンサー

ポイント55pt

起動オプションで読み取り専用にしても、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は同じスレッドで起動されるので回避できます。

id:beatgoeson

回答ありがとうございます。

思うような動きになりました。助かりました。

2010/01/26 15:04:59
  • id:beatgoeson
    Versionは、Excel2003です。
  • id:heke2mee
    本来のやりたい事はタスクで起動するときだけ、
    自動実行したいマクロがあるという事でしょうか
  • id:beatgoeson
    普通にあるブックをExcelを立ち上げた状態で、タスクスケジューラーから別のExcelブック(Open_Workbookイベントに処理を記述)を実行すると「PERSONAL.XLS は編集のためロックされています。」となり、[読み取り専用][通知][キャンセル]のどれかをクリックしないと先に進みません。

    通常でも、Excelを起動している状態で、スタートメニューからExcelを起動する同様の「PERSONAL.XLS は編集のためロックされています。」となります。

  • id:beatgoeson
    ちなみに、タスクスケジューラーから実行するブックに関しては、実行したいVBAの処理はそのブックのOpen_Workbookイベントに記述されており、PERSONAL.XLSに記述されている処理は実行する必要はありません。
  • id:heke2mee
    同じプロセスで実行する場合は
    ActiveSheet
    ActiveWorkbook
    ActiveCell
    が使用されていると動きがおかしくなるので気をつけてください。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません