- ベストアンサー
アクテイブなブック以外を一括非表示
お世話になります。 エクセルの5つのブックを開き、VBAで、それぞれにアクセスするマクロを実行しているときに、誤って、アクテイブなブック以外のブックをクリックしてまうと、Workbooks(AAA).WorkSheets(BBB).Range("C1").Selectctなどのブックを指定している個所で、「インデックスが有効範囲にありません」のエラーがでて、マクロがとまってしまいます。 アクティブなブック以外を非表示にするとか、クリックできないようにする方法はないでしょうか?また、その解除方法も教えていただけたら助かります。 よろしくお願いします。
- みんなの回答 (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 にしていますか?
その他の回答 (5)
- Wendy02
- ベストアンサー率57% (3570/6232)
追伸:Wendy02です。 非表示、表示とも、Workbook オブジェクトには、Select メソッドはないありません。Workbook は、Active メソッドだけだと思います。 ついでに、コンテナタイプの書き方なら、ブックが開いていれば、表示・非表示、アクティベートに関係がなく、値を取り出すことは可能です。 例: Sub TestWorkbooks() Const WBNAME = "AAA.xls" MsgBox Workbooks(WBNAME).Worksheets("BBB").Range("C1").Value End Sub
- papayuka
- ベストアンサー率45% (1388/3066)
どんなコードか不明ですが、Selectしない書き方に直すとか、、、 どっちにしろ非表示ブックでは Select 出来ないのでエラーになると思います。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 私は、直接の回答ではありませんが、何か違和感を感じます。 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のヘルプで探してみたのですが、検索できませんでした。この個所は、どういう処理をしているのでしょうか?
- zap35
- ベストアンサー率44% (1383/3079)
クリックできなくするだけなら ActiveWindow.WindowState = xlMinimized 'Activewindow最小化 ActiveWindow.WindowState = xlMaximized '最大化 はどうでしょう。
補足
回答ありがとうございます。 最小化しても、WINDOWSのメニューバーに残っているため、マクロ実行中に誤ってクリックしてしまいそうです。
- kabilunlun
- ベストアンサー率34% (155/446)
非表示にするときは、 Workbooks(AAA).WorkSheets(BBB).Visible = xlSheetHidden 表示するときは、 Workbooks(AAA).WorkSheets(BBB).Visible = xlSheetVisible で、できませんか。
補足
回答ありがとうございます。 シートは非表示にできるのですが、1つは残ってしまうので、ブック自体は残ってしまいます。 5つのブックのうち、アクティブなブック以外の4つのブックを非表示、もしくはアクティブにできないようにしたいのですが、無理なのでしょうか?
お礼
丁寧に回答をしていたき、ありがとうございます。 Interactive プロパティにより、目的の動作を達成することができました。 昔作ったQUICKBASICのプログラムを単純に移植したため、長いコードになってしまいましたが、正常動作はしているようです。 Application.Interactive = Falseもいれていなかったので、コードに組み込みました。 どうもありがとうございました。