プロが教えるわが家の防犯対策術!

例えば 13時21分55秒になったら B1のセルを1秒間隔で2回背景を赤点滅させる 、次に13時22分55秒になったら B1のセルを1秒間隔で2回赤点滅させるというように一分おきに1秒間隔で2回背景を赤点滅させたい VBAで何度か挑戦したのですがダメでした 今やっているゲームのタイミング用にちょっと作ってみたい。関数でPCのTIMEを使ってお手軽に出来れば教えてほしい VBAのプロシージャも大歓迎( 理解するのに時間がかかるだろうけど)

A 回答 (3件)

セルを点滅させる _ Microsoft Docs


https://docs.microsoft.com/ja-jp/office/vba/exce …
    • good
    • 0
この回答へのお礼

StartBlinking は考えつかなかった

お礼日時:2021/11/30 15:31

VBEで標準モジュールを挿入して、下記のコードをコピペしてください。




Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Integer)

Option Explicit

Sub 一定時間間隔でセルを点滅()

Dim n As Long
Dim buf As Variant

Dim 秒 As Long

Cells(1, 1).Select
Cells(1, 2).Interior.ColorIndex = xlNone
Cells(3, 2) = "このセルをクリックすると終了します。"

Do

'「秒」が指定した値になるまで待機
Do

'秒を取得
buf = Split(Now(), ":")
秒 = buf(2)

Call 応答
Sleep 100

If 秒 = 55 Then
Exit Do
End If

Loop

'点滅
For n = 1 To 2

Cells(1, 2).Interior.Color = RGB(255, 0, 0)
Sleep 500
Call 応答

Cells(1, 2).Interior.ColorIndex = xlNone
Sleep 500
Call 応答

Next

Loop


End Sub
Sub 応答()

Cells(2, 2) = "現在の時刻:" & Now()
DoEvents

If ActiveCell = "このセルをクリックすると終了します。" Then
Cells(1, 1).Select
Cells(1, 2).Interior.ColorIndex = xlNone
Cells(2, 2) = ""
Cells(3, 2) = ""
End
End If

End Sub


このマクロを実行するには、
プロシージャ「一定時間間隔でセルを点滅」を実行してください。

マクロの実行方法は何通りもありますが、
例えば、プロシージャ「一定時間間隔でセルを点滅」の中にカーソルがある状態で[F5]キーを押すと実行できます。

このマクロを停止させるには、
実行後にC3セル(「このセルをクリックすると終了します。」と表示されているセル)をクリックしてください。

一番上の行から順番に解説します。

■Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Integer)

Windows API の Sleep 関数の使用を宣言します。もしここでエラーが発生するなら、「PtrSafe」を消してください。

■Option Explicit
これを書くと、宣言されていない変数がコード中にある場合、エラーが発生し、それに気づくことができるというものです。プログラムを使用する側にとっては、まあ、どうでもいいです。

■Sub 一定時間間隔でセルを点滅()
プロシージャ「一定時間間隔でセルを点滅」の開始です。

■Dim n As Long
「n」という名前の Long 型の変数を宣言します。n には整数を代入できます。

■Dim buf As Variant
「buf」という名前の Variant 型の変数を宣言します。buf には何でも代入できます。

■Dim 秒 As Long
「秒」という名前の Long 型の変数を宣言します。秒 には整数を代入できます。

■Cells(1, 1).Select
1行1列目のセルを選択します。

■Cells(1, 2).Interior.ColorIndex = xlNone
1行2列目のセルの色を消します。

■Cells(3, 2) = "このセルをクリックすると終了します。"
3行2列目のセルに「このセルをクリックすると終了します。」と表示します。

■Do
ここから最後の Loop までの処理を繰り返し実行します。

■Do
ここから次の Loop までの処理を繰り返し実行します。

■buf = Split(Now(), ":")
Now 関数「Now()」は、現在時刻を教えてくれる関数です。
現在時刻が 2021年 12月 1日 08時 06分 32秒 だとしたら、
「Now()」は、文字列で「2021/12/01 8:06:32」を返します。

Split 関数は Now 関数が返した現在時刻を「:」で区切って仕分けたものを変数「buf」に入れます。

このとき、
buf(0) の値は「2021/12/01 8」
buf(1) の値は「06」
buf(2) の値は「32」
となります。

buf(0) と buf(1) は不要なので無視します。buf(2) の値を見れば、現在何「秒」なのかがわかります。

■秒 = buf(2)
buf(2) を変数「秒」に入れます。
現在、上記の時刻だとしたら、変数「秒」の値は 32 になります。

■Call 応答
プロシージャ「応答」の内容を実行します。

■Sleep 100
100 ミリ秒(= 0.1 秒)休止します。「今やっているゲームのタイミング用に」ということですので、Excel VBA の動作が CPU 使用率を独占すると良くないかもしれませんから、少しだけここで休むわけです。

ただし、このやり方だとセルが赤くなるタイミングに少し誤差が出てしまいます。もし、セルが赤くなるタイミングの精度を求めるなら、ここの「100」という数をもっと小さい数に変更してください。

■If 秒 = 55 Then
現在時刻が 55 秒になったら、次の End IF までの処理を実行します。

■Exit Do
Do ~ Loop のループから抜け出し、次の Loop のひとつ下の行にワープします。

■End If
■Loop
■For n = 1 To 2
次の Next までの処理を 2回実行します。

■Cells(1, 2).Interior.Color = RGB(255, 0, 0)
1行2列目のセルの色を赤にします。

ちなみに、どうでもいい話ですが、RGB(255, 0, 0)の部分を
RGB(0, 255, 0) に変えると緑に
RGB(0, 0, 255) に変えると青になります。

■Sleep 500
500 ミリ秒(= 0.5 秒)休止します。

■Call 応答
プロシージャ「応答」の内容を実行します。

■Cells(1, 2).Interior.ColorIndex = xlNone
1行2列目のセルの色を消します。

■Sleep 500
500 ミリ秒(= 0.5 秒)休止します。

■Call 応答
プロシージャ「応答」の内容を実行します。

■Next
■Loop
■End Sub
プロシージャ「一定時間間隔でセルを点滅」を終了します。

とは言っても外側の Do ~ Loop に対する Exit Do (ループから抜け出す指示)は存在しませんので、「応答」プロシージャ内の「End」が実行されない限りは無限ループします。

なので、処理がこの「End Sub」に到達することはあり得ません。

■Sub 応答()
プロシージャ「応答」の開始です。

■Cells(2, 2) = "現在の時刻:" & Now()
2行2列目のセルに「Now()」が返した値を表示します。

■DoEvents
ggってください。

■If ActiveCell = "このセルをクリックすると終了します。" Then
選択したセルに、「このセルをクリックすると終了します。」と書かれているとき、End IF までの処理を実行します。

■Cells(1, 1).Select
1行1列目のセルを選択します。

■Cells(1, 2).Interior.ColorIndex = xlNone
1行2列目のセルの色を消します。

■Cells(2, 2) = ""
2行2列目のセルを空欄にします。

■Cells(3, 2) = ""
3行2列目のセルを空欄にします。

■End
マクロを強制的かつ完全に停止させます。

これは「Exit Do」とか「Exit Sub」とは違って、このプロシージャが別のプロシージャから呼び出されていたり、処理がループの途中だったとしても停止できます。

■End If
■End Sub
プロシージャ「応答」を終了します。
    • good
    • 2
この回答へのお礼

パソコンのデスプレイが壊れて見ていませんでした。早速試してみます 特に説明がありがたいです。

お礼日時:2021/12/06 22:17

>VBAで何度か挑戦したのですがダメでした



ならば、ダメだったコードを示して何処がダメなのか尋ねては?
    • good
    • 0

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

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


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