- ベストアンサー
Excel VBAでユーザーフォームが表示されない
- Excel VBAでユーザーフォームが表示されずエラーが発生している場合、AとBの二つのExcel97-2003形式のxlsファイルが関与している可能性があります。
- Aを開くとBを読み取り専用で開き、Bを開いたらアドインのモジュールを呼び出すように設定されています。
- しかし、アドインからAを保存せずに閉じさせ、Bのデータを使用してフォームを表示する際にエラーが発生しているようです。具体的なエラーメッセージは提供されていませんが、この問題を解決するためのよりスマートな手法を探しています。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
----------------------- 現在うまく行かない理由 ----------------------- [A.xls].Workbook_Open 【 ・A.XLSを最小化 ・B.XLSを開く [アドイン.xla].Admin 【 ・A.xlsを閉じる →→※※ [A.xls].Workbook_Openが終了 ・UserFormを表示 →→※※ 呼び出し元が終了しているので、ここまで辿り着かない 】 】 ----------- 実現方法例 ----------- [A.xls].Workbook_Open 【 ・A.XLSを最小化 ・B.XLSを開く ・アドインタイマー起動要求 [アドイン.xla].Admin 【 ・A.xlsをアドイン内部で記憶 ・タイマーを開始 】 】 [アドイン.xla].タイマー 【 ・タイマーが複数回起動しないように切断 ・アドイン内部で記憶をしているA.XLSを閉じる ・UserFormを表示 】 ※~~~以下サンプル 開始~~~ '----------------- '-- A.XLS '-- ThisWorkbook '----------------- Option Explicit Private Sub Workbook_Open() Dim l_xlsData As Workbook ActiveWindow.WindowState = xlMinimized Set l_xlsData = Workbooks.Open("C:\B.xls", ReadOnly:=True) l_xlsData .Activate Call Application.Run("'アドイン.xla'!Module_関数.Admin", Me) End Sub '----------------- '-- アドイン.xla '-- Module_関数 '----------------- Option Explicit Private Declare Function SetTimer Lib "USER32" (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long Private Declare Function KillTimer Lib "USER32" (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long Private m_xlsBook As Workbook Private m_lngTimerID As Long Public Sub Admin(p_xlsBook As Workbook) Set m_xlsBook = p_xlsBook m_lngTimerID = SetTimer(0&, 31000&, 0&, AddressOf TimerProc) End Sub Public Sub TimerProc() 'タイマーが複数回起動しないように切断 KillTimer 0&, m_lngTimerID 'アドイン内部で記憶をしているA.XLSを閉じる Call m_xlsBook.Close(False) 'UserFormを表示 UserForm1.Show vbModal End Sub ※~~~以上サンプル 終了~~~ ----- 補足 ----- Aの処理を ・B.xlsを開く ・アドインタイマー起動要求を発行(パラメータはB.xls) ・A.XLSを閉じる というような流れにした方が、機能を簡潔に出来るかもしれませんね。
お礼
ありがとうございます! サンプルマクロを仕様に合わせて入力したところ、こちらの意図したとおりに動いてくれました。 なぜタイマーを使うのだろう?など分からないこともありますが。。。 本当にありがとうございました。