• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:隠していたユーザーフォームを再び表示したい)

隠していたユーザーフォームを再び表示したい

このQ&Aのポイント
  • ExcelVBAを使用してExcel2007でユーザーフォームを再表示する方法について教えてください。
  • Aブックのユーザーフォーム「表紙」を閉じてBブックに移動し、作業後にAブックに戻り、ユーザーフォーム「表紙」を再表示したいです。
  • ユーザーフォーム「表紙」を再表示する際に「コンパイルエラー 変数が定義されていません」というエラーが表示されます。解決方法を教えてください。

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

  • ベストアンサー
回答No.1

こんにちは。 Aブック、Userform(表紙)モジュール Private Sub CommandButton11_Click()   Me.Hide   Workbooks.Open Filename:=ThisWorkbook.Path & "\改善案.xlsm"   Sheets(1).Select End Sub Aブック、標準モジュール Private Sub Show表紙()   表紙.Show End Sub Bブック(改善案)、Userform(UserForm1)モジュール Private Sub CommandButton2_Click() ' ' ◆↓要指定 Aブックの名前_"Book1.xlsm!Show表紙"_のようにショートネームで   Application.Run "Aブックの名前.xlsm!Show表紙"   Unload Me   Application.DisplayAlerts = False   ThisWorkbook.Close   Application.DisplayAlerts = True End Sub 基本的に、 '別のブック=別のVBProject'にあるユーザーフォームを 直接呼出し表示させる方法はVBAには用意されていません。 > すると次のエラーが表示され > 「コンパイルエラー 変数が定義されていません」 > 表紙.showの表紙が反転表示されます。 '表紙'というオブジェクト名はAブックのVBProjectでのみ有効ということです。 最も簡単な代替え策として、 '別のブック=別のVBProject'にある標準モジュール に書かれたプロシージャをApplication経由で呼出し実行させる方法があります。 BブックのCommandButton2_Clickを実行すると、1行めの記述により、 Aブックの標準モジュールのShow表紙が実行され、 AブックのUserform(表紙)を再表示します。 直接の回答としては以上です。 以下、他の部分にある潜在的な問題点を指摘しておきます。 Bブック(改善案)のUserform(UserForm1)を呼出し表示させる記述について、 トラブルになり易い例として、、 Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)   Cancel = True   UserForm1.Show End Sub のような記述だった場合(且Userformをモーダル表示する場合)は、   ThisWorkbook.Close のタイミングでエラーが発生し、Excelが落ちることがあります。 Userformのプロシージャ実行中に、呼び出し元のブックを.Closeする時は、 呼び出し元のプロシージャと呼び出し方に注意を払うようにしてください。 対策として、イベントプロシージャをEnd Subで抜けて(すべての実行を済ませて)から その後でUserformを表示するように書いておく必要があります。 以下、トラブルを回避する方法を、例として挙げておきます。 Bブック(改善案)、標準モジュール Private Sub ShowUF()   UserForm1.Show End Sub Bブック(改善案)、UserForm1の呼び出し例 Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)   Cancel = True   Application.OnTime Now, "ShowUF" End Sub 以上です。