忙しい現代人の腰&肩のお悩み対策!

現在、ユーザーフォームで入力したデータを各セルに入れてくVBAを書いています。これ自体は問題ないのですが、同時にタイマーのマクロを起動させたいのですが書き方がさっぱりわかりません。

ネットで調べて、タイマーのマクロは書けました。

タイマーのマクロというのは、特定の時間になったらユーザーフォームで打ちこんだデータのブックを送付して特定の宛先にメールするというマクロです。

このタイマーのマクロ自体は普通に動くのですが、設定した時間にユーザーフォームが開かれてるとマクロが動いてくれません。

そしてユーザーフォームは常に開かれている状態なんです。

希望としてはユーザーフォームが開かれている(入力している)時でも、はじめにメッセージボックスなどで「今からメール送信します。しばらくお待ちください。」などとメッセージを出して現状まで入力済みのデータ(ブックを)メールを送信させることが出来るのが希望です。

タイマーのマクロはWorkbook_Openに
指定時刻 = TimeValue("07:30:00")
待ち時間 = TimeValue("00:01:00")
Application.OnTime TimeValue(指定時刻), "SendMail", TimeValue(待ち時間)
  Call 次のメール送信

みたいな感じで書いてます。

ユーザーフォームが開いている状態でタイマーのマクロ(他のマクロ)を動かすのって無理なんですか?

ちなみに、不定期なタイマーの方法がわからなかったので、それもわかれば教えていただけませんか。
一定時間感覚のタイマーはあったのですが、不定期なタイマーのマクロが調べても見つからず…
タイマーのマクロを何個も書いてなんとか、一つのタイマー処理が終わったら次のタイマーマクロを呼び出すって方法を取りました。
もし、もっと簡単な書き方などあったらアドバイスお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

Ontimeの呼び出し先を次のようにしてください。


Public Sub SendMail()
UserForm1.Hide
'sendmail
UserForm1.Show
End Sub

>>不定期なタイマーの方法<<
どんなことをイメージしているのかわからないのですが
変数で指定するだけでいいと思いますが・・・
  dim tm as string
 tm= 'textboxなどから取得
 指定時刻 = TimeValue(tm)
    • good
    • 0
この回答へのお礼

早い回答ありがとうございます!
Hideなんてワザがあったんですね(笑)
ユーザーフォームを閉じるのはUnloadばかりしていてそれで閉じると入力情報も消えていたので助かりました!

不定期なタイマーは、例えば13時、14時、16時、19時、20時みたいに規則性のない時間でメールを送信(マクロ起動)をしたいのです。
時間は外部からではなく、設定しときたいのです。
現段階でその不定期な時間が決まってないのですが、これから決まるので先に作っときたいのです。
一つのマクロで実現は可能ですか?
よろしければ再度回答お願いします!

お礼日時:2009/10/07 01:35

>不定期なタイマーは、例えば13時、14時、16時、19時、20時みたいに規則性のない時間でメールを送信(マクロ起動)をしたいのです。


>時間は外部からではなく、設定しときたいのです。

Sub SendMail()
Dim v As Variant, i As Long
'・・・・
'・・・・
'・・・・
v = Array(TimeValue("07:30:00"), TimeValue("13:00:00"), TimeValue("14:00:00"), _
TimeValue("16:00:00"), TimeValue("19:00:00"), TimeValue("20:00:00"))
For i = LBound(v) To UBound(v)
If v(i) > Time Then Exit For
Next
If i > UBound(v) Then i = LBound(v)
Application.OnTime v(i), "SendMail", TimeValue("00:01:00")
End Sub
    • good
    • 0
この回答へのお礼

回答していただいてありがとうございました。

昨日、動くかテストしてみたのですが、一つ目の時間は動くのですがそれ以降が動きませんでした。

お礼日時:2009/10/12 02:03

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qエクセル VBA ユーザーフォームを閉じる

ユーザーフォームを開く時は
UserForm1.Showですが
閉じる時は?
UserForm1.Close
だとコンパイルエラーになります。
End
にするしかないですか?

Aベストアンサー

Unload Me とか Unload UserForm1 でユーザーフォームを閉じることができます。

QエクセルVBAでタイマーコントロールは使えますか

エクセルVBAでタイマーコントロールは使えますか。

エクセルVBAで、ある時刻になったらマクロを実行させたいと思っています。
無限ループの中にTIME関数で時刻を呼び出し、それをIF文で判定して、
一定時刻にマクロを実行させるものは作りましたが、CPU負荷が高く、24時間
連続で動作させることに不安を感じています。

この他に、VBのタイマーコントロールのような機能を持つオブジェクトや
便利機能等があったら教えていただけませんか。
(一応、VBで時刻管理をするプログラムを作ってそこからエクセルVBAを呼
び出す方法やタスクスケジューラでエクセルVBAを呼び出す方法、ATコマンド
等も考えていますが、可能ならエクセルVBAで閉じて処理をしたい)。

尚、私はWindowsMe+エクセル2000でVBAを作成しています。
実際にVBAを動かすのは、WinsowNT4.0サーバー+エクセル2000を予定してい
ます。

Aベストアンサー

考え方としてですが
ループとIFでのチェックではなく、

毎日一回、指定時刻に実行なら

1.初回は開始時に、現在時刻から逆算して
開始時間までの秒数を設定

2.次回からは、開始時刻がきた時、起動と同時に
次の開始時刻を計算してセット
処理したらwaitして次回を待つ。

という形にしてループとIFでの時刻監視を
一切やめてしまうことをおすすめします。

#1さんのものでも同じだと思いますが
書かれたコードを単独で実行した時には
負荷はそれほどではないと思います。
OnTimeメソッドのループは不要だと思います。
開始時刻をセット済みなので。

時刻をセットして、監視の処理(ループ)
をはずす、という処理へ変更できませんか。

質問の内容と違っていましたらお手数ですが
質問ください。

Q【Excel VBA】マクロでExcel自体を終了させたい

環境:WindowsXP、Excel2003

マクロでエクセルを終了(ブックを閉じて、アプリケーション自体も終了)させたいのですが、以下のコードではアプリケーションが閉じてくれません。

ThisWorkbook.Close
ExcObj.Quit
Application.Quit

どこか悪いところはありますでしょうか?

よろしくお願いします。

Aベストアンサー

普通に考えれば質問者のコードで上手くいきそうですが
hana-hana3さんの回答にもあるようにThisWorkBook.Closeでコード終了となりますので
Application.QuitをThisWorkBook.Closeの前にもってこないといけません。
Application.Quitはそれがあるプロシージャのコードが全て終わるまで
その実行を保留するちょと特別動作をします。

'-------------------------------------
 Application.Quit
 ThisWorkbook.Close
'-------------------------------------
 
 

QExcel VBAにて2つの処理を同時実行可能?

是非お力をお貸し下さい。
よろしくお願いします。
Windows XP
Excel2003 (VB6.0)

メイン処理が非常に時間がかかるため、フォームを表示させ
文字(Label)を点滅させて「動いている(ハングアップしていない)」ことを
使用者に伝えようとしています。

--- Form1内のコード(メイン) ---
Sub Main()

Form2.Show vbModeless

[ ~メイン処理~ ]

End Sub

--- Form2内のコード ---
Sub UserForm_Initialize()

Call Blink

End Sub

--- 標準モジュール内のコード ---
Sub Blink()

If Form2.Label1.Visible = True Then
Form2.Label1.Visible = False
Else
Form2.Label1.Visible = True
End If

Form2.Repaint

DoEvents

Application.OnTime Now + TimeValue("00:00:01"), "Blink"

End Sub


これを実行すると、メイン処理が終了した後にForm2内の文字が
点滅します。

実現したいのは「使用者が動いていることを(ハングアップしていない
ことを)確認出来る」という点です。

どうぞ よろしくお願いします。

是非お力をお貸し下さい。
よろしくお願いします。
Windows XP
Excel2003 (VB6.0)

メイン処理が非常に時間がかかるため、フォームを表示させ
文字(Label)を点滅させて「動いている(ハングアップしていない)」ことを
使用者に伝えようとしています。

--- Form1内のコード(メイン) ---
Sub Main()

Form2.Show vbModeless

[ ~メイン処理~ ]

End Sub

--- Form2内のコード ---
Sub UserForm_Initialize()

Call Blink

End Sub

--- 標準モジュール内のコード ---
Sub Blink()

If Form2.L...続きを読む

Aベストアンサー

単純に、HTMLファイルを表示するとかいうのではだめでしょうか?VBAに影響を与えることなくブラウザ側が勝手にやってくれるので、負荷は少ないように思うのですが。
的を外した回答でしたらすみません。

QエクセルVBAにおけるON TIMEメソッドの解除方法について

こんにちは。現在エクセルでフォームを使用したVBAマクロを作成中です。
内容はフォーム内のテキストボックスに制限時間を設けて文字入力を行ってもらうものです。

Sub テスト()

do until
 ・
 ・
call timeup
loop

End Sub

Sub timeup()
dim timekp as integer
'テストの開始時間をキープ

'Application.OnTime timekp + TimeValue("1:00:00"),"endform"
'1時間経過後終了を促すフォームを表示する

End Sub

Sub endform()

load userform1
userform1.show
'エクセル終了のコマンドボタンがついているフォームを表示する

End Sub

マクロは大まかに記述しましたが以上のようにすると、一度はマクロの作成が成功したように終了するのですが、ブックを開けたままでいると1時間後に自動的にuserform1が表示されてしまいます。また、ブックを閉じていても自動的にオープンし、(マクロを有効にする)をONにするとデバック状態となります。
変数のtimekpを初期化する事で凌げると思ったのですが、うまくいきません。
以前マクロのヘルプを操作している時にON TIMEメソッドを解除する方法が掲載されていたように思うのですが、探し方がマズイのか見つけられませんでした。
マクロの記述方法がマズイのでしょうか?ON TIMEメソッドを解除しない限り、いつまでもこのメソッドは効力を発揮するのでしょうか?
また、ON TIMEメソッドを解除できるメソッドや良い解決方法がありましたら入門書等を片手にマクロを作成している素人にご教授の程お願い致します。

こんにちは。現在エクセルでフォームを使用したVBAマクロを作成中です。
内容はフォーム内のテキストボックスに制限時間を設けて文字入力を行ってもらうものです。

Sub テスト()

do until
 ・
 ・
call timeup
loop

End Sub

Sub timeup()
dim timekp as integer
'テストの開始時間をキープ

'Application.OnTime timekp + TimeValue("1:00:00"),"endform"
'1時間経過後終了を促すフォームを表示する

End Sub

Sub endform()

load userform1
userform1.show
'エクセル終了のコマ...続きを読む

Aベストアンサー

>ON TIMEメソッドを解除
OnTimeのヘルプはごらんになられましたか?
expression.OnTime(EarliestTime, Procedure, LatestTime, Schedule)

Schedule にfalseを設定することで、直前の実行指定を解除することができます。
具体的には
Application.OnTime timekp + TimeValue("1:00:00"),"endform",,false
とでもすればいいです。

QExcel-VBAでタイマー処理

お世話になります。
Excel-VBAでユーザフォームを操作したいのですが、VBの場合ツールボックスにタイマーコントロールがありますが、Excel-VBAの場合ツールボックスにタイマーコントロールがありません。
タイマー処理はどうしたら良いのでしょうか?

Aベストアンサー

ActiveX タイマーコントロールを使用する方法です。

・ Timer Object(ActiveX のIetimer.ocx )のダウンロードと
 インストール等の説明が下記URLにあります。

http://kasayan86.hp.infoseek.co.jp/html/activex.htm

・フォームにタイマーコントロールを配置するには、
[ツール]-->[その他のコントロール]で「Timer Object」を選択状態に
するとツールボックスに表示になります。

フォームに配置し、プロパティの「Interval」で時間(ミリセコンド単位)を
指定します。コントロールをダブルクリックしてイベントを記述します。

これで如何でしょうか。

QVBAを時間指定で自動実行

就業時間内(9時~6時)でエクセルVBAを指定時間に自動実行させたいです。
エクセルはパソコン起動した朝に、開いておきます。(バックグラウンド)
指定時間になったらVBAを自動実行させたいのです。
指定時間は例えば、
10時11分
10時16分
10時21分 などです。最初の時間から5分間隔で実行。
こういう事はできるのでしょうか?VBAでできるのか?
それ以外の方法があるのか?よくわかりません。
詳しく教えてください。

Aベストアンサー

たとえば、こんなことか。
下記は、1度testを実行すると、15秒たつとtest1を実行し、以後10秒ごとにtest2を実行するというもの。
test1もtest2も単にmsgboxを表示するだけ。

Dim gotime1, gotime2
Sub test()

gotime1 = Time + TimeValue("00:00:15")
gotime2 = gotime1
Application.OnTime gotime1, "test1"
gotime2 = gotime2 + TimeValue("00:00:10")

While gotime2 < gotime1 + TimeValue("00:01:00")
Application.OnTime gotime2, "test2"
gotime2 = gotime2 + TimeValue("00:00:10")
Debug.Print gotime1, gotime2
Wend
MsgBox "start " & Time
End Sub

Sub test1()
MsgBox "test1 " & Time
End Sub

Sub test2()
If Time >= gotime1 + TimeValue("00:01:00") Then
MsgBox "end " & Time
Else
MsgBox "test2 " & Time
End If
End Sub

たとえば、こんなことか。
下記は、1度testを実行すると、15秒たつとtest1を実行し、以後10秒ごとにtest2を実行するというもの。
test1もtest2も単にmsgboxを表示するだけ。

Dim gotime1, gotime2
Sub test()

gotime1 = Time + TimeValue("00:00:15")
gotime2 = gotime1
Application.OnTime gotime1, "test1"
gotime2 = gotime2 + TimeValue("00:00:10")

While gotime2 < gotime1 + TimeValue("00:01:00")
Application.OnTime gotime2, "test2"
gotime2 = gotime2 + TimeValue("00:...続きを読む

QEXCEL VBAで計算値を四捨五入、切り上げ、切捨てする方法

ネットで探してみたのですが、計算結果を四捨五入して特定のセルを
返すにはどうしたらいいのでしょうか?

Sub hokangosa()

Dim ZPS As Double
Dim ZPOS As Double
Dim DMN As Double
MsgBox (" >>> 補間誤差自動計算 <<< ")
MsgBox (" >>> 初期値入力します <<< ")
ZPS = InputBox(">>> ステップを入力してください<<<")
ZPOS = Sheet1.Cells(22, 4).Value
DMN = ZPOS / ZPS
Sheet1.Cells(23, 6).Value = DMN
End Sub

ここでDMNの値を四捨五入したいです。

またこれとは別に切上げ、切捨ても教えていただけるとありがたいです。

Aベストアンサー

DMN = Application.WorksheetFunction.Round(ZPOS / ZPS, 0)
で、四捨五入
DMN = Application.RoundDown(ZPOS / ZPS, 0)
で切り捨て
DMN = Application.RoundUp(ZPOS / ZPS, 0)
で切り上げです。

引数で、対象桁を変更できます。

QOnTime 使用時のプロシージャへの引数の与え方、その記述方法を教えて下さい。

初心者ですが、宜しくお願いします。

Application.OnTime EarliestTime:=TimeValue(time_ptn), Procedure:="my_func"

上記コードの、末尾のプロシージャの指定において、

Dim prm1 As String, prm2 As Long

Function my_func(prm1,prm2)
   ~内容~
End Function

または、

Sub my_func(prm1,prm2)
   ~内容~
End Sub

というプロシージャを指定したいのですが、
末尾の書き方が分からず困っております。

「Procedure:="my_func(prm1,prm2)"」
「Procedure:= my_func(prm1,prm2)」

のようにやっても、うまくいきません。
正しい書き方をどなたか教えて下さい。

Aベストアンサー

Option Explicit

Sub test()
  Dim s As String
  Dim i As Long
  Dim j As Long
  Dim x As String
  
  s = "a"
  i = 1
  j = 2
  '文字列 & 変数 & 文字列...みたいに繋ぎます。
  MsgBox "'my_func """ & s & """," & i & "," & j & "'"
  Application.OnTime EarliestTime:=Now + TimeValue("0:00:01"), _
            Procedure:="'my_func """ & s & """," & i & "," & j & "'"
  '
  'x = "'my_func """ & s & """," & i & "," & j & "'"
  'MsgBox x
  'Application.OnTime EarliestTime:=Now + TimeValue("0:00:01"), _
            Procedure:=x
  
End Sub

Sub my_func(prm1 As String, prm2 As Long, prm3 As Long)
  MsgBox prm1 & prm2 & prm3
End Sub

Option Explicit

Sub test()
  Dim s As String
  Dim i As Long
  Dim j As Long
  Dim x As String
  
  s = "a"
  i = 1
  j = 2
  '文字列 & 変数 & 文字列...みたいに繋ぎます。
  MsgBox "'my_func """ & s & """," & i & "," & j & "'"
  Application.OnTime EarliestTime:=Now + TimeValue("0:00:01"), _
            Procedure:="'my_func """ & s & """," & i & "," & j & "'"
  '
  'x = "'my_func """ & s & """," & i & "," & j & "'"
  '...続きを読む

QエクセルVBA 時間のカウントダウン

エクセルを起動後、A1セルに10分のカウントダウンタイマーを「分:秒」で表示する方法(VBA)をご教示頂けないでしょうか。
よろしくお願い致します。

Aベストアンサー

1レスです。

きっと、もっとずっと簡単に出来るとお考えなのでしょう。
例えば、ユーザーがどこかのセルを編集状態にしたらば、
どうやっても、カウントダウンを進める(VBAからセル値を変える)ことは出来ません。
そういう理由から、ユーザーフォームに表示させるのが一般的ではあります。
何故、セルに表示させたいのでしょう?
10分の間、ExcelやVBAは何もしないのでしょうか?
途中でカウントダウンを止めたり、ブックを閉じたりすることはあるでしょうか?
そもそも何故カウントダウンが必要なのでしょう?
等々、疑問は多数湧いてくるものの、すべてに応える体力はありません。

経験してみないと、こちらが何を言っているのかも解らないと思います。
一応、書かれたオーダーには応えています。
中でも無難な(トラブルの少ない)手法を選んだつもりです。
ただ、これが(仕様的に)実際に役に立つのかどうかは、ご本人にしか判りません。
これはあくまでテスト用サンプルです。
テストしてみて求める仕様との違いを確かめながら、仕様をはっきりさせて、
改めて、全体を見通して設計を見直してみてください。
若しくは、目的、用途、条件、といったことを十分に文章化した上で、
あらたに相談するとか、質問を建て直した方が、解決は近いと思います。

ご使用の環境が書かれていませんので、念の為、標準モジュールの記述は
Excel 32ビット版・64ビット版、両方、別々に書いておきました。
どちらかを正しく選ばないとコンパイルエラーになります。
ThisWorkbookモジュールの記述は共通です。


' ' 〓〓〓〓〓〓〓〓標準モジュール・32ビット版〓〓〓〓〓〓〓〓
Option Explicit

Public flgStopTimer As Boolean

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 Sub KillTimer Lib "user32" _
            (ByVal hwnd As Long, ByVal nIDEvent As Long)

Private oTargetRange As Range
Private dtTargetTime As Date
Private nTimerIdx As Long

Private Const dtTimeSpan As Date = #12:10:00 AM#   '  10分後
Private Const nIntervalMilliSecond As Long = 1000&  '  1秒間隔

Sub TestCountDown()
  Call StartCountDown
End Sub

Private Sub StartCountDown()
  dtTargetTime = Now + dtTimeSpan
  Set oTargetRange = Sheets("Sheet1").Cells(1, "A")
  oTargetRange.Value = dtTimeSpan
  oTargetRange.NumberFormat = "mm:ss"
'  With Cells(2, "A")
'    .Value = dtTargetTime
'    .NumberFormat = "h:mm:ss"
'  End With
  nTimerIdx = SetTimer(0&, 0&, nIntervalMilliSecond, AddressOf RcvEvent)
End Sub

Private Sub RcvEvent(ByVal hwnd As Long, ByVal uMsg As Long, _
          ByVal idEvent As Long, ByVal dwTime As Long)
  If Now > dtTargetTime Or flgStopTimer Then
    KillTimer 0&, idEvent
    nTimerIdx = 0&
    Set oTargetRange = Nothing
  Else
    On Error Resume Next
    oTargetRange.Value = dtTargetTime - Now
    On Error GoTo 0
    DoEvents
  End If
End Sub

Private Sub StopCountDown()
  KillTimer 0&, nTimerIdx
  nTimerIdx = 0&
  Set oTargetRange = Nothing
End Sub

' ' 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓

' ' 〓〓〓〓〓〓〓〓標準モジュール・64ビット版〓〓〓〓〓〓〓〓
Option Explicit

Public flgStopTimer As Boolean

Private Declare PtrSafe Function SetTimer Lib "user32" _
            (ByVal hwnd As Long, ByVal nIDEvent As LongPtr, _
            ByVal uElapse As Long, ByVal lpTimerFunc As LongPtr) _
            As LongPtr
Private Declare PtrSafe Sub KillTimer Lib "user32" _
            (ByVal hwnd As Long, ByVal nIDEvent As LongPtr)

Private oTargetRange As Range
Private dtTargetTime As Date
Private nTimerIdx As LongPtr

Private Const dtTimeSpan As Date = #12:10:00 AM#   '  10分後
Private Const nIntervalMilliSecond As Long = 1000&  '  1秒間隔

Sub TestCountDown()
  Call StartCountDown
End Sub

Private Sub StartCountDown()
  dtTargetTime = Now + dtTimeSpan
  Set oTargetRange = Sheets("Sheet1").Cells(1, "A")
  oTargetRange.Value = dtTimeSpan
  oTargetRange.NumberFormat = "mm:ss"
'  With Cells(2, "A")
'    .Value = dtTargetTime
'    .NumberFormat = "h:mm:ss"
'  End With
  nTimerIdx = SetTimer(0&, 0^, nIntervalMilliSecond, AddressOf RcvEvent)
End Sub

Private Sub RcvEvent(ByVal hwnd As Long, ByVal uMsg As Long, _
          ByVal idEvent As LongPtr, ByVal dwTime As Long)
  If Now > dtTargetTime Or flgStopTimer Then
    KillTimer 0&, idEvent
    nTimerIdx = 0^
    Set oTargetRange = Nothing
  Else
    On Error Resume Next
    oTargetRange.Value = dtTargetTime - Now
    On Error GoTo 0
    DoEvents
  End If
End Sub

Private Sub StopCountDown()
  KillTimer 0&, nTimerIdx
  nTimerIdx = 0^
  Set oTargetRange = Nothing
End Sub

' ' 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓

' ' 〓〓〓〓〓〓〓ThisWorkbookモジュール 共通版〓〓〓〓〓〓〓

Private Sub Workbook_BeforeClose(Cancel As Boolean)
  Application.Run "StopCountDown"
End Sub

Private Sub Workbook_Open()
  Application.OnTime Now, "StartCountDown"
End Sub

' ' 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓

1レスです。

きっと、もっとずっと簡単に出来るとお考えなのでしょう。
例えば、ユーザーがどこかのセルを編集状態にしたらば、
どうやっても、カウントダウンを進める(VBAからセル値を変える)ことは出来ません。
そういう理由から、ユーザーフォームに表示させるのが一般的ではあります。
何故、セルに表示させたいのでしょう?
10分の間、ExcelやVBAは何もしないのでしょうか?
途中でカウントダウンを止めたり、ブックを閉じたりすることはあるでしょうか?
そもそも何故カウントダウンが必要なのでしょう...続きを読む


人気Q&Aランキング