こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Excel VBAの不思議な現象について

Excel2003を使用しています。
下記にあるコードを実行すると稀に(50回に1回くらいの割合?)、違った動作が走ります。
この原因はなんでしょうか?また、解決策としてはコードをどのように修正したら良いでしょうか??

【状況】
・コードを記述しているブック…MENU.xls
・MENU.xlsにあるシート…「メニュー」「AAA」「BBB」「その他」 ※順番もこの通りです

【やりたい動作】
「メニュー」シートのセルの値をコピーして、「AAA」と「BBB」に貼り付ける。
「AAA」と「BBB」を新規ブックへコピーする。
新規ブックにさらに「あああ」と「いいい」というシートを追加する。
新規ブックを確定版.xlsという名前で保存する。

【コード】
ThisWorkbook.Worksheets("メニュー").Range("C1").Copy
Worksheets(Array("AAA", "BBB")).Select
Range("D9").PasteSpecial Paste:=xlPasteValues
ActiveWindow.SelectedSheets.Copy

Application.DisplayAlerts = False
With ActiveWorkbook
.Worksheets.Add(After:=Worksheets(Worksheets.Count)) _
.Name = "あああ"
.Worksheets.Add(After:=Worksheets(Worksheets.Count)) _
.Name = "いいい"
.SaveAs Filename:=ThisWorkbook.Path & "\" & "確定版.xls"
End With
Application.DisplayAlerts = True


【不思議な現象】
いつもは、このマクロを実行してエラーも出ず、思った通りの動作で終了します。
ですが、時々、

   「AAA」と「BBB」を新規ブックへコピーする。

以降から動作がおかしくなります。

具体的には、

新規ブックに「あああ」と「いいい」が追加されず、MENU.xlsに「あああ」と「いいい」が追加されて、MENU.xlsが「確定版.xls」として保存されてしますのです。
(つまり、ActiveworkbookをMENUであると認識されてしまうようです。)

そのため「AAA」と「BBB」を追加した新規ブックは「Book1.xls」として宙ぶらりんの状態です。

この原因は何でしょうか?
途中でエラーが出て止まってくれれば良いのですが、間違ったまま最後まで処理が行われてしまうので困っています。
しかも本当にごく稀にこの現象が起こるのです。

もしお分かりになる方がいらっしゃいましたら教えて下さい。
宜しくお願いします。

投稿日時 - 2012-08-01 23:43:07

QNo.7622588

困ってます

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

重いシートだとたまにあるっぽいですよ、ソレ。

> つまり、ActiveworkbookをMENUであると
コピー完了を待ちきれずに処理が進んじゃう・・・みたいです。どーも、コピーや描画など一部機能は同期がとれなくなるコトがあるらしく、不思議なエラーは他にもいくつか。
記憶曖昧ですが、下手すると不正アクセスで落ちるかも?

まぁ、発生が稀なら、エラーチェックとしてブック名を確認。
 With ActiveWorkbook
  If .Name = "Menu.xls" Then Stop

できれば、負荷を減らすために「新ブック作成&シートの内容をひとつずつコピー」がオススメです。分けた方が安定するし、処理が早くなるケースもあります。
新ブック作成なら Set bk = Workbooks.Add と戻り値でブック受け取れるので、他の方が指摘するよーに、Active~の使用を控える意味でもいいですよ。
Active~は便利だけど混乱招くので、慣れてきたら控えたいです。

投稿日時 - 2012-08-02 23:15:00

お礼

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

>コピー完了を待ちきれずに処理が進んじゃう
確かにコピーしたいシートは数値や関数がたくさん入っていて重く、不思議な現象がちょうどそんな感じなので、納得です。

アドバイスも含めてとても参考になりました。
やはり変数を使った記述に書き換えたいと思います。

投稿日時 - 2012-08-03 23:28:12

ANo.3

このQ&Aは役に立ちましたか?

4人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.2

ActiveWindow →ThisWorkbook
にすれば、問題は解決するのでは・・・、と思います。
駄目だったら、どのワークシートがアクティブなのかをはっきりさせてやる。

投稿日時 - 2012-08-02 13:33:49

お礼

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

やはり新規ブックのまま実行するよりも、ブックを一度保存するか変数を使って処理するのがベターですかね…
別の方法を試してみます。

投稿日時 - 2012-08-02 22:25:24

ANo.1

>途中でエラーが出て止まってくれれば良いのですが、
>間違ったまま最後まで処理が行われてしまうので困っています。

Application.DisplayAlerts = False
を外せは原因が解るかも

投稿日時 - 2012-08-02 09:11:25

お礼

回答ありがとうございます。
DisplayAlertsを消して試してみます。
エラーメッセージが出てくれると良いのですが…

投稿日時 - 2012-08-02 22:12:58

あなたにオススメの質問