みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Excel VBAでユーザーフォームが表示されない

使用環境:Excel2007 OS:Winows Vista

A、Bの二つのExcel97-2003形式のxlsファイルがあります。
エクセルには自作のアドインを設定してあります。

(1) Aを開くと、Bを読み取り専用で開きます
(2) Bを開いたら、アドインのモジュールを呼び出します。
(3) アドインからAを保存せずに閉じさせ、Bのデータを使用しフォームを表示させます。
↑の(3)のフォームを表示部分でエラーも出ず、スルーされてしまい困っています。。。
Showの前までは正常に動いています。

この方法よりスマートな手法があればぜひお聞かせください。
みなさまのお力をお貸し下さい。お願いします。

以下コード
Aのコード
Private Sub Workbook_Open()
ActiveWindow.WindowState = xlMinimized
Workbooks.Open "B.xls", ReadOnly:=True" ←(1)
Workbooks("B.xls").Activate
Application.Run ("'アドイン.xla'!Module_関数.Admin") ←(2)
End Sub

アドインのコード
Public Sub Admin()
Workbooks("A.xls").Close SaveChanges:=False ←(3)
UserForm1.Show vbModal ←問題部分
End Sub

投稿日時 - 2013-05-20 10:47:28

QNo.8096431

すぐに回答ほしいです

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

-----------------------
現在うまく行かない理由
-----------------------
[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を閉じる
というような流れにした方が、機能を簡潔に出来るかもしれませんね。

投稿日時 - 2013-05-20 17:54:26

お礼

ありがとうございます!
サンプルマクロを仕様に合わせて入力したところ、こちらの意図したとおりに動いてくれました。
なぜタイマーを使うのだろう?など分からないこともありますが。。。
本当にありがとうございました。

投稿日時 - 2013-05-22 09:08:50

ANo.1

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問