• 締切済み

ExcelVBAで指定時間に自動で終了ボタンを押す

Excel2003を使用しております。 とあるExcelファイルを開くと、フォームを開く設定にして有ります。 朝の8時にフォームの終了ボタンの処理を自動で行いたいので、コードを追加しました Private Sub Workbook_Open() Worksheets("シート1").Activate Range("A1").Select frmテスト.Show vbModeless Application.OnTime TimeValue("08:00:00"), "cmd終了" '←追加したコード End Sub frmテストのフォームにあるコードはこんな感じです Private Sub cmd終了_Click() コードたくさん~ End Sub 朝の8時にfrmテストのフォームにある、終了ボタンのコードを実行させたいのですが、8時になるとエラーが出ます。 マクロ "C\Documents and Setting\ユーザー名\デスクトップ\ファイル名.xls'!cmd終了'が見付かりません。 と、表示されます。 宣言の仕方が悪いのでしょうか?

みんなの回答

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.2

#1、cjです。思い出したことがあったので追加レスします。 現在の記述をそのままに近い形で活かして、短手数で実現する方法です。 裏ワザとして、CommandButton コントロールの隠しプロパティを使います。   frmテスト.CommandButton1.Value = True という記述で   Private Sub cmd終了_Click() を呼び出します。 手順としては、標準モジュールにプロシージャ(1行コード)を追加し、 OnTime メソッドに指定するプロシージャ名を変更するだけです。 一般にあまり知られていない手法ですし、 誰も動作を保証してくれないでしょうから、 以後のメンテは自分ひとりでやる決意が必要ですが、 それでも宜しければ、当座、簡単に済ませられます。 ' ' ===== ThisWorkbook モジュール ====== Private Sub Workbook_Open()   Worksheets("シート1").Activate   Range("A1").Select   frmテスト.Show vbModeless   Application.OnTime TimeValue("08:00:00"), "Module1.ClickFrmBtn"  End Sub ' ' ===== frmテスト (UserForm モジュール) ====== Private Sub cmd終了_Click()   コードたくさん~(そのまま変更なし) End Sub ' ' ===== Module1 (標準 モジュール) ====== Private Sub ClickFrmBtn()   frmテスト.CommandButton1.Value = True End Sub ' ' ===== ====== ====== ====== ====== ======

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.1

こんにちは。 UserFormモジュール(クラス)の(イベント)プロシージャを他のモジュールから呼び出す ということになるのでしょうけれど、 私としてはやったことない考えたことない課題ですし、有意な情報に辿りつくこともなかったので、 参考回答としての私見になりますれど。 UserFormの場合は、他のクラスモジュール(ThisWorkbookやSheet)とは違って、 呼び出されて(読み込まれて)初めてインスタンスを持つ(存在する)ので、 配下のプロシージャを、他のモジュールから呼び出すことは (配下のマクロをアプリケーションのスケジュールに渡すことは) 出来ない、と考えた方がいいんじゃないでしょうか。 対処としては、 「複数の契機から呼び出される共通の処理は、標準モジュールに書く」 というような教科書的な設計が、例として挙げられます。 ' ' ===== ThisWorkbook モジュール ====== Private Sub Workbook_Open()   Worksheets("シート1").Activate   Range("A1").Select   frmテスト.Show vbModeless   Application.OnTime TimeValue("08:00:00"), "Module1.FrmCloseSeq"  End Sub ' ' ===== frmテスト (UserForm モジュール) ====== Private Sub cmd終了_Click()   Application.Run "Module1.FrmCloseSeq" End Sub ' ' ===== Module1 (標準 モジュール) ====== Private Sub FrmCloseSeq()   コードたくさん~ End Sub ' ' ===== ====== ====== ====== ====== ====== 「コードたくさん~」と記された処理群は、  cmd終了_Click イベント と  Workbook_Open イベント(OnTime メソッドを介す) と、 2つの契機(イベント)から共通で呼び出されているという見方ができます。 通常、こういった場合は、共通の処理を 標準モジュールのプロシージャに纏めて記し、 それぞれのイベントから標準モジュールのプロシージャを呼び出すようにします。 注意点は2つ。どちらも標準モジュールの記述について、   1■親オブジェクト(frmテスト)を正しく指定すること。   2■UserForm が読み込まれていない(未Load|既UnLoad)場合のエスケープ。 1■ UserForm モジュールでは、   親オブジェクトを指定しない書き方 例: TextBox1.Value = ""   Me キーワードで親オブジェクトを指定する書き方 例: Me.TextBox1.Value = ""   UserForm オブジェクト(クラス)を指定する書き方 例: frmテスト.TextBox1.Value = " など主に3通りの書き方が可能ですが。 標準モジュールの記述として書き換える時には、   frmテスト.TextBox1.Value = "" のように、親オブジェクト(クラス)を指定する必要があります。 (大抵は   With frmテスト     .TextBox1.Value = ""     コードたくさん~   End With  のようにWith フレーズで纏めて書くことが多いです。) 2■ しかし、UserForm が読み込まれていない(ユーザー操作で既に閉じられている等)時に、 UserForm オブジェクト(クラス)を呼び出してしまうと、 (例えば、 frmテスト.TextBox1.Value = "" を実行するなど) そこで、UserForm があらためて読み込まれてしまい、 Initialize イベントなどに書かれた処理が実行され、 思わぬことになる場合もあるので、注意する必要があります。 これを回避するには、UserForm オブジェクト(クラス)を呼び出す前に、 UserForm が読み込まれているかどうかを 事前にチェックして条件分岐する必要があります。 UserFormがひとつしかない場合ならば、   If UserForms.Count > 0 Then     コードたくさん~   End If とか、   If UserForms.Count = 0 Then Exit Sub     コードたくさん~ とか。 UserFormが複数ある場合は、   For i = 0 To UserForms.Count - 1     If UserForms(0).Name = "frmテスト" Then Exit For   Next i   If i = UserForms.Count Then Exit Sub     コードたくさん~ とか。 (※ここら辺の対応はExcelのバージョンによる違いが大きいです。) ■■ 以上は一例です。 イベントプロシージャを他のプロシージャから呼び出すこと、 についてはネガティブな意見がわりと多いと思います。 厳禁だという人もいるでしょうし、構わないとする人もいるでしょう。 私としては、奨めませんし、自分ではやらない、ですけど、 ダメとは言わないし、特に害が無さそうならばお手伝いすることもあります。 ただ、質問者さんご自身が、どうしようか迷うようでしたら、 標準モジュールを使っていく方が、先々メンテナンスが楽になるという意味で お奨めです。 とりあえず、以上です。何かあれば補足欄にでも書いてみてください。

関連するQ&A

  • フォームのボタンからのみexcelを終了したい

    おねがいします。 都合上、フォームのボタンからだけexcelを終了したのです。 Private Sub CommandButton1_Click() Application.DisplayAlerts=False Application.Quit End Sub それに伴い、 右上のexcelのxボタン、シートのxボタンを無効化または非表示にしたいです。 Private Sub Workbook_BeforeClose(Cancel As Boolean)      If CloseMode = 0 Then     Cancel = 1   End If End Sub これで、エクセルxボタンは無効になりましたが、 フォームからの終了も出来なくなってしまいました。 フォームからのみ終了する方法を教えてください。

  • エクセルVBA

    VBAの素人です。 以下のようなVBAを実行しようと、何とか形にしました。 単独のBOOKではうまくいくのですが、同時に他のBOOKを開くと 「インデックスが有効範囲にありません」とエラーになります。 エラー箇所は、With Sheets("Sheet1").Range("B1")部分です。 修正をご教示頂ける方、何卒よろしくお願い致します。 全くVBA無知なのにすみません。 Private Sub Workbook_Open() test01 test02 Application.OnTime Now + TimeValue("00:10:00"), "終了" End Sub Sub 終了() Application.OnTime Now + TimeValue("0:00:02"), "test01", , False ThisWorkbook.Close Savechanges:=False Application.Quit End Sub Sub test01() With Sheets("Sheet1").Range("B1") .Value = Time .NumberFormatLocal = "mm:ss" End With Application.OnTime Now + TimeValue("0:00:02"), "test01" End Sub Sub test02() With Sheets("Sheet1").Range("B2") .Value = Time .NumberFormatLocal = "mm:ss" End With End Sub

  • 同じコマンドボタンからマウスカーソルがはなれたら

    フォーム上のコマンドボタンにマウスカーソルが触れたら色を付ける、 同じコマンドボタンからマウスカーソルがはなれたら 、また色を変える、 という動きをvbaで行いたいのですが、 Private Sub cmd_test_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) Me.cmd_test.BackColor = RGB(255, 180, 200) End Sub で、マウスカーソルが触れたら色を付けることはできたのですが、 マウスカーソルがそのコマンドボタンから離れたら色を変えるという動きができません。 Private Sub cmd_test_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) Me.cmd_test.BackColor = RGB(255, 255, 255) End Sub Private Sub cmd_test_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) Me.cmd_test.BackColor = RGB(255, 255, 255) End Sub Private Sub cmd_test_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) Me.cmd_test.BackColor = RGB(255, 255, 255) End Sub をしても、マウスカーソルが離れても色が白になりませんでした。

  • ExcelVBAで複数のコマンドボタンを一つに!

    ユーザーフォーム上にたくさんのボタンを配置しているのですが、 すべて同じ動作なので、一つにまとめたいです。 どのように記述したらよいでしょうか? Private Sub CommandButton1_Click() Selection.Interior.color = select_Color End Sub Private Sub CommandButton2_Click() Selection.Interior.color = select_Color End Sub Private Sub CommandButton3_Click() Selection.Interior.color = select_Color End Sub Private Sub CommandButton4_Click() Selection.Interior.color = select_Color End Sub

  • ExcelVBA:フォームの閉じるボタン「×」を消す方法

    ExcelVBAで、ユーザーフォームの閉じるボタン「×」を使用できなくなる方法は以下のコードで教わったのですが「×」自体消す方法ってあるでしょうか? Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) If CloseMode = 0 Then Cancel = 1 End Sub 回答よろしくお願いします。

  • エクセルVBA 10分後にエクセル自動終了&カウン

    どなたかご教授お願い致します。 ・エクセルの当該ブックを、起動10分後に自動終了(保存しない)させる ・開いている間は、10分のカウントダウンを「分:秒」でA1セルに表示する 以上を実行したいのですが、VBAは全く素人ですので、うまくいきません。 見よう見まねで、以下のようなことをしましたが、結局ダメでした。 何卒、よろしくお願い致します。 ThisWorkbook Workbook Open Private Sub Workbook_Open() test01 Application.OnTime Now + TimeValue("00:10:00"), "終了" End Sub 標準モジュール Module1 Sub 終了() ThisWorkbook.Close Savechanges:=False Application.Quit End Sub Sub test01() With Sheets("バックアップ").Range("A1") .Value = Time .NumberFormatLocal = "mm:ss" End With Application.OnTime Now + TimeValue("0:00:01"), "test01" End Sub

  • トグルボタンの文字色

    windows-xp、アクセス2003、を使っています。 フォームに複数のトグルボタンを置き、下記コードをつけました。 そこで質問です。 「トグルボタンがONの時は赤色、OFFの時は黒色にする。」ということをしたいです。 できましたら、下記コードに書き加えて頂けませんでしょうか。 Private Sub CH01_Click() If CH01 = -1 Then CH02 = 0 CH03 = 0 End If End Sub Private Sub CH02_Click() If CH02 = -1 Then CH01 = 0 CH03 = 0 End If End Sub Private Sub CH03_Click() If CH03 = -1 Then CH01 = 0 CH02 = 0 End If End Sub すみませんが、宜しくお願い致します!!

  • 複数のユーザーフォームをコマンドボタンにて表示・非表示させるには

    VBA勉強中のものです。 複数のユーザーフォームをコマンドボタンを使用して画面への表示切替を考えております。 例)ユーザーフォーム1,ユーザーフォーム2,ユーザーフォーム3のそれぞれにコマンドボタン1,コマンドボタン2,コマンドボタン3を作成し、   コマンドボタン1→ユーザーフォーム1を表示   コマンドボタン2→ユーザーフォーム2を表示   コマンドボタン3→ユーザーフォーム3を表示 とするようなことを考えおります。  そこで、下記のようにコードを作成したのでですが,一度表示させたユーザーフォームを再度表示させようとコマンドボタンをクリックしたら、「フォームはすでに表示させているのでモーダル表示はできません」とエラーがでてしまいます。   どなたか、どのようにしたらいいかご教授ねがいます。 サンプルコード) --------------------------------------------------- 'UserForm1のコード Private Sub CommandButton2_Click() Call UserForm2_show UserForm1.Hide End Sub Private Sub CommandButton3_Click() Call UserForm3_show UserForm1.Hide End Sub ---------------------------------------------------- 'UserForm2のコード Private Sub CommandButton1_Click() Call UserForm1_show UserForm2.Hide End Sub Private Sub CommandButton3_Click() Call UserForm3_show UserForm2.Hide End Sub ------------------------------------------------------- 'UserForm3のコード Private Sub CommandButton1_Click() Call UserForm1_show UserForm3.Hide End Sub Private Sub CommandButton2_Click() Call UserForm2_show UserForm3.Hide End Sub ------------------------------------------------------------ '標準モジュール コード Sub UserForm1_show() UserForm1.Show End Sub Sub UserForm2_show() UserForm2.Show End Sub Sub UserForm3_show() UserForm3.Show End Sub

  • Formオブジェクトについて

    Formオブジェクトに関する質問です。 ある関数にフォームオブジェクトを引数として渡してやりたいのですが、何かよい方法はありますでしょうか? 例) Private Sub cmdTest_Click(Index as Integer) Dim frm as Form If Index = 0 then Load_Test(Form 2) Else Load_Test(Form 3) End if End Sub Private Sub Load_Test(frm as Form) frm.Show frm.Label1.Caption = "TEST” End Sub

  • 100問を超えたら終了ですのメッセージをだしたい(あくせす)

    Private Sub cmd次_Click() On Error GoTo Err_cmd次_Click DoCmd.GoToRecord acForm, "F_さあやってみよう", acNext If (Forms!F_さあやってみよう!txt番号 = 100) 'これだと100問になったときにメッセージがでてしまいます。100問を終了してボタンをクリックしたら 終了のメッセージを表示したいのですが、 101という番号はありません。 Then Beep MsgBox "終了です(*^。^*)", vbInformation, "終了" End If Exit_cmd次_Click: Exit Sub Err_cmd次_Click: MsgBox Err.Description Resume Exit_cmd次_Click End Sub よろしくお願いしますm(__)m

専門家に質問してみよう