[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『フォームの表示』(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.