[[20090202162540]] 『フォームの表示』(hiro2) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『フォームの表示』(hiro2)

 また、ご指導お願いします。
 現在、トップメニューとして、「集計テスト.xls」にUserForm1を
 作成しています。その他、「1月.xls」「2月.xls」…「12月.xls」と12個の
 ブックが存在します。すべて、Dドライブの集計テストフォルダにあります。
 UserForm1には<1月>〜<12月>までコマンドボタンをもうけ、その月をクリック
 すればその月のファイルが開き、作業が終わればそれぞれの月から、
 また「集計テスト.xls」のブックを開きUserForm1を表示するという設定を
 考えています。

 Sub Auto_Open()
 UserForm1.Show
 End Sub
 で起動してフォームを開く。
 次に、
 Private Sub CommandButton1_Click()
  Workbooks.Open Filename:="D:\集計テスト\1月.xls"
  Workbooks("集計テスト.xls").Close
 End Sub
 「1月.xls」のブックを開く。

 作業完了後、また下記のようにして「集計テスト.xls」のブックを開き
 UserForm1を表示といきたいのですが、

 Sub tojiru()
  Workbooks.Open Filename:="D:\集計テスト\集計テスト.xls"
   Workbooks("1月.xls").Save
   Workbooks("1月.xls").Close
  UserForm1.Show
 End Sub
 ここで、ユーザーフォームUserForm1がうまく表示されません。
 よろしくご指導をお願いします。 [OS:XP Office:2000及び2003]


 Sub tojiru()
   Workbooks.Open ThisWorkbook.Path & "\集計テスト.xls"
   Application.OnTime Now(), "集計テスト.xls!auto_open"
   ThisWorkbook.Close True
 End Sub

 こんなコードで作動すると思いますが・・・。
 私なら、このようなプログラム構造になる仕様にはしませんけどね!!

 ichinose


 ichinoseさま

 返事が送れて申し訳ありません。上記のコードを実際に動かして
 みて、うまくいきました。ありがとうございました。

 ところで、マクロ勉強中で質問があるのですが、

 Application.OnTime Now(), "集計テスト.xls!auto_open" の行ですが、

 Application.run としないでApplication.OnTime Now(), とされたのは
 どういうことでしょうか?また、違いは何なんでしょうか?
 もしよろしかったらお教えください。

 「私なら、このようなプログラム構造になる仕様にはしませんけどね!!」
 も気になります。  (hiro2)


  ichinoseさま

 追伸です。ときどき「コントロールが表示されていない、利用できない、
 またはフォーカスを持てないため、そのコントロールにフォーカスを移す
 ことができません。」というダイアログが表示されます。
 これをOKするとちゃんとフォームは表示されるのですが、どういうことでしょう?

                                                           (hiro2)


 >どういうことでしょうか?また、違いは何なんでしょうか?
 に関しては、
 Application.Runでは Userform1が表示された時点で1月.xlsというブックが残ってしまうからです。
 尚、↑Userform1がモーダルモードの場合の話です。
 投稿からモーダルモードだと想定しましたが、モーダレスの場合は、Runメソッドでも良いですね!!

 >ダイアログが表示されます。
 に関しては、再現が出来ません。初めてみるメッセージです。
 もう少し、詳しい再現手順を探れませんか?

  ちょっと、大きいプログラムの作成時に私もブックを分けることがあります。
 このようなときにバランスの悪いインターフェースコードを記述すると、思わぬエラーが発生することが
 ありました(今回のメッセージとは、違いますが・・・・)。

 >「私なら、このようなプログラム構造になる仕様にはしませんけどね!!」
 私なら、集計テスト.Xlsというブックは、常駐ブックにしておきます。
 見せたくないなら、非表示にして置けばよいです。

 Private Sub CommandButton1_Click()
  Workbooks.Open Filename:="D:\集計テスト\1月.xls"
  Workbooks("集計テスト.xls").Close
 End Sub

 このコード、

 Workbooks.Open Filename:="D:\集計テスト\1月.xls"

 本来は、同じレベル内(Useform1のモジュール内)でCloseメソッドが記述されていなければ、
 コードを解析する側から見ると
 非常にフラストレーションがたまるコードです(どこにあるのかって、探さなければならない)。
 これに関して私の意見を記述し、分かってもらうためには、ひとレポート記述しなければならないので
 控えますが、集計テスト.XLSを閉じたり、開いたりしない仕様にすれば、問題は解決すると思いますけどねえ

 まっ、でもこの事象は、興味深いメッセージなので、これはこれで色々試してみる価値あり です。

 試しに 

 Sub tojiru()
   Workbooks.Open ThisWorkbook.Path & "\集計テスト.xls"
   Doevents
   Application.OnTime Now(), "集計テスト.xls!auto_open"
   ThisWorkbook.Close True
 End Sub

 にしてみるとか・・・。再現が出来ないので、本当にあてずっぽですが・・・。

 ichinose@今日はちょっと寝坊したので、時間がない


 ichinoseさま

 Doeventsを加えても結果は同じでした。
 時々、ダイアログが出るといいましたが、
 毎回出ます。(Doeventsがあってもなかっても)
 どうも「集計テスト.xls」を開いて
 ThisWorkbook.Close True が働いた後ですね。
 「1月.xls」は閉じてからですので
 そしてダイアログをOKすれば、フォームが表示されます。

 すぐ返事がかえせなくてすみません。この後も仕事ですので
 よければ、また明日お聞かせください。勝手いってすみません。
                        (hiro2)


 ichinoseさま

 ただいま、仕事から帰ってきました。
 あの後すぐ再度コードを見直して
 自分のチョンボに気づきました。
 すぐに返事が出来なくてすみませんでした。

 本当に申し訳ありません。m(__)m
 「1月.xls」のブックを開く時に、
 Private Sub CommandButton1_Click()
  Workbooks.Open Filename:="D:\集計テスト\1月.xls"
  Workbooks("集計テスト.xls").Close ←ここ
 End Sub

 ’私なら、集計テスト.Xlsというブックは、常駐ブックにしておきます。
 見せたくないなら、非表示にして置けばよいです。’とアドバイスをいただいていたので、
 自分でも知らぬ間に「←ここ」のところを
 UserForm1.hide と書き換えてしまっていました。
 で「集計テスト.xls」に戻ろうとして「←これ」ではおかしくなります。

  Sub tojiru()
   Workbooks.Open ThisWorkbook.Path & "\集計テスト.xls" ←これ
   Doevents
   Application.OnTime Now(), "集計テスト.xls!auto_open"
   ThisWorkbook.Close True
 End Sub
 ダイアログ出現の原因はおそらく「←これ」です。
 本当にすみませんでした。
 また、質問にも答えていただき大いに勉強になりました。
 機会があればまたご指導お願いします。    (hiro2)


 私が簡単なテストブックで試した限りでは、

 >UserForm1.hide と書き換えてしまっていました。

 では、投稿されたようなメッセージは表示されませんでした(Win2000&Excel2002)
 本当にこれが原因ならば良いのですが・・・。

 原因が他にあるのなら、hiro2さんと私を含めた閲覧者が問題になっている
 現象を再現できないと実はお話になりません。
 そのために、hiro2さんと閲覧者が同期をとる記述をしようかと考えていましたが、
 ちょっと様子をみます。

 仰っているとおり、Userform1.Hide だけの変更では、集計テスト.XLSの常駐と言う仕様は
 完成しません。上記例、うまく作動する、しないとは別に、一度常駐仕様でも検討してみてください。

 ichinose


 ichinoseさま

 わたしの拙いコード及び設定で妙な現象を起こしているのでしょうか?
 おそらく、わたしのしていることなのでごく単純なことだとおもいますが、
 参考になればと思います。
 よろしかったら、検証をおねがいします。

 まず、D:\集計テスト\集計テスト.xls を起動します。

 Sub Auto_Open()
 UserForm1.Show
 End Sub

 フォーム(UserForm1)が開きます。
 次に、フォーム上のコマンドボタン(CommandButton1)
 をクリックする。

 Private Sub CommandButton1_Click()
   Workbooks.Open Filename:="D:\集計テスト\1月.xls"
   Workbooks("集計テスト.xls").Close ←ここ UserForm1.Hide にするとダイアログが
 End Sub

 D:\集計テスト\1月.xls が開き、D:\集計テスト\集計テスト.xls が閉じます。

 もう一度以下の手順でユーザーフォームを表示。

 (ここで、マクロの登録を利用して、ユーザー設定の新規ツールバーにボタンを
  作成して利用しています。ひょっとしてこれが原因なら説明不足でした。)

 Sub tojiru()
   Workbooks.Open ThisWorkbook.Path & "\集計テスト.xls"
   DoEvents
   Application.OnTime Now(), "集計テスト.xls!auto_open"
   ThisWorkbook.Close True
 End Sub

 現象確認しました。と言ってもメッセージ内容は「アプリケーション定義エラー」というメッセージでしたが、
 エラーメッセージが表示されるタイミングは、正にhiro2さんが記述されたものと同じです。

 メッセージが違うのは、おそらくはExcelバージョンの違いかと思われます。

 原因も御推察どおり、
 >ユーザー設定の新規ツールバーにボタンを作成して利用しています。

 これが起因しています。直接マクロを 「ツール」---「マクロ」---「マクロ」から、マクロ名指定の
 実行では、エラーメッセージが表示されませんでした。

 やはり、集計テスト.xlsを常駐させる方法を取ってみては如何ですか?

 一連の処理を行うVBAコードは、全て集計テスト側に記述します。

 集計テスト.xlsの標準モジュールに

 '=================================================================
 Option Explicit
 Sub auto_Open()
    UserForm1.Show
 End Sub

 UserForm1のモジュールには、

 '=================================================================
 Option Explicit
 Private bknm As String
 Private Sub CommandButton1_Click()
    Dim wn As Window
    With Workbooks.Open(ThisWorkbook.Path & "\1月.xls")
       bknm = .Name
    End With
    Me.Hide
    For Each wn In ThisWorkbook.Windows
       wn.Visible = False
       Next
    Call mk_cmdb
 End Sub
 '==========================================================================
 Private Sub UserForm_Activate()
    On Error Resume Next
    If bknm <> "" Then
       ThisWorkbook.Windows(ThisWorkbook.Name).Visible = True
       Workbooks(bknm).Close True
       bknm = ""
       Application.CommandBars("閉じる").Delete
    End If

 End Sub
 '============================================================================
 Sub mk_cmdb()
    On Error Resume Next
    Application.CommandBars("閉じる").Delete
    With Application.CommandBars.Add("閉じる", msoBarTop, , True)
        .Visible = True
        With .Controls.Add(msoControlButton, , , , True)
           .Style = msoButtonCaption
           .Caption = "閉じる"
           .OnAction = ThisWorkbook.Name & "!auto_open"
        End With
    End With
 End Sub

 以上です。コマンドバーも集計テスト.xls側で作成しますから

 1月.XLS側にコマンドバーを添付しているのなら、削除してください。

 

 この方法だとエラーメッセージは表示されませんでした。
 試してみてください

 ichinose


 ichinoseさま

 ご指導ありがとうございます。
 さっそく、試してみたいと思います。
 疑問点があればまた質問させていただくかもしれません。
 その節はよろしくお願いします。

 (hiro2)


 ichinoseさま

 これは、すごいです。
 完璧に動いています。
 しかも、データもちゃんと更新されているし、
 はあー!って感じです。

 あつかましくも質問が1つあります。見たところ1月のデータ
 がどこで更新(保存)されているかわからないのですが、
 コードを見ても。すみません。     (hiro2)

 >見たところ1月のデータがどこで更新(保存)されているかわからないのですが、

 Private Sub UserForm_Activate()
    On Error Resume Next
    If bknm <> "" Then
       ThisWorkbook.Windows(ThisWorkbook.Name).Visible = True
       Workbooks(bknm).Close True
       ' ↑ここで「1月.xls」は、更新後、閉じています
       'CommandButton1_Click() 内で1月.xlsを開いた直後、ブック名を変数bknmにセットしています。
       'Me.Hideというのは、ユーザーフォームを非表示しているだけでメモリー上には存在しています。
       'よって、そのユーザーフォームの中に宣言したbknmという変数は、再びユーザーフォームが表示に
       '設定されたとき、中の変数データは変わっていません。
       'つまり、bknmには、「1月.xls」という文字列が格納されていることになります。
      bknm = ""
       Application.CommandBars("閉じる").Delete
    End If

 End Sub

 ichinose 

 ichinoseさま 

 本当にありがとうございました。
 助かりました。(感謝です)
 また、機会があればご指導お願いします。

 (hiro2)


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.