お世話になります。
エクセルの5つのブックを開き、VBAで、それぞれにアクセスするマクロを実行しているときに、誤って、アクテイブなブック以外のブックをクリックしてまうと、Workbooks(AAA).WorkSheets(BBB).Range("C1").Selectctなどのブックを指定している個所で、「インデックスが有効範囲にありません」のエラーがでて、マクロがとまってしまいます。
アクティブなブック以外を非表示にするとか、クリックできないようにする方法はないでしょうか?また、その解除方法も教えていただけたら助かります。
よろしくお願いします。
No.5ベストアンサー
- 回答日時:
こんばんは。
>マクロが3500行あるため、1ステップごとにActivateをいれるのは、気が引けてしまいました。
私は、一度だけ、経験があるのですが、1,000行のマクロコードの修正の依頼を受けましたが、丁寧にお断りしました。そのようなマクロは直し様がありません。マクロのひとつのプロシージャは、100行程度が限界です。
3500行が動くかどうか、途中でこけてしまうか、あぶないところだと思います。
おそらくは、それは、自動記録のマクロだと思います。それは、ほとんど考えて作られておりません。
マクロのプロシージャは、重複する部分は、サブルーチン化して、すべては構造化していきます。Public 変数を上手に使ったり、工夫をしていきます。
私の場合は、その上に、プロシージャーの種類によってモジュールを別けます。テキスト処理、インターネット処理、起動・終了・ユーティリティ処理、ユーザー定義関数、Win32API、それぞれをモジュールごとに分散して、なるべく、一箇所のモジュールに集中しないようにし、また、ローカルモジュール(シートなど)は、使わないようにします。
しかし、そういう配慮は、最初の設計の段階から決めていかないといけませんし、なかなかレベルが向上しないと出来ません。
本当に、ワンステップごとに Select やActivate が必要か、マクロを良く吟味してみないと分かりません。初歩的なことですが、多くは、コンテナタイプで、解消されるはずです。
ヘルプより。
Interactive プロパティ
True の場合、Excel が対話モードになります。既定値は True です。このプロパティに False が設定されると、キーボードやマウスからの入力を受け付けなくなります。ただし、表示されたダイアログ ボックスへの入力は可能です。入力できない状態にしておくと、マクロで Excel のオブジェクトを移動したりアクティブしているときに、ユーザーからの干渉を防ぐことができます。値の取得および設定が可能です。ブール型 (Boolean) の値を使用します
使用例:
Application.Interactive = False
それと、Application.ScreenUpdating = False にしていますか?
No.6
- 回答日時:
追伸:Wendy02です。
非表示、表示とも、Workbook オブジェクトには、Select メソッドはないありません。Workbook は、Active メソッドだけだと思います。
ついでに、コンテナタイプの書き方なら、ブックが開いていれば、表示・非表示、アクティベートに関係がなく、値を取り出すことは可能です。
例:
Sub TestWorkbooks()
Const WBNAME = "AAA.xls"
MsgBox Workbooks(WBNAME).Worksheets("BBB").Range("C1").Value
End Sub
丁寧に回答をしていたき、ありがとうございます。
Interactive プロパティにより、目的の動作を達成することができました。
昔作ったQUICKBASICのプログラムを単純に移植したため、長いコードになってしまいましたが、正常動作はしているようです。
Application.Interactive = Falseもいれていなかったので、コードに組み込みました。
どうもありがとうございました。
No.3
- 回答日時:
こんばんは。
私は、直接の回答ではありませんが、何か違和感を感じます。
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のヘルプで探してみたのですが、検索できませんでした。この個所は、どういう処理をしているのでしょうか?
No.1
- 回答日時:
非表示にするときは、
Workbooks(AAA).WorkSheets(BBB).Visible = xlSheetHidden
表示するときは、
Workbooks(AAA).WorkSheets(BBB).Visible = xlSheetVisible
で、できませんか。
この回答への補足
回答ありがとうございます。
シートは非表示にできるのですが、1つは残ってしまうので、ブック自体は残ってしまいます。
5つのブックのうち、アクティブなブック以外の4つのブックを非表示、もしくはアクティブにできないようにしたいのですが、無理なのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Application.Runエラー(1004)
-
別シートのマクロを実行する方法
-
access2010 コマンドまたはアク...
-
Access終了時にマクロまたはVBA...
-
エクセルのマクロボタンが編集...
-
オートシェイプの黄色いハンド...
-
エクセルVBAで、ボタンの文字を...
-
Excel VBA サブルーチン関連
-
マクロとモジュールの違いを教...
-
エクセル:保存するときに、標...
-
ExcelVBAで右クリックメニュー...
-
シート保護を掛けたまま並べ替...
-
エクセル VBA SendKeys ループ...
-
Workbook_Openを起動時以外に呼...
-
マクロ 戻るボタンを押したらシ...
-
エクセルの右クリックにオートS...
-
InputBox内の表示について
-
アクセス:検索フォームボタンに...
-
ExcelのVBAでDisplayalertsで警...
-
アクセスでauto_openは使えない?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
別シートのマクロを実行する方法
-
Application.Runエラー(1004)
-
エクセルのマクロボタンが編集...
-
Access終了時にマクロまたはVBA...
-
InputBox内の表示について
-
エクセルVBAで、ボタンの文字を...
-
access2010 コマンドまたはアク...
-
シート保護を掛けたまま並べ替...
-
ExcelVBAで右クリックメニュー...
-
特定のシートだけ印刷はマクロ...
-
マクロ 戻るボタンを押したらシ...
-
excelで会議室予約表の作成(マ...
-
エクセル VBA SendKeys ループ...
-
ExcelのVBAでDisplayalertsで警...
-
AccessでExcelファイルを印刷
-
マクロが登録できません
-
アクセスのマクロについて
-
アクセス:検索フォームボタンに...
-
マクロとモジュールの違いを教...
-
プロシージャが大きすぎます!
おすすめ情報