見出し画像

再通知可能リマインダー!

作成が簡単なリマインダーをご紹介します。
一度作ればずっと使えます。

「いま言われたこと忘れそうだから、この作業が終わる15分後にリマインドしたい」というときに最高に重宝しています。

手順

以下の通りです。

1.下記のコードをコピー
2.メモ帳などにコピーしたコードを張り付け
3.「Timer.vbs」の名前で保存

ファイル保存時の注意

・「Timer.vbs」と書きましたが、「リマインダー.vbs」でも何でもいいです。拡張子だけ「.vbs」にします。

・普通に保存しようとすると、「.txt」がついてしまいます。保存時の「ファイルの種類」を「テキスト文書(*.txt)」から「すべてのファイル(*.*)」に変えます。

・保存時の「文字コード」が「UTF-8」だと文字化けします。「ANSI」か「SJIS」に変えたうえで保存します。

コード

'エラー処理を有効にする
on error resume next

'何分後に通知するかinputboxに入力した値を取得
input = inputbox("何分後に通知しますか?", "数字で入力")

'入力がなければスクリプトを終了
if input = "" then WScript.quit

'何を通知するかinputboxに入力した値を取得
obj = inputbox("何を通知しますか?","自由入力")

'WScriptはミリ秒のため、入力された値を変換
'入力された分数待機した後に、続きが再開
WScript.Sleep input*60000

'最初に入力された分数が数値ではない場合、エラー表示をして終了する
if Err.Number = 13 then 
	msgbox "数値を入力してください" , vbExclamation , "Error"
	WScript.quit
end if

'くりかえし設定
i = 0
Do While i < 1

    'リマインドの通知、兼、再通知有無の回答取得
    Ans = MsgBox("Time has come" + vbcrlf + vbcrlf + "■ " + obj + " ■" _
    + vbcr + vbcr + "#再通知は必要ですか?", vbYesNo + vbExclamation, "It's Time")

    '再通知をする場合の設定。再度待機時間を入力する
    	if Ans = vbYes then
		input = inputbox("何分後に再通知しますか?", "半角数字で入力")
		
		'未入力なら終了
		if input = "" then WScript.quit

		'エラー情報をクリア
		Err.clear

		'入力された値の分数待機する
		WScript.Sleep input*60000
		'入力された値が数値ではない場合、エラーを表示して繰り返す
		if Err.Number = 13 then msgbox "数値を入力してください" , vbExclamation , "Error"
			
	'再通知をしない場合、スクリプトを終了する
	elseif Ans = vbNo then i = 1
	end if
	
Loop

使い方

Windows環境で使えます。

保存した「Timer.vbs」はどこにおいてもいいので、クリックするだけで使えます。

他の設定に何にも影響を与えないので、気軽に作って、いらなくなったら、作成したファイルだけ捨てればOKです。

分単位ではありますが、「120」と入れれば2時間後、「1440」と入れれば24時間(丸一日後)に通知してくれます。(製作中は「0.05」と入れて、3秒後の通知で動作確認してました)

# 2021/3/31 以下の有料ページを無料にしてみました。

解説

そもそも、コードの中のコメントでほぼほぼ解説しているので、わかる人はそちらでご確認ください。

もうちょい知りたい人は読み進めてください。

プログラミングの基本

まず、今回のコードは、プログラムの基本が詰まっています。

・順次
・分岐
・反復

です。

順次とは:

コードの上から順番に進んでいくことです。これは当たり前ですね。すべてのプログラムが上から進んでいます。

画像1

分岐とは:

なんらかの条件を与えて、次の処理を変更するようにできる処理です。

今回のケースではいろいろな分岐をさせています。通知する分数が入力されているかを判断して、入力されていなければ終了にしたり、再通知するかどうか確認して、再通知をするかしないかの処理を変えたり、また、エラーが発生した場合はエラーの処理をするように、それぞれ「分岐」を作っています。

画像2

反復とは:

繰り返しが発生するものです。分岐と反復はセットで使われることも多いですね。

今回はいろいろ条件分岐しつつ繰り返したり繰り返さなかったりできるようにしています。具体的には、YES/NOの分岐で、再通知をしない、を選択しない場合は繰り返しをするようにしています。

画像3

分岐は今回のコードでいうと、

if xxx = xxx then
    xxx
    xxx
elseif
    xxx
    xxx
end if

この形や

if xxx = xxx then xxxxx

この形になっています。
1つ目のカタチでは、条件が分かれて、それぞれに処理内容があるケースです。
2つ目のカタチでは、ちょっとした分岐で、もしこんな時は、これしといてねーという扱いです。


反復は、

Do while
    xxx
    xxx
Loop

このようになっています。
反復は今回1回だけ、再通知エリア全体を繰り返してます。

MsgBox

一番簡単なメッセージボックスについては、以前のリマインダー話の際に書きましたので、そちらをご参照ください。

簡単に言うと、
Msgbox ”本文" , 通知の種類 , "タイトル"
という形になっています。

inputboxとWScript.sleep

inputboxは、メッセージボックス風ですが、入力欄がつきますので、入力された値が返されます。(メッセージボックスは通知するだけ)

そのため、返された値を格納する箱(変数)が必要になります。最初のinputboxでは、「input」という変数に、入力された「何分後に通知するかの分数」を入れております。

input = inputbox("何分後に通知しますか?", "数字で入力")

この値を後で待機時間に使用しています。

'WScriptはミリ秒のため、入力された値を変換
'入力された分数待機した後に、続きが再開
WScript.Sleep input*60000

コメントでも添えていますが、待機するための「WScript.sleep」はミリ秒単位なので、

WScript.sleep 1000

これで1秒です。
ですが、今回は使いやすいように分単位で入力させておりますので、「1」が入力されたら、1分=60秒待たせるため、入力値を格納した変数である「input」に60000を掛け算してあげております。

エラー処理

ところどころ分岐でエラー処理を混ぜています。

1つ目が、何分待つか入力がない場合です。(何を通知するかは別になくてもリマインドにはなるのでエラー処理をしていません)

'入力がなければスクリプトを終了
if input = "" then WScript.quit

分岐条件が、「もしinputが空っぽだったら?」という条件で、合致した場合に、WScript.quitでスクリプトを終了させています。

2つ目が、入力値が数字ではない場合(計算できない場合)です。

'最初に入力された分数が数値ではない場合、エラー表示をして終了する
if Err.Number = 13 then 
	msgbox "数値を入力してください" , vbExclamation , "Error"
	WScript.quit
end if

これについては、実はこれだけでは処理できません。
実はコード全体の一番最初に

on error resume next

と記述していますが、これは「エラーがあっても次に進んでね」という意味です。この1行がないと、エラー発生のところで止まります。

WScript.sleepで計算エラーになった場合、そこで止まらずに次に進むとこの条件分岐の条件に合致します。

「もし、エラー番号が13番なら、メッセージをだして、スクリプトを終了」という形になっています。複数行にわたる処理なので、「end if」でどこまでが分岐された内容か、わかるようにしています。

なお、エラー番号13番は、型が違うケースです。(数字じゃないじゃん!という型の違い)

Do while ~ Loop

反復、繰り返しの処理です。

i = 0
Do While i < 1
    ...
    ...
Loop

今回の繰り返し条件はこのコードの2行目「i が 1 より小さいうちは繰り返し」という条件になっています。
これを成立させるために、1行目に「i = 0」を記述しています。

なので、この繰り返し処理を抜け出すには、どこかで「i」が1以上にならなければなりません。

どこにあるかというと一か所あります。再通知のYes/Noで「No」を選択して繰り返さないようにした場合です。

    '再通知をしない場合、スクリプトを終了する
	elseif Ans = vbNo then i = 1

この時だけ、「i」が1になり、繰り返しを抜けて終了します。

繰り返しに関する処理はこれだけです。Do while から Loop までが遠いのでたくさん繰り返し処理をしているようですが、中身は繰り返しに関係ない他の処理です。

MsgBox(VbYesNo)

メッセージボックスは値を返さない、とか先ほど書きましたが、値を返すケースをご紹介します。(長いので省略して書きます)

Ans = MsgBox("Time has come" , vbYesNo , "It's Time")

Msgbox ”本文" , 通知の種類 , "タイトル"
この通知の種類を「vbYesNo」にすると、「はい」「いいえ」の選択肢が付けられます。そうすると、「はい」なのか「いいえ」なのかの回答が返ってきます。これを変数「Ans」に格納しています。

このYESの回答が「vbYes」という値で返ってきて、NOの回答が「vbNo」という値で返ってくるので、次の分岐の際に、

if Ans = vbYes then

「もし、変数Ansに格納された答えがvbYesならば、、」と記述しているわけです。

機能ごとに解説するとこんな感じですね。

エラー処理(おまけ)

ひとつだけ、エラー処理について追加です。途中に突然

Err.clear

という1行が入っています。

これはなにかというと、前述の「型のエラー」は一度発生したら値が残るためです。(on error resume nextでエラーを無視して進めているので)

一度「型のエラー」を出していると、ずっと「Err.number =13」のままです。

Do while ~ Loop内の「型のエラー」の際は、そこで強制終了せずに繰り返すようにしておりますので、一度エラー起こすと、繰り返した後に正しく入力しても毎回エラー処理に誘導されてしまいます。
なので、いったんリセットさせているという処理です。

まとめ

最後のErr.clearなど、もっと最適な位置に書くこともできましたが、つぎはぎしながら最後仕上げたのでご容赦ください。

このリマインダーを作ってて、あまりに基本的なことがたくさん盛り込まれていたのでつい書き込んでしまいました。

ここまで読んでくれる人がホントにいるのかわかりませんが、お読みいただいた方、まことにありがとうございました。

今後もわかりやすく、お役に立てる内容を書ければと思いますので、どうぞよろしくお願いします。

ちょっと役立ったなと思ったら、サポートいただけると嬉しいです。マウスを買い替える資金になります!