• ベストアンサー

エクセルVBA:他シートを選択するとフォームを閉じたい

教えてください。 シート1ではフォーム1のみを使用、シート2ではフォーム2のみを使用、シート3ではフォーム3のみを使用します。 他シートを選択した時、現在使用中のフォームを閉じて、対応するフォームを表示させたいのですが、どうすればよろしいでしょうか。

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

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

VBAでそれぞれのsheetのイベントで Private Sub Worksheet_Deactivate() 'そのシートのフォームを閉じる End Sub Private Sub Worksheet_Activate() 'そのシートのフォームを開く End Sub の様にすれば、簡単でわかりやすいかと思います。 sheetがアクティブになったかどうかは workbookのイベントでもわかりますが、 その時は、シートの区別をつけないといけません。 場合によっては、その方がコードが少なくて済むかもしれません

tsubasa2003
質問者

お礼

早速のご回答ありがとうございます。基本を知らないまま、今まで作業してきたので、sheetイベントを設定するということがようやくわかり、とても嬉しいです。 ところで、今まで標準モジュールにすべてを記述していたのですが、単独のシートで納まるものであれば、sheetイベントに移し変えた方が良いのでしょうか?

その他の回答 (5)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.6

#2です。 私は >ただFormを閉じないと、シートが選択できないので 不完全かも知れません。 と書きました。 この問題が#3さんの >各UserFormのプロパティーのShowModalをFalseに設定してください を解決し様とするものです。実際やって見れば判ります。 >「UserFormのプロパティーのShowModalをFalseに」というのは、どのような事のためにでしょうか?Hideとの関連ですか?と#3でお礼に書いておられたので。 ●#2のお礼の >標準モジュールに記述するのとWorksheetイベントに記述するのとは、どのように分けて考えるものなのでしょうか? (1)標準モジュール 実行は、実行する人の実行起動により実行される。 ただ(2)の中にも組み入れられる。 (2)イベントプロセジュアー イベントという、「クリックなどマウスの動作」や「マウスの動作によって引き起こされる(例 フォームが読みこまれるなど)事象」や時間経過などをキッカケとして動作する。キーボード入力関連のキッカケもある。実はOSに通知(ウインドウズメッセージ)が行っているすべてのコンピュタ関連の事象うち、代表的な一部をVBAプログラマに開放・提供している。

tsubasa2003
質問者

お礼

詳細ありがとうございます。よく考えながら振り分けて試してみます。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.5

>今まで標準モジュールにすべてを記述していたのですが… それぞれのイベント毎にコードを記述するとコードが分散し見通しが悪くなるというデメリットがありますが そのイベントで処理する部分はそのイベント部分で書いた方がいいと思います。 全体で共通的に使用できる部分は、 手続きや関数として、標準モジュールに書いておくのがいいと思います。 もちろん、標準モジュールに全部書いてもかまいません。 その分割度合いは、「好み」だと思います。 ただ、 シートのグローバル部分に書くのは、いいですが、 シートのイベント部分に何もかも(必要のない部分まで?<変な言い方ですね)書くのはいただけないと思います。イベントの起こる頻度にもよると思いますが。

tsubasa2003
質問者

お礼

なるほど。ありがとうございます。

  • big_fool
  • ベストアンサー率22% (43/193)
回答No.4

>「UserFormのプロパティーのShowModalをFalseに」というのは、どのような事のためにでしょうか?Hideとの関連ですか ShowModalプロパティーをFalseにするとUserFormを開きながらExcelの他の機能も利用できます したがってUserFormを開きながらっでも他のシートを選択出来るようになります TrueにするとUserFormを閉じないと他の操作が出来ません

tsubasa2003
質問者

お礼

そうなんですか。ありがとうございます。

  • big_fool
  • ベストアンサー率22% (43/193)
回答No.3

シート1のイベントにたとえば Private Sub Worksheet_Activate() UserForm1.Show End Sub Private Sub Worksheet_Deactivate() UserForm1.Hide End Sub とするとShhet1がアクティブになったとき UserForm1が開き Shhet1が非アクティブになったとき UserForm1が閉じる 各シートイベントに記入すればよいと思います ただ各UserFormのプロパティーのShowModalをFalseに設定してください

tsubasa2003
質問者

お礼

ありがとうございます。 「UserFormのプロパティーのShowModalをFalseに」というのは、どのような事のためにでしょうか?Hideとの関連ですか?それともほかの・・・

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.2

ThisWorkbookのイベントに Private Sub Workbook_SheetActivate(ByVal Sh As Object) Select Case Sh.Name Case "Sheet1" MsgBox "Sheet1" UserForm1.Show Case "aaa" MsgBox "aaa" UserForm2.Show Case "Sheet3" MsgBox "Sheet3" UserForm3.Show End Select End Sub を作ってみました。 ご参考に。 ただFormを閉じないと、シートが選択できないので 不完全かも知れません。

tsubasa2003
質問者

お礼

ありがとうございます。なるほど、こういう方法もあるのですね。今後に活用できそうです。ところで、標準モジュールに記述するのとWorksheetイベントに記述するのとは、どのように分けて考えるものなのでしょうか?

関連するQ&A