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

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

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

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

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

A 回答 (5件)

考え方としてですが


ループとIFでのチェックではなく、

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

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

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

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

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

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

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

この回答への補足

kenken0001さん、ありがとうございます。

kenken0001さんのおっしゃることは、
Dim i as Integer
for i=1 to 365
  ...           ’次回実施時刻の計算
  ~OnTime~ 又は~Wait~ ’処理の実行
  ...
next

という意味でしょうか。これなら、1年間は動き続けますね。この考え方は
思いつきませんでした。

それとも、~OnTime~ 又は~Wait~は、時刻設定をすると、ループでまわ
さなくても何度でもステートメントを動作するのでしょうか。

もしまたここをご覧になって、私の解釈に間違いがあったら、教えていただ
けませんでしょうか。

それから、やはりVBAでタイマーコントロールは使えないのでしょうか。

補足日時:2002/03/01 12:44
    • good
    • 0

補足に書いていただいたものは


その通りです。

365だと1年しか動きませんので
カウンタiをリセットして
いつまでもループする方が良いのではないでしょうか。

for i=1 to 2
  ’次回実施時刻の計算・セット
  ~OnTime~ 又は~Wait~ ’処理の実行
  ...
i=0
next

予定では、次回まではウェイト状態で
待っていて時間が来るとその度に動くと思います。



VBの知識が無いのでタイマーコントロールが
分かりません。

Private Sub Timer1_Timer()
Label1.Caption = Time
End Sub

VBではこういう書き方があるようですが

個人的な理解ですが
Excelは、オブジェクトである
シートやフォームに対して
イベントを設定する考え方なので
タイマーというものが
無い(今は)のではないかと思います。

シートを開いた時や
マクロがキックされた時など
実体のあるものだけで
時間を扱わない(扱えない)
のでしょうか??

便利そうな機能なので勉強になりました。
将来VBをやる時に使ってみます。

Excel97なので以降のバージョンでは
あるのかもしれませんし
わたしが知らないだけかもしれません。


不勉強のため、確かなことを書けず
申し訳ありません。
何か分かったら教えて下さい。

がんばって下さい。
ではでは。
    • good
    • 0
この回答へのお礼

takao_kwさん、kenken0001さん、ありがとうございました。

勉強になりました。

始めは、無限ループの中でIF文をつかって時刻判定をしていたので、
グルグルまわってしまい、CPUパワーをフルに使っていたようです。
ということで、~OnTime~ 又は~Wait~構文使用時の待ち時間中に
どの位CPUパワーを使うかどうかは未確認ですが、皆さんから教えて
いただいたことを解決の一方法として、検討してみます。

お礼日時:2002/03/01 15:14

下のものでも結果は同じでしょうか。



待ち時間 = InputBox("待ち時間(秒)", "題名", "5")
開始 = TimeSerial(Hour(Now()), Minute(Now()), Second(Now()) + 待ち時間)
Application.Wait 開始

Nowで時刻を取得、開始時刻を秒単位で算定
で変更して使えませんか。
    • good
    • 0

申し訳ありません。


私には、これ以上のことはわかりません。
お役に立てなくてごめんなさい。
    • good
    • 0

下記は11時22分33秒に『時間です』と表示するモジュールです。


こういう意味でよろしいのですか?

Sub DUMMY()
指定時刻 = TimeValue("11:22:33")
Application.OnTime TimeValue(指定時刻), "DUMMY_MODULE"
End Sub


Sub DUMMY_MODULE()
MsgBox "時間です"
End Sub

この回答への補足

takao_kwさん、ご回答ありがとうございます。

エクセルVBAのOnTimeメソッドも試してみましたが、
これを実行すると、実行部分(プロシジャ)を実行するまで、
待機時間中はCPUがフル稼働します。

また、毎日一定時刻に決まったプロシジャを実行しようとすると、
OnTimeメソッドをループでまわす必要があります。本当は、VBの
タイマーコントロールを使ってこの処理をしたかったのですが、
エクセルVBAにタイマーコントロールが見当たらなかったので、
ここで私は無限ループを使ったのですが、ここでもCPUがフル稼働
してしまいます。

このプログラムは24時間稼動のサーバーで実行させて、一定
時刻にデータベースからデータを抽出してデータ処理をさせる
もので、サーバーは他のサービスも提供しているので、CPU負荷
をさげてVBAを実行させたいのです。他に手はありませんでしょうか。

補足日時:2002/03/01 08:11
    • good
    • 0

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

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

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

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

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

Qタイマーに時差をつけたい

こんにちは。

タイマーAとタイマーBがあって、タイマーA実行の後
時差(例:0.1秒)でタイマーBを動かす方法を教えてください。
よろしくお願いします。

Aベストアンサー

タイマーCを使ってタイマーA開始0.1秒後にタイマーBを開始する

Qエクセルで、VBマクロを使い、cellの内容が変更されたタイミングでマクロを実行したいです

エクセル上のVBマクロで、cellの内容が変更されたときに、マクロを実行し、同時にどのセルが変更されたかを取得したいです。

よい方法があれば教えて頂きたいです。
よろしくお願いします。

Aベストアンサー

Worksheet_ChangeイベントとTarget引数を使うと良いでしょう。

例えば、使用しているシートのシート名タブを右クリックして「コードの表示」で
開いたコードウィンドウに下記コードをコピーして貼り付けます。

これで、内容を変更したときに、そのアドレスを表示します。

例えば、A1:A10を選択し、"abc" をキー入力し、Shift+Ctrl+Enter を押すと
範囲内に"abc"が入力され、メッセージボックスに "A1:A10" が表示されます。

Private Sub Worksheet_Change(ByVal Target As Range)
  MsgBox Target.Address(False, False)
End Sub

但し、実際に本当に内容を変更したかどうかを検出するには、常に現シートの
写しを作っておいて、双方の内容比較する必要があります。

例えば、何も入力されていない A1:A10 を選択し、DELキーを押すと、何も変更
していないのに、A1:A10 と表示されてしまいます。

ということで、同じ内容を上書きしても変更したのと同様に扱われます。

Worksheet_ChangeイベントとTarget引数を使うと良いでしょう。

例えば、使用しているシートのシート名タブを右クリックして「コードの表示」で
開いたコードウィンドウに下記コードをコピーして貼り付けます。

これで、内容を変更したときに、そのアドレスを表示します。

例えば、A1:A10を選択し、"abc" をキー入力し、Shift+Ctrl+Enter を押すと
範囲内に"abc"が入力され、メッセージボックスに "A1:A10" が表示されます。

Private Sub Worksheet_Change(ByVal Target As Range)
  MsgBox Targe...続きを読む

Qデロンギオイルヒーターのタイマーの故障

デロンギのオイルヒーターの本体についているスイッチON・OFFをするための赤い棒を上げ下げするタイマーが故障して、常にスイッチON状態になりました。そこで電源タイマーにコンセントをさして使おうかと思うのですが、その際本体に悪影響はないでしょうか?また、電源タイマーで時間の狂いにくいのはどれでしょうか?
タイマーの修理はお金がかかると思うので電源タイマーで代用したいのです。

Aベストアンサー

No.2の方に補足ですが、
デロンギのオイルヒータと同じ24時間タイマーの製品もあります。
WH3301WPなど。
これは、別の電気ヒータのサービス品として使われているもので、
オイルヒータにも使えると思います。

また、デジタル式としては、
REVEX デジタルプログラムタイマー PT60D
というのが、Amazonにレビューが書いてありました。
抵抗負荷(ヒータ)で1500WはOKと思われます。

ご参考まで

参考URL:http://ctlg.national.jp/product/info.do?pg=04&hb=WH3301WP

QエクセルVBAマクロの実行について

おはようございます。
アドインで、マクロを実行するコードを作りました。
指定したシート以外ではマクロを実行できないようにしたいのですが、
コードの書き方がわかりません。教えていただけませんか?

Aベストアンサー

>ブックとシートを同時に指定したい場合

ブックの名前は
 ThisWorkbook.Name
で、取得できますので

If (ActiveSheet.Name = "シート名") And (ThisWorkbook.Name = "ブック名") Then
  (マクロ)
Else
  (違う場合のマクロ)
End If

ブック名には、拡張子も付けなければなりません

Qオイルヒーター用後付タイマー

タイマー無しのオイルヒーターをタイマー制御したいのですが
ホームセンターなどで販売しておる
タイマー 1000円から4000円ぐらいまでのもの
すべてにオイルヒーターには使用できませんとの記述があります。
オイルヒーターにもつかえるタイマーはございませんでしょうか?

Aベストアンサー

オイルヒーターは最大1500W(15A)も消費する製品です。
ヒーター使用中に電源コードをさわると微熱を持つのが判ると思います。
電源コードは当然抵抗値が小さいのですが、15Aという電流はそれでも熱するほどの大電流です。


簡素なタイマーで15Aも流すと内部が発熱して溶解、発火の原因となります。
1500Wまで対応を謳ったタイマーでなければなりません。

一応1500Wに対応した製品を紹介します。
 デジタルプログラムタイマーII グレーPT50DG
 http://www.amazon.co.jp/dp/B002YWD0ZE

アマゾンのレビューでもオイルヒーターに利用している方がいるようです。

Qエクセルマクロ(VBA)で指定したセルが変化したときに実行するには?

VBAでsheetの中のworksheet_changeなどでマクロを書くと、そのシー
トの中のどのセルを変化させてもマクロが実行されるのですが、これ
を、A1とc1とc2が変化したときだけ処理を実行させたいのです。

以下のマクロのどこかを編集すると、そのようなことが出来るのでし
ょうか?

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
----実行する内容----
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
----実行する内容----
End Sub

Aベストアンサー

↓のような感じでイベントの発生を制御できます。

'A1セル以外が変更されたら何もしない
If Intersect(Target, Range("A1,C1,C2")) Is Nothing Then Exit Sub

Qキッチンタイマーについて

キッチンタイマーについて教えてください。

複数の料理を並行して行う時にどうしてもタイマーが一つでは足りない場合があるのですが、複数の時間を設定できるタイマーって売っていますか?

例:10分後と20分後・40分後と1つのタイマーで複数の時間設定ができるものを探しています。

もしそのような商品がありましたら、教えてください。
キッチンタイマーでなくても複数設定できるものでしたら教えてください。

宜しくお願いします。

Aベストアンサー

下記にようなタイマーがありますよ。

タイマー3つ設定
http://www.amazon.co.jp/dp/B0002ZLCNM/ref=nosim/?tag=biglobe06-src-link-22&linkCode=as1

タイマー2つ設定
http://www.amazon.co.jp/s/ref=nb_ss_k?__mk_ja_JP=%83J%83%5E%83J%83i&url=search-alias%3Dkitchen&field-keywords=T-177BK&x=19&y=16

Qエクセル タスクスケジューラでマクロ自動実行

お世話になります。
win7/エクセル2010使用です。

エクセルのThisWorkbook_openでマクロを実行するファイルAを作っています。
※Auto_Openは記述していません。


ファイルAをタスクスケジューラに設定いたしました。
問題なくマクロが自動実行されて、目的は果たしています。

ただ、不思議な点があります。

このファイルAをダブルクリックして開いても
マクロは自動実行されていきます。

このファイルAをコピーして、ファイルBを作り
それをダブルクリックで開くと、
ファイルBは、ブックが開いた後に、「セキュリティーの警告」がされて
マクロの自動実行ができません。

通常は、「セキュリティーの警告」を出さないために
Auto_Openなどでコードを記述すると思うのですが、
なぜ、Auto_Openを記述していないファイルAが自動実行されるのかがわかりません。

タスクスケジューラの設定に何か関係はあるのでしょうか?

よろしくお願いします。

Aベストアンサー

追記:なぜコピーだと警告が出るのかに関して

参考情報
2回目からはマクロの警告しません
http://officetanaka.net/excel/excel2010/008.htm


個々に詳しく書かれています

Qテレビをオンタイマーでつけたい。

家に2台(リビング・寝室)テレビがあるのですが、
配置を変えようと思います。

現在、寝室に置いてあるテレビはオン&オフタイマー付のもので
リビングのものには、オフタイマーしかありません。
メーカーは、どちらも同じなのですが・・・(関係ないですね。)

このオンタイマーの付いていないテレビを
オンタイマーでつける方法は、ないでしょうか?

オンタイマーでテレビが朝つかないと起きれないのです。。。

宜しくお願いします。

Aベストアンサー

>コンセントにつなぐタイマー類を使うときには、
寝るときは、テレビを消して布団に入らないといけないのでしょうか??

オンオフを何種類も設定できるので付けておいても大丈夫ですよ。

Qエクセルでマクロの実行回数をセル参照するマクロ

いつもお世話になっております。
A1の数字の分だけ印刷するマクロを以下のように理解しました。

Dim n As Integer
n = Application.WorksheetFunction.Sum(Worksheets("Sheet3").Range("A1"))

ActiveWindow.SelectedSheets.PrintOut Copies:=n, Collate:=True

これとは別に、
B1の数字(値)を参照して、
”マクロ2”というマクロの実行回数を指定したいのです。

単に一回実行するだけなら
Application.Run "マクロ2"
ですね。

実行回数を指定する場合、
どのように記述すればよいかご教示ください。
よろしくお願いします。

Aベストアンサー

>A1の数字の分だけ印刷するマクロを以下のように理解しました。

A1に確実に数値が入力されているなら、
Dim n As Integer
n = Worksheets("Sheet3").Range("A1")
だけで十分です。
複数のセルが対象なら、sum関数(Application.WorksheetFunction.Sum() )を利用するのも良いでしょう。

繰返しなら、
For i=1 to n
Call マクロ名
Next


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング