• ベストアンサー

アクテイブなブック以外を一括非表示

お世話になります。 エクセルの5つのブックを開き、VBAで、それぞれにアクセスするマクロを実行しているときに、誤って、アクテイブなブック以外のブックをクリックしてまうと、Workbooks(AAA).WorkSheets(BBB).Range("C1").Selectctなどのブックを指定している個所で、「インデックスが有効範囲にありません」のエラーがでて、マクロがとまってしまいます。 アクティブなブック以外を非表示にするとか、クリックできないようにする方法はないでしょうか?また、その解除方法も教えていただけたら助かります。 よろしくお願いします。

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答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 にしていますか?

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (5)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.6

追伸:Wendy02です。 非表示、表示とも、Workbook オブジェクトには、Select メソッドはないありません。Workbook は、Active メソッドだけだと思います。 ついでに、コンテナタイプの書き方なら、ブックが開いていれば、表示・非表示、アクティベートに関係がなく、値を取り出すことは可能です。 例: Sub TestWorkbooks()  Const WBNAME = "AAA.xls"  MsgBox Workbooks(WBNAME).Worksheets("BBB").Range("C1").Value End Sub

QAZ123
質問者

お礼

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

全文を見る
すると、全ての回答が全文表示されます。
  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.4

どんなコードか不明ですが、Selectしない書き方に直すとか、、、 どっちにしろ非表示ブックでは Select 出来ないのでエラーになると思います。

全文を見る
すると、全ての回答が全文表示されます。
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答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 とすれば、非表示には出来ますが、あまり聞いたことがないですね。マクロの目的がはっきりしていないと、回答もワザだけになって、結果的にはうまく行かない結果に終わってしまうのではないか、と思います。 明示的にブックを指定させて、マクロを実行するのが一般的で、ユーザーが、アクティブブックを替えてしまっても、きちんと目的のブックで実行できるように作るが、正しいマクロの作り方だと思います。 ユーザーが触ったりしてほしくないブックは、最初から、アドインにしておきます。

QAZ123
質問者

補足

ご推察のとおり、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)
回答No.2

クリックできなくするだけなら ActiveWindow.WindowState = xlMinimized 'Activewindow最小化 ActiveWindow.WindowState = xlMaximized '最大化 はどうでしょう。

QAZ123
質問者

補足

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

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

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

QAZ123
質問者

補足

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

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • VBAについてです。

    VBAについてです。 当方VBA初心者です。初歩的な質問があり投稿しました。 Workbooks("aaaa.xlsx").Worksheets("aaa").Range("A3:A50").Copy _ Workbooks("bbbb.xlsx").Worksheets("bbb").Range("A2") というコピーはできるのに Workbooks("aaaa.xlsx").Worksheets("aaa").Range(cells(3, 1), cells(50, 1)).Copy _ Workbooks("bbbb.xlsx").Worksheets("bbb").Range("A2") というコピーはどうしてできないのでしょうか? また、最下行を判別して Workbooks("aaaa.xlsx").Worksheets("aaa").Range(cells(3, 1), cells(最下行, 1)).Copy _ Workbooks("bbbb.xlsx").Worksheets("bbb").Range("A2") という様に簡単に処理したいのですが、やはり無理なのでしょうか? ブックが違うのですが、これをなんとかこのような処理にしたいと思っています。

  • エクセル2007のマクロについて

    実践で学ぶ Office Excel 2007 VBAというマクロの学習サイトで Sub Macro実践1() 'ブック シート セルアドレスを指定すればブック シートをアクティブにする必要はない             Workbooks("転記.xlsx").Worksheets("転記シート1").Range("A1").Value = _               Workbooks("データ.xlsx").Worksheets("データ1").Range("A1").Value                 End Sub         と入力すると「インデックスが有効範囲にありません」となってしまいます。なにか間違っているのでしょうか?

  • エクセルVBAで他のbookのセルcellsで参照

    エクセルVBAで他のbookのセルの値(一定の範囲)を参照したいのですが、変数を使いたいため、cellsを使用したいのですがうまくいきません。方法はないでしょうか。 下記に例を示します。 rangeを使用すればすべてok((2)(5))(この場合はset文を使用しなくてもok(5))。同じbookならcells使用ok(4)。 他のbookをcells文使用する方法はないでしょうか(もちろんできれば、Thisbookの方もcellsを使用したい)。 よろしくお願いします。 sub test() Dim ThisBook As Workbook Dim Workbook2 As Workbook 'マクロを実行しているワークブック Set ThisBook = ThisWorkbook '他のワークブック Set Workbook2 = Workbooks("test11.xlsx") ' 'ThisBook.Worksheets(1).Range("A1:B2").Value = Workbook2.Worksheets(1).Range(Cells(1, 1), Cells(2, 2)).Value  '(1)だめ 'ThisBook.Worksheets(1).Range("A1:B2").Value = Workbook2.Worksheets(1).Range("a1:b2").Value '(2) OK 'Workbooks("test1.xlsm").Worksheets(1).Range("A1:B2").Value = Workbooks("test11.xlsx").Worksheets(1).Range(Cells(1, 1), Cells(2, 2)).Value '(3) だめ 'Workbooks("test1.xlsm").Worksheets(1).Range("A1:B2").Value = Workbooks("test1.xlsm").Worksheets(1).Range(Cells(3, 3), Cells(4, 4)).Value  '(4)だめ 'Workbooks("test1.xlsm").Worksheets(1).Range("A1:ii8000").Value = Workbooks("test11.xlsx").Worksheets(1).Range("a1:ii8000").Value  '(5) ok End Sub

  • 異なるブック間でのセル範囲のコピー/VBA

    異なるブック間でクリップボードを経由せず直接コピーしたいため 下記のマクロを記述していますが、実行エラーが発生します。 どうしてでしょうか。 ThisWorkbook.Worksheets(3).Range(Cells(3, 1), Cells(3 + a, 1)).Value = Workbooks("excel.xls").Worksheets(1).Range(Cells(11, 3), Cells(11 + a, 3)).Value (補足) (1)VBA実行中のThisWorkbook、excel.xlsは別のブック ですが、同じフォルダにあります。 (2)aは数値が入る変数です。

  • Excel マクロ 別ブックの情報をコピーする方法

    他のブックの情報をコピーして貼り付けるマクロを作成しています。 2種類のブックから情報をコピーして貼り付けます。 Sub MailTemp() Dim myCellall As Range Dim myCellyoso As Range Dim myCellfor As Range Set myCellall = Sheets("すべて").Range("A3") With Workbooks.Open("\") With .Worksheets("すべて") .Range(.Range("A3"), .Cells.SpecialCells(xlCellTypeLastCell)).Copy myCellall End With .Close False End With Set myCellyoso = ThisWorkbook.Worksheets("予測").Range("A3") Set myCellfor = ThisWorkbook.Worksheets("結果").Range("A3") With Workbooks.Open("\別ブック") With .Worksheets("予測") .Range(.Range("A3"), .Cells.SpecialCells(xlCellTypeLastCell)).Copy myCellyoso End With With .Worksheets("結果") .Range(.Range("A3"), .Cells.SpecialCells(xlCellTypeLastCell)).Copy myCellfor End With .Close False End With End Sub 下記の箇所でエラーが発生して、先に進みません。 原因を調べていましたが、わかりません。 Set myCellfor = ThisWorkbook.Worksheets("結果").Range("A3") エラーメッセージ 実行時エラー'9' インデックスが有効範囲にありません。 アドバイスを頂けますでしょうか。 よろしくお願いいたします。

  • EXCEL VBA複数ブックからの貼り付け

    複数のブックにあるデータを一つのシートに繋げるマクロを作っています。 元となるブックのフォーマットは全て一緒の為下記の様なコードを書きました。 Dim OpenFileName As Variant, tmp As String, i As Long '複数のブック巣を選択 OpenFileName = Application.GetOpenFilename(FileFilter:="Microsoft Excelブック,*.xls", _ MultiSelect:=True) '名前の取得 If IsArray(OpenFileName) Then For i = 1 To UBound(OpenFileName) tmp = tmp & OpenFileName(i) & vbCrLf Next i MsgBox "選択したファイルは " & vbCrLf & tmp & " ", vbInformation Else MsgBox "キャンセルされました。", vbInformation End If '選択したブックを開く For i = 1 To UBound(OpenFileName) Workbooks.Open OpenFileName(i) Next i '最初のファイルをコピーをし、DataSheetに貼り付ける Workbooks(OpenFileName(1)).Worksheets("元帳").Cells.Copy _ Destination:=Workbooks("在庫表BETA.xls").Worksheets("DataSheet").Range("A1") '2個以降のファイルを下に貼り付ける For i = 2 To UBound(OpenFileName) Workbooks(OpenFileName(i)).Worksheets("元帳").Range("A9:V54").Copy _ Destination:=Workbooks("在庫表BETA.xls").Worksheets("DataSheet").Range("A65536").End(xlUp) Next i '最初のファイルをコピーをし、DataSheetに貼り付ける Workbooks(OpenFileName(1)).Worksheets("元帳").Cells.Copy _ Destination:=Workbooks("在庫表BETA.xls").Worksheets("DataSheet").Range("A1") 上の部分で『インデックスが有効範囲にありません。(Error 9)』の エラーが発生してしまい、困っております。 また、該当箇所をコメントアウトしても『2個目以降のファイルを貼り付ける』の箇所でも同様のエラーが発生してしまいます。 無知な私ですが、宜しくお願い致します。

  • VBAでのブック・シートの保護・解除について

    エクセル2010のVBAでのブック、シートの保護&解除の方法について教えて頂きたく、 質問させて頂きます。 消されては困るシートや数式がある関係で、ブックオープン時にVBAでブックとシートにそれぞれパスワードをかけて保護しています。 VBAではシートの削除、作成、コピーなどを行っているため、VBA実行時のみ、保護を解除させるようにしたいと思います。 ただ、対象のシート自体にも入力したい項目があるため、その箇所については保護を解除しておく必要があります。 そして、VBA実行後、再度、その箇所以外にパスワードで保護をかけ直します。 イメージとしては下記のような流れになります。 対象ブック:ブックA 対象シート:シート1 パスワード:1234(それぞれ) 常時保護を解除しておきたいセル:range("A6:H106") 1.(オープン時には、)ブック保護&特定のセル以外のシート保護 2.VBA実行時には全ての保護解除 3.VBA終了時に、1の状態に戻る どうぞよろしくお願い致します。

  • エクセルVBAで、複数のブックからデータベースを作りたい

    こんにちは。VBAをはじめたばかりの者です。 変数の使い方で教えていただきたいことがあります。 Dim myFLName As String myFLName = ThisWorkbook.Path & "\001.xls" Workbooks.Open Filename:=myFLName, ReadOnly:=True Workbooks("dbase.xls").Activate Range("A2").Select ActiveCell.Value = 1 ActiveCell.Offset(, 1).Select ActiveCell.Value = Workbooks("001.xls").Worksheets(1).Range("R3") ActiveCell.Offset(, 1).Select ActiveCell.Value = Workbooks("001.xls").Worksheets(1).Range("C2") ActiveCell.Offset(, 1).Select ActiveCell.Value = Workbooks("001.xls").Worksheets(1).Range("R2") ActiveCell.Offset(1, -3).Select 001.xls~(連番でない)200.xlsくらいまでのファイルがあり、 同じフォルダにdbase.xlsを作って1ブックから1レコードになるようにしたいと 思います。 こんな感じで1行目はできたのですが、2行目の1列目に「2」を入れ、 2列目からは001.xlsの次のブックを開いてセルの中身をコピーしたいのです。 変数の使い方がよくわからないのですが、教えていただけますでしょうか。 よろしくお願いいたします。

  • フォルダ内の特定ブックだけを1つのブックにまとめる

    以前こちらで質問させて頂きましたフォルダ内の特定ブックだけを1にのブックにまとめる方法で、大変助かっていましたがブック名が変更になり、教えて頂いたマクロでは実行できなくなったので自分なりに考えたのですがどうしてもできません。 質問時のブック名は「1_****」と「2_****」で 今回「1_****」だけが「1(3)_****」に変更になりました。 下記のマクロでmyfile = dir(mypath & "1_" & "*.xl*")→myfile = dir(mypath & "1(3)_" & "*.xl*")に変更するのはわかるのですが do until myfile = ""   myfile2 = "2" & mid(myfile,2,99)をどう変更すれば良いかわかりません どなたかお助け頂けませんか? sub macro1()  dim myPath as string  dim myFile as string  dim myFile2 as string  mypath = "c:\test\"  myfile = dir(mypath & "1_" & "*.xl*")  do until myfile = ""   myfile2 = "2" & mid(myfile,2,99)   workbooks.open mypath & myfile   workbooks.open mypath & myfile2   application.displayalerts = false   workbooks(myfile).worksheets("2").delete   application.displayalerts = true   workbooks(myfile2).worksheets("2").move after:=workbooks(myfile).worksheets("1")   workbooks(myfile).close true   workbooks(myfile2).close false   myfile = dir()  loop end sub

  • セル内容を含めた名称のBookをアクティブにする

    色々と検索して試しましたが、素人のため結局わからず困っています。質問させていただきますので、よろしくお願いいたします。 Excelで、Book1.xlsというブックの中の セルA1 に入力されている内容を含めた名称のブックを開き、そのブックをアクティブにする方法を教えてください。 現在は、 Workbooks.OpenFileName:="C:\Users\0000データ\" & Range("A1").Value & ".xls" となっていて、Book1のセルA1の内容と同じ名称のBookを0000データのファイルの中から選んで開くようにはなっています。 が、セルA1の内容を含む名称のBookを開くようにしたいのですが、できません。 例えば、Book1のセルA1がAAAという内容ならば、AAA田中.xlsを開く。(ちなみに、AAA斉藤など、AAAの部分が同じで後者が違うというようなBookはありません。でも、AAAやBBBの後者の文字は変動します。) その後、Book1.xlsの内容をコピーしてAAA田中.xlsの方に貼り付けをしたりする作業をしたいのですが、その都度AAA田中.xlsのBookをアクティブにするために、Windows("AAA田中.xls").Activateとしてしまうと、次にBBB吉田.xlsの作業をするなどとなった場合に使えませんので、この部分も、Book.xlsのセルA1の内容を利用して設定したいです。 どうか、よろしくお願いします。

専門家に質問してみよう