エクセルのマクロで、過ぎた時間の背景を
グレーにする予定表を作ろうとしてます。
試しに一秒ごとにグレーにしようと以下のものを書いてみたのですが
1セルしかグレーになりません。
理想としては1秒、2秒、3秒ごとに一つずつセルを変えたいです。
range * i で型の問題がある気がするのですが、
なにかアドバイスあればよろしくお願いします。
以下は関数のページです。
TimeValue
http://msdn.microsoft.com/library/ja/default.asp …
OnTime
http://msdn.microsoft.com/library/ja/default.asp …
----------------------------------------------------
Sub timer()
Dim range As Integer
For i = 1 To 100
range = TimeValue("0:00:01")
my_time = Now + (range * i)
Application.OnTime my_time, "setBg"
Next
End Sub
Sub setBg()
Cells(Second(Now), 1).Interior.ColorIndex = 16
End Sub
No.3ベストアンサー
- 回答日時:
1分ごとに処理したいのであれば
Sub Timerの中のループは mのみで良いように思います
余分な hやsでループしてタイマーをセットするのは資源の無駄遣いです
1分ごとにプロシージャを呼び出せれば良いのですから
dim mySpan(59) as Date
Sub Timer()
dim span as date, n as integer
span = Now
for n = 0 to 59
mySpan(n) = span
Application.onTime span, "setBg"
span = DateAdd( "n", 1, sapn )
next
End Sub
Sub setBg()
dim m as integer, h as inetegr, span as range
m = Minute( Now )
h = hour( Now )
If m >= 3 Then
Cells( m - 1, h + 1).Interior.ColorIndex = 16
Else
Cells( m + 59, h + 1 ).Interior.ColorIndex = 16
End If
' タイマーの更新
Application.onTime mySapn( m ), "setBg",,False
mySpan( m ) = DateAdd( "h", 1, mySpan(m) )
Application.onTime mySapn( m ), "setBg"
End Sub
ブックを読み込んだ時点で自動実行させたいなら
標準モジュールに Sub Auto_Open()
ThisWorkbookの Sub Workbook_Open()
のどちらかに 開始時に行う処理を呼び出すようにすれば良いですよ
何度も教えていただき とても勉強になりました。
また一つプログラミングの面白さを体験できました。
たぶんこんなスケジュール帳を使いたい人はいないと思いますが、
興味あれば使ってみてください(笑) 回答ありがとうございました。
No.2
- 回答日時:
私には、わからないとことだらけですが
私がやって見ると
下記は1秒ごとにA1セルから下方向に黄色をつける(20秒)内容です。
Public n
Sub Timer()
n = 0
range("A:A").Clear
For i = 1 To 20
my_time = Now + TimeValue("0:0:01") * i
Application.OnTime my_time, "setBg"
Next i
End Sub
Sub SetBg()
n = n + 1
Cells(n, 1).Interior.ColorIndex = 6
End Sub
でうまくいくようです。
その
For Nextループの実行は、実時刻の経過と関係なく実行されるようです。その仕組み理解不足。
VBAは自分の世界で早々と実行。システムに時間が来たら実行してよね、と言いぱっなしのようなイメージかな。
ですからFor i = 1 To 100だとSub SetBg()の実行では、iは101で100回繰り返されるようです。
というのも、私は初めはiがSub SetBg()でも使えないか、とやってみたが、私の理解不足した。質問者もそれはわかっていたのかもしれないが。
それで上記のようにしてみました。
ーー
ただ、ループの各回ごとの実行を実時間の経過に強制的にあわせて、Sub SetBg()に飛ばせる方法は無いのかと思うが、そういう仕組みはForNextや普通のVBAでは無理のようだ。
ーー
#1のご回答ではその点Cells( Second(Now)+1,1).で(Nowを使って)解決しておられる。(質問者の質問文でもその路線ですが)。
ただしSub Timer()では名前がTimerだからか、エラーになりませんか。Sub TimerA()にしたらOKですが。
No.1
- 回答日時:
rangeをDate型にして forループは1と60で良いように思います
Sub Timer()
dim range as Date, my_time as Date, i as Integer
range = timevalue("0:0:1")
for i = 1 to 60
my_time = Now + range * i
Application.OnTime my_time, "setBg"
next
End Sub
Sub SetBg()
' Secondの戻り値が0から59なので +1をして補正する
Cells( Second(Now)+1,1).Interior.ColorIndex = 16
End Sub
この回答への補足
回答ありがとうございます。 出来ました^^
もしよろしければ重ねてお伺いしてもよろしいでしょうか。
1.以下のコードで一分ごとに背景が変わるようになったのですが、
もっと効率の良い方法はありますか??
マクロを始める時に 60 x 60 x 24 の演算をしてしまうので。
JavaScript の setInterval のようなものがあったら良いなと思いました。
以下のは、セル A1 から X1 に0時から23時と入れて
縦の番号がそのまま minutes になるものです。
0分は行60、1分は行61になるんですけども。
時間が過ぎる速さを実感したいと思いまして。
2.また、このエクセルファイルを開くと同時に
マクロを実行することは可能でしょうか??
解る範囲で教えて頂けると助かります。
------------------------------------------------------
Sub timer()
Call initialize
For h = 0 To 23
For m = 0 To 59
For S = 0 To 59
Application.OnTime Now + TimeValue(h & ":" & m & ":" & S), "setBg"
Next
Next
Next
End Sub
Sub setBg()
If Second(Now) = 0 Then
If Minute(Now) >= 3 Then
Cells(Minute(Now) - 1, Hour(Now) + 1).Interior.ColorIndex = 16
Else
Cells(Minute(Now) + 59, Hour(Now)).Interior.ColorIndex = 16
End If
End If
End Sub
Sub initialize()
' set previous hour
If Hour(Now) <> 0 Then
For h = 0 To Hour(Now) - 1
For m = 2 To 61
Cells(m, h + 1).Interior.ColorIndex = 16
Next
Next
End If
' set this hour
If Minute(Now) >= 3 Then
For m = 2 To Minute(Now) - 1
Cells(m, Hour(Now) + 1).Interior.ColorIndex = 16
Next
End If
End Sub
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) ExcelVBAで、index、match関数を使用して、指定範囲に出力したい 3 2022/10/18 21:53
- Visual Basic(VBA) ExcelVBAのマクロについて。 9 2022/05/04 14:50
- Excel(エクセル) 2つのVBAを一緒にしたら機能しなくなりました(エクセル) 7 2022/06/02 12:41
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Visual Basic(VBA) 前回ご教授いただいたコードに覚えたてのループ処理で品名りんごAから順に20回for nextでループ 7 2023/01/13 22:01
- Excel(エクセル) エクセル 値をコピペした時に、条件付き書式で塗られた背景色もペーストさせる 2 2023/04/05 17:21
- Visual Basic(VBA) ExcelVBAに関する質問 3 2023/02/17 10:47
- Visual Basic(VBA) マクロ実行時、自動で背景色を変えたい。 C列にあるチェックボックスをチェックするとB列に「TRUE」 4 2022/11/08 11:14
- Visual Basic(VBA) エクセル VBA メール本文に指定セルに記載されているURLをリンクとして記載する方法 8 2022/08/08 07:50
- Visual Basic(VBA) A列B列C列 3 2023/04/26 18:11
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
画面を強制的に再描画させる方法
-
VBAでの一時停止と再開の方法
-
DoEventsが必要な理由について
-
vba
-
VBAで3秒だけ時間を止めたい
-
VBA for i=1 to lastrow
-
【VBA】全て空白のセルの列の非...
-
エクセルの当番表を作っていま...
-
ループフリー
-
C#で別のフォームのprogress ba...
-
エクセル関数で1〜12の数字がル...
-
テキストボックスの名前に変数...
-
動きっぱなしです。止め方とプ...
-
VBA Dir関数でファイルをループ...
-
VB.NETで素因数分解のプログラ...
-
ListBox 複数選択 で オートフ...
-
流れ図(フローチャート)が分か...
-
Escキーを押すと、中断する時と...
-
Delphiプログラミングについて
-
For文を使った九九表の作成
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
画面を強制的に再描画させる方法
-
VBAで3秒だけ時間を止めたい
-
VBAでの一時停止と再開の方法
-
どなたかこのプログラミングを...
-
Escキーを押すと、中断する時と...
-
UWSCの終了の仕方
-
エクセルの当番表を作っていま...
-
VBA for i=1 to lastrow
-
「偶数・奇数の和」のフローチ...
-
アクティブセルから、A列最終行...
-
DoEventsが必要な理由について
-
vb.netからエクセル関数書き込み
-
GIFアニメをループさせたくない
-
DOSコマンドのループ内のTIMEコ...
-
範囲指定したセルを1つずつ飛...
-
流れ図(フローチャート)が分か...
-
乱数の桁数指定、または範囲指定。
-
テキストボックスの名前に変数...
-
CSVファイルの特定の行だけを読...
-
vbscriptでIE自動入力(途中で...
おすすめ情報