- ベストアンサー
隠していたユーザーフォームを再び表示したい
- ExcelVBAを使用してExcel2007でユーザーフォームを再表示する方法について教えてください。
- Aブックのユーザーフォーム「表紙」を閉じてBブックに移動し、作業後にAブックに戻り、ユーザーフォーム「表紙」を再表示したいです。
- ユーザーフォーム「表紙」を再表示する際に「コンパイルエラー 変数が定義されていません」というエラーが表示されます。解決方法を教えてください。
- みんなの回答 (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 以上です。