都道府県穴埋めゲーム

お世話になります。
エクセルの5つのブックを開き、VBAで、それぞれにアクセスするマクロを実行しているときに、誤って、アクテイブなブック以外のブックをクリックしてまうと、Workbooks(AAA).WorkSheets(BBB).Range("C1").Selectctなどのブックを指定している個所で、「インデックスが有効範囲にありません」のエラーがでて、マクロがとまってしまいます。

アクティブなブック以外を非表示にするとか、クリックできないようにする方法はないでしょうか?また、その解除方法も教えていただけたら助かります。
よろしくお願いします。

A 回答 (6件)

こんばんは。



>マクロが3500行あるため、1ステップごとにActivateをいれるのは、気が引けてしまいました。

私は、一度だけ、経験があるのですが、1,000行のマクロコードの修正の依頼を受けましたが、丁寧にお断りしました。そのようなマクロは直し様がありません。マクロのひとつのプロシージャは、100行程度が限界です。

3500行が動くかどうか、途中でこけてしまうか、あぶないところだと思います。
おそらくは、それは、自動記録のマクロだと思います。それは、ほとんど考えて作られておりません。

マクロのプロシージャは、重複する部分は、サブルーチン化して、すべては構造化していきます。Public 変数を上手に使ったり、工夫をしていきます。

私の場合は、その上に、プロシージャーの種類によってモジュールを別けます。テキスト処理、インターネット処理、起動・終了・ユーティリティ処理、ユーザー定義関数、Win32API、それぞれをモジュールごとに分散して、なるべく、一箇所のモジュールに集中しないようにし、また、ローカルモジュール(シートなど)は、使わないようにします。

しかし、そういう配慮は、最初の設計の段階から決めていかないといけませんし、なかなかレベルが向上しないと出来ません。

本当に、ワンステップごとに Select やActivate が必要か、マクロを良く吟味してみないと分かりません。初歩的なことですが、多くは、コンテナタイプで、解消されるはずです。

ヘルプより。

Interactive プロパティ

True の場合、Excel が対話モードになります。既定値は True です。このプロパティに False が設定されると、キーボードやマウスからの入力を受け付けなくなります。ただし、表示されたダイアログ ボックスへの入力は可能です。入力できない状態にしておくと、マクロで Excel のオブジェクトを移動したりアクティブしているときに、ユーザーからの干渉を防ぐことができます。値の取得および設定が可能です。ブール型 (Boolean) の値を使用します


使用例:
  Application.Interactive = False


それと、Application.ScreenUpdating = False にしていますか?
    • good
    • 0

追伸:Wendy02です。



非表示、表示とも、Workbook オブジェクトには、Select メソッドはないありません。Workbook は、Active メソッドだけだと思います。

ついでに、コンテナタイプの書き方なら、ブックが開いていれば、表示・非表示、アクティベートに関係がなく、値を取り出すことは可能です。

例:
Sub TestWorkbooks()
 Const WBNAME = "AAA.xls"
 MsgBox Workbooks(WBNAME).Worksheets("BBB").Range("C1").Value
End Sub
    • good
    • 0
この回答へのお礼

丁寧に回答をしていたき、ありがとうございます。
Interactive プロパティにより、目的の動作を達成することができました。
昔作ったQUICKBASICのプログラムを単純に移植したため、長いコードになってしまいましたが、正常動作はしているようです。
Application.Interactive = Falseもいれていなかったので、コードに組み込みました。
どうもありがとうございました。

お礼日時:2006/09/06 11:40

どんなコードか不明ですが、Selectしない書き方に直すとか、、、


どっちにしろ非表示ブックでは Select 出来ないのでエラーになると思います。
    • good
    • 0

こんばんは。



私は、直接の回答ではありませんが、何か違和感を感じます。

Workbooks("AAA.xls").WorkSheets("BBB").Range("C1").Select

「インデックスが有効範囲にありません」」
というエラーが返りますか?それは、「Select メソッド」が失敗したのではないでしょうか?

「インデックスが有効範囲にありません」なら、マクロは見つからないということで、ブックを探しています。そういう場合は、エラー・トラップにして、そのエラーの原因に対して正しく対処させ、Resume させたほうがよいのではありませんか?

通常は、必要なワークブックから、シートとセルを順にアクティベートするだけで済むように思います。

ユーザーが入力を伴わないもので、OnTimeメソッドなどが入る長い時間の掛かるマクロで、途中でユーザーに触わられたくないなら、Interactive を False にします。

Workbooks("BBB.xls") で、実行すれば、以下のマクロはエラーは出ます。

Workbooks("AAA.xls").WorkSheets("BBB").Range("C1").Select

そういう場合は、例えば、

Workbooks("AAA.xls").Activate
Worksheets("BBB").Activate
Range("C1").Select

とするか、

Application.Goto Workbooks("AAA.xls").Worksheets("BBB").Range("C1")

とすればよいです。

Windows("AAA.xls").Visible = False

とすれば、非表示には出来ますが、あまり聞いたことがないですね。マクロの目的がはっきりしていないと、回答もワザだけになって、結果的にはうまく行かない結果に終わってしまうのではないか、と思います。

明示的にブックを指定させて、マクロを実行するのが一般的で、ユーザーが、アクティブブックを替えてしまっても、きちんと目的のブックで実行できるように作るが、正しいマクロの作り方だと思います。

ユーザーが触ったりしてほしくないブックは、最初から、アドインにしておきます。

この回答への補足

ご推察のとおり、OnTimeメソッドが入る6時間程度のマクロで、その間は5つのブックのうち、どれがアクテイブなのか判断できません。
マクロが実行している間に、間違ってアクテイブでないブックをクリックして、処理が止まることがあったので、質問させていただきました。

Workbooks("AAA.xls").Activate
Worksheets("BBB").Activate
Range("C1").Select
のように、Activateを入れてみようかとも思ったのですが、マクロが3500行あるため、1ステップごとにActivateをいれるのは、気が引けてしまいました。

Application.Goto Workbooks("AAA.xls").Worksheets("BBB").Range("C1")とWindows("AAA.xls").Visible = Falseの動作を確認できました。

「Interactive を False にする」のところですが、Interactive を VBAのヘルプで探してみたのですが、検索できませんでした。この個所は、どういう処理をしているのでしょうか?

補足日時:2006/09/05 21:40
    • good
    • 0

クリックできなくするだけなら


ActiveWindow.WindowState = xlMinimized 'Activewindow最小化
ActiveWindow.WindowState = xlMaximized '最大化
はどうでしょう。

この回答への補足

回答ありがとうございます。
最小化しても、WINDOWSのメニューバーに残っているため、マクロ実行中に誤ってクリックしてしまいそうです。

補足日時:2006/09/05 21:13
    • good
    • 0

非表示にするときは、


Workbooks(AAA).WorkSheets(BBB).Visible = xlSheetHidden
表示するときは、
Workbooks(AAA).WorkSheets(BBB).Visible = xlSheetVisible
で、できませんか。

この回答への補足

回答ありがとうございます。
シートは非表示にできるのですが、1つは残ってしまうので、ブック自体は残ってしまいます。
5つのブックのうち、アクティブなブック以外の4つのブックを非表示、もしくはアクティブにできないようにしたいのですが、無理なのでしょうか?

補足日時:2006/09/05 21:26
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!