• ベストアンサー
  • すぐに回答を!

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

共感・応援の気持ちを伝えよう!

  • 回答数1
  • 閲覧数3129
  • ありがとう数2

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

  • ベストアンサー
  • 回答No.1
  • 1050YEN
  • ベストアンサー率69% (477/687)

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

共感・感謝の気持ちを伝えよう!

質問者からのお礼

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

関連するQ&A

  • Excel VBAで別のブックからユーザーフォームの閉じる

    Excel VBAで別のブックからユーザーフォームの閉じたいのですが うまくいきません。 教えてください。 Private Sub CommandButton2_Click() Application.Visible = False Unload Workbook.("材料リスクマップ検索Ver2.xls")UserForm3・・・・※ Workbooks.Close userform3:=ThisWorkbook.Path & "あああ.xls" Workbooks("\いいい.xls").Close savechanges:=False UserForm1.Show vbModeless End Sub ※印のところが赤字にかわります。 コマンドボタン2は、いいい.xlsにあり、フォームを閉じたいのはあああ.xlsのUserform3です。 その後、ファイル名いいい.xlsは閉じます。 コードが間違っているかと思いますが、どんな風にすればよいかわかりません。初歩的なこととは思いますがよろしくお願い致します。

  • ユーザーフォームを表示されないようにしたい

    Vista excel2007 でマクロ作成中の超初心者です。 A、B、Cのブックがあります。Bブックのみマクロをワークシートに貼り付けています。 1)Aブック(マクロ記録用)の中にある、Aコマンドボタンを押すと  BブックのBシートにジャンプします。ジャンプと同時に、Bユーザーフォームを 表示しています。 2)そしてBシートには、フォームコントロールを貼り付けており、ここをクリックするとCブックCシートに飛びます。 3)ところが、CシートにはBユーザーフォームが残ったままです。このフォームを  表示されないようにしたいのです。 4)Bシートのフォームコントロールには、次のコード記述をしてあります。       Sub Cブック Cシートへ() Dim wb As Workbook Dim ws As Worksheet Dim sh As Worksheet Dim i As Long ChDrive ThisWorkbook.Path ChDir ThisWorkbook.Path On Error Resume Next '開いて作業中の場合。 Set wb = Workbooks("CCC.xls") On Error GoTo 0 If wb Is Nothing Then Set wb = Workbooks.Open(ThisWorkbook.Path & "\CCC.xls") End If Worksheets(1).Select End Sub どうかよろしくお願いします。 

  • エクセル VBA ユーザーフォームの表示

    excel2000にてシートのB列のみで65行目以下をWクリックするとユーザーフォームが表示されるというコードを教えてください。 以下は調べたりした結果のコードです。B列をWクリックすると表示される状態です。 B60とかをクリックしても表示されないようにしたいです。 Worksheetのコード Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Cancel = True If Target.Column = 2 Then 'B列なら   行 = Target.Row '行番号を取得する   UserForm1.Show 'ユーザーフォームを表示する End If End Sub 標準モジュールのコード Option Explicit Public 行 As Variant '行番号 Sub auto_open() Load UFnyuuryoku 'ユーザーフォームをメモリに読み込む End Sub ご存知の方よろしくお願いします。

  • エクセルVBAでパスの¥マークについて

    このマクロを記述したBOOKと同じフォルダー内にある、シート001.xls を開くマクロです。 同一フォルダーにあるのですから、このような記述になると思います。 Sub kakunin1() Workbooks.Open (ThisWorkbook.Path & "\" & "シート001.xls") End Sub しかし、以下の3つはすべてシート001.xls を開くことができました。 Sub kakunin2() Workbooks.Open (ThisWorkbook.Path & "\" & "\" & "シート001.xls") End Sub Sub kakunin3() Workbooks.Open (ThisWorkbook.Path & "\" & "\" & "\" & "シート001.xls") End Sub Sub kakunin4() Workbooks.Open (ThisWorkbook.Path & "\" & "\" & "\" & "\" & "\" & "\" & "シート001.xls") End Sub パスの¥マークは階層をあらわすのだと思っていましたがいくつ重ねてもなぜ開くのでしょうか?非常に初歩的な質問だと思いますが、ご教示いただければ幸いです。

  • ExcelのVBAでWEBページを開くのが遅い

    よろしくお願いいたします。 現在社内システムのデータをExcelに落とすVBAを作っています。 単純に、 sub test () URL = "http://..." Dim xls As Workbook Set xls = Application.Workbooks.Open(URL) end sub のようなものを作成して実行したのですが、 Set xls = Application.Workbooks.Open(URL) の所で50~60秒ほど時間がかかってしまいます。 もう少し早くする方法はないのでしょうか?

  • VBAでフォルダにあるエクセルファイルを開く

    こんにちは このコードがうまく動かないのですが、 どこがいけないのかわからなく助けてください。 なおフォルダの中には******データ.xlsと言うファイルがあり、アスタリスク部分は日付が不規則に変化して上書きされるのです。 このファイルを開くマクロを作りたいのですが。 うまく行きません。 よろしくおねがいします。 Sub excelopen() ' ' Dim エクセル As String 'エクセル = Dir(ActiveWorkbook.Path & "\*データ.XLS") If エクセル = "" Then Exit Sub エクセル = ActiveWorkbook.Path & "\" & エクセル Workbooks.Open Filename:=エクセル End Sub

  • Excel VBA ステップインが途中で通常実行になってしまう

    VBEでF8キーを一回ずつ押して一行ずつステップインでコードを実行していくと、 Workbooks.openの行を実行した途端、 それ以下のすべての行が通常実行されてしまいます。 すべての行をステップインで実行するにはどうすればよいのでしょうか。 例)Workbooks.Openの行でF8を一回押すと、すべて通常実行されてしまう。   (2行目以下も一行ずつ動作を確認したい) ---- Sub test() Workbooks.Open ("C:\test.xls") Range("A1").Value = 1 Range("A2").Value = 2 Range("A3").Value = 3 End Sub ---- よろしくお願いいたします。

  • ファイルを開くと同時にユーザフォームを表示させたい

    Excelでファイルを開いたとき、自動的にユーザフォームを表示させるにはどのようにするのでしょう。下のコードを標準モジュールに書きました。「オブジェクトが必要です」のエラーメッセージが出てしまいます。 何を変えればいいのかお教えください。(Excel2002) Sub Auto_Open() UserForm1.Show End Sub

  • VBAでファイルを閉じる時に、他のエクセルファイルを閉じるには?

    VBAで、 Private Sub Workbook_Open() Workbooks.Open FileName:="バス時刻表.xls",ReadOnly:=True End Sub で、バス時刻表.xlsを自動的にオープンした後、 閉じる時に、 Private Sub Workbook_BeforeClose(Cancel As Boolean) Workbooks("バス時刻表.xls").Close End Sub で記述したら、エラーとなります。 どのようにすればいいのでしょうか? よろしくお願いします。

  • Excel VBAでユーザーフォームだけ表示したい

    Excel VBAでユーザーフォームを作成し、ファイルを起動時にSheetを非表示にしてユーザーフォームのみ表示させるようにしました。 そうしたところ、 (1)実行ボタンをクリックすると作成されるExcelファイルも表示されなくなる (2)終了ボタンをクリックするとユーザーフォームを含むExcelファイルだけが閉じるのではなく、Excelのアプリ自体が終了してしまう(実行ボタンで作成したExcelファイルは表示したままにしたいのに閉じてしまう) という現象になってしまいました。 某書籍を参考にしてコードを書いたのですが、なぜかこのようになってしまいました。 ※「★」が書籍に指示があった箇所です。 <ThisWorkbook> Private Sub Workbook_Open() Application.Visible = False '★ myForm.Show '★ myForm.MultiPage1.Value = 0 'マルチページ構成のため End Sub Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) '========== [×]ボタン,[Alt]+[F4]キーを無効にする ========== Dim msg As String, title As String msg = "[画面を閉じて終了する]ボタンから終了してください。" title = "終了方法" Dim res As Integer Select Case CloseMode Case vbFormControlMenu res = MsgBox(msg, vbOKOnly + vbCritical, title) Cancel = True End Select ActiveWorkbook.Save '★ Application.Visible = True '★ Application.Quit '★ End Sub 実行したいのは、 (1)ユーザーフォームを含むExcelファイルを起動したときは、起動時にユーザーフォームだけが表示されるようにしたい  ※ワークシートを非表示としたい (2)「実行」ボタンをクリックすると、プログラムが実行されExcelファイルが新規で作成され表示される  ※上記で記載した「★」の部分をコードをコメントアウトしてユーザーフォームから実行ボタンをクリックすると、プログラムが実行され正常にExcelファイルが新規で作成されることは確認済みです。 (3)ユーザーフォームが閉じても、ユーザーフォームのExcelファイルのみ閉じ、新規で作成されたExcelファイルは閉じない。  ※実行ボタンをクリックして新規ファイルを作成しなかったり、他にExcelファイルがなかった場合は、Excelは終了する。 それとあわせて、 (1)を実行できた場合に、再度コードを編集する時はどうしたらExcelの画面が表示できるのか教えて下さい。  ※それとも表示できないのでしょうか? 作成締め切りが迫っていて焦っています。 お知恵のある方どうかお力添え下さい。 よろしくお願い致します。