【VBA】時間を操作する関数の使い方 ~ スケジュール管理の効率をアップする方法~

毎日のスケジュール管理で、こんな作業を手動でやっていませんか?
「今日から3日以内の締め切りを確認して、セルを赤くする」「毎朝決まった時間にデータを自動更新する」「2つの日付の差を計算して残り日数を出す」……どれも地味に時間がかかる作業です。
私も以前は、スケジュール表を開くたびに目視でチェックし、期日が迫っているセルを手動で色付けしていました。
それだけで1日30分以上を費やしていたのです。
VBAを使えば、こうした時間に関する作業をすべて自動化することができます。
この記事では、VBAで時間・日付を自由に操作できる6つの関数(Timer関数・TimeSerial関数・TimeValue関数・DateAdd関数・DateDiff関数・OnTimeメソッド)の基本的な使い方から、ス
ケジュール管理に直結する実践的な活用例までを、プログラミング初心者の方でもわかるように丁寧に解説していきます。
読み終えたころには、「このVBAを自分の仕事にすぐ使える!」と感じてもらえるはずです。
手作業のスケジュール管理が引き起こす3つの問題
スケジュール表を手動で更新し続けることには、見えないコストが積み重なっています。
VBAによる自動化を検討する前に、まず手作業がどれだけ非効率かを整理しておきましょう。
問題①:目視確認のせいで「見落とし」が発生する
期日が迫っているタスクを毎回目で確認する方法では、件数が増えるほど見落としのリスクが高まります。
「あの案件の締め切り、今日だったっけ?」と焦った経験がある方は多いのではないでしょうか。
重要な期日を見落とすと、信頼の喪失やクレームにつながることもあります。
VBAを使えば、「セルに入力されている日付が3日以内なら赤色、7日以内なら黄色に自動変化」という処理を実装でき、ヒューマンエラーをほぼゼロにすることができます。
問題②:定期的な更新作業をいつも手動でやっている
毎朝エクセルを開いて、昨日の日付をコピーして、今日の日付に書き直して……という作業を毎日繰り返している方もいます。
これは完全にVBAで自動化できる作業です。
OnTimeメソッドを使えば、「毎朝9時に特定のマクロを自動実行する」という仕組みを作ることができます。
手動で実行し忘れるリスクもなく、時間も節約できる一石二鳥の方法です。
問題③:日付計算をいちいち手動でやっている
「今日から納期まで何日あるか」「前回の作業からどれくらい日数が経過したか」を、カレンダーを見ながら手動で計算していませんか?
DateDiff関数を使えば、2つの日付の差を一瞬で計算してセルに表示することが可能です。
日付計算のミスが起きなくなり、計算にかかっていた時間ごと消えていきます。
VBAで時間を操作する6つの関数の基本的な使い方
ここからは、時間・日付を操作するVBAの関数を1つずつ解説していきます。
それぞれの関数の役割を理解することで、組み合わせた応用コードが自然に書けるようになります。
Timer関数|経過時間を計測する
Timer関数は、その日の深夜0時からの経過秒数を小数点以下も含めて返す関数です。
処理の実行時間を計測したいときに非常によく使われます。
スケジュール管理というよりは、「このマクロは何秒で完了するか?」を確認するための計測ツールとして使う場面が多い関数です。
Sub 処理時間計測()
Dim startTime As Double
Dim endTime As Double
' マクロ開始前の時刻を取得
startTime = Timer
' ここに時間を計りたい処理を書く(例:大量データの処理)
Dim i As Long
For i = 1 To 100000
' 何らかの処理
Next i
' マクロ終了後の時刻を取得
endTime = Timer
' 経過時間を秒で表示
MsgBox "処理時間:" & Format(endTime - startTime, "0.00") & "秒", vbInformation
End Sub
コードの流れを解説します。
startTime = Timer でマクロ開始時の秒数を記録し、処理が終わった後に endTime = Timer でもう一度記録します。
endTime – startTime の引き算で、処理にかかった時間が秒単位で求められる仕組みです。
Format 関数で小数点2桁に整えて表示しています。
「このマクロが重い気がする……どこで時間がかかっているのか?」を調べるデバッグ作業にも役立ちます。
TimeSerial関数|時・分・秒を指定して時刻を作る
TimeSerial関数は、時(Hour)・分(Minute)・秒(Second)の3つの数値を指定して、時刻型(Time型)のデータを生成する関数です。
書き方は TimeSerial(時, 分, 秒) とシンプルで、計算した結果を時刻として扱いたいときに便利です。
Sub TimeSerial使用例()
' 9時30分0秒を生成
Dim myTime As Date
myTime = TimeSerial(9, 30, 0)
MsgBox "設定した時刻:" & Format(myTime, "hh:mm:ss"), vbInformation
' 現在時刻の1時間30分後を計算
Dim futureTime As Date
Dim nowHour As Integer
Dim nowMinute As Integer
nowHour = Hour(Now())
nowMinute = Minute(Now())
' 分に90を足す(1時間30分後)
futureTime = TimeSerial(nowHour, nowMinute + 90, 0)
MsgBox "1時間30分後の時刻:" & Format(futureTime, "hh:mm"), vbInformation
End Sub
コードの流れを解説します。
TimeSerial(9, 30, 0) で「9時30分0秒」という時刻データを生成しています。
Hour(Now()) や Minute(Now()) で現在の時・分を取得し、そこに数値を加算して将来の時刻を計算することもできます。
分に90を指定すると、VBAが自動的に「1時間30分」と解釈してくれるため、計算結果が nowMinute + 90 で60を超えても正しい時刻に変換されます。
TimeValue関数|文字列から時刻データを作る
TimeValue関数は、「"09:30:00″」のような文字列を時刻型(Date型)に変換する関数です。
セルに入力された時刻文字列をVBAで計算に使いたいときや、設定ファイルに書いてある時刻文字列を読み込むときに活躍します。
Sub TimeValue使用例()
' 文字列"09:30:00"を時刻データに変換
Dim myTime As Date
myTime = TimeValue("09:30:00")
' 現在時刻と比較する
If Now() < myTime Then
MsgBox "まだ9時30分になっていません。", vbInformation
Else
MsgBox "9時30分を過ぎています。", vbInformation
End If
' セルに入力されている時刻文字列を変換して計算する
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
Dim cellTime As Date
cellTime = TimeValue(ws.Range("B2").Value) ' セルB2に"13:00"などが入力されている前提
MsgBox "セルの時刻:" & Format(cellTime, "hh:mm"), vbInformation
End Sub
コードの流れを解説します。
TimeValue(“09:30:00") で文字列を時刻型に変換し、Now() と比較することで「現在時刻が基準時刻を過ぎているかどうか」を判定できます。
セルに入力された文字列(例:「13:00」)も同様に変換できるため、「スケジュール表のB列に入力された開始時刻を読み込んでアラームを設定する」といった応用コードへの橋渡しになる関数です。
DateAdd関数|日付・時刻を加減算する
DateAdd関数は、指定した日付や時刻に対して「〇日後」「〇ヶ月後」「〇時間後」を計算する関数です。
スケジュール管理において、締め切り日の自動計算や次回作業日の自動設定に非常に役立ちます。
書き方は DateAdd(単位, 加算値, 基準日) で、単位には以下の文字列を使います。
単位文字列意味"d"日"m"月"yyyy"年"h"時"n"分"s"秒
Sub DateAdd使用例()
Dim baseDate As Date
baseDate = Now() ' 本日の日付と時刻
' 3日後の日付を計算
Dim after3Days As Date
after3Days = DateAdd("d", 3, baseDate)
MsgBox "3日後:" & Format(after3Days, "yyyy/mm/dd"), vbInformation
' 2ヶ月後の日付を計算
Dim after2Months As Date
after2Months = DateAdd("m", 2, baseDate)
MsgBox "2ヶ月後:" & Format(after2Months, "yyyy/mm/dd"), vbInformation
' 1年後の日付を計算
Dim after1Year As Date
after1Year = DateAdd("yyyy", 1, baseDate)
MsgBox "1年後:" & Format(after1Year, "yyyy/mm/dd"), vbInformation
' マイナス値で「〇日前」も計算できる
Dim before7Days As Date
before7Days = DateAdd("d", -7, baseDate)
MsgBox "7日前:" & Format(before7Days, "yyyy/mm/dd"), vbInformation
End Sub
コードの流れを解説します。
DateAdd(“d", 3, baseDate) で「baseDate から3日後」の日付を計算します。
第2引数にマイナスの値を入れると「〇日前」も計算可能。
「契約開始日から1年後の更新日を自動計算してセルに表示する」「今日から30日後の支払期限を自動入力する」といった実務に直結するコードがたった1行で書けるのが、この関数の強みです。
DateDiff関数|2つの日付の差を計算する
DateDiff関数は、2つの日付の差を指定した単位(日数・月数・年数など)で返す関数です。
「締め切りまであと何日?」「前回の点検から何ヶ月経過した?」という計算を一瞬で処理できます。
書き方は DateDiff(単位, 開始日, 終了日) です。
Sub DateDiff使用例()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
' A列に「タスク名」、B列に「締め切り日」が入力されている前提
Dim lastRow As Long
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
' C列に残り日数を自動入力する
Dim i As Long
For i = 2 To lastRow
Dim deadline As Date
deadline = ws.Cells(i, 2).Value ' B列の締め切り日を取得
' 今日から締め切りまでの残り日数を計算
Dim daysLeft As Long
daysLeft = DateDiff("d", Date, deadline)
' C列に残り日数を入力
ws.Cells(i, 3).Value = daysLeft & "日"
Next i
MsgBox "残り日数の計算が完了しました。", vbInformation
End Sub
コードの流れを解説します。
Date は「本日の日付」を返すVBAの組み込み関数です。
DateDiff(“d", Date, deadline) で「今日から締め切り日までの日数差」を計算しています。
For ループで2行目から最終行まで1行ずつ処理し、B列の締め切り日を読み取ってC列に残り日数を書き込んでいきます。
残り日数がマイナスになった場合は「締め切り超過」という意味になるため、条件分岐を加えてセルの色を変える処理と組み合わせると、さらに実用的なスケジュール管理ツールになります。
OnTimeメソッド|指定した時刻にマクロを自動実行する
OnTimeメソッドは、「〇時〇分になったら指定のマクロを自動実行する」という時刻指定実行を実現するメソッドです。
エクセルを開いている状態であれば、指定時刻になったときに自動でマクロが起動します。
毎朝の定時処理や、一定時間ごとのデータ更新に活用できます。
' ① マクロを予約するSubプロシージャ
Sub OnTimeマクロ予約()
' 今日の9時00分00秒にScheduledMacroを実行するよう予約
Application.OnTime TimeValue("09:00:00"), "ScheduledMacro"
MsgBox "9時00分に自動実行するよう予約しました。", vbInformation
End Sub
' ② 予約された時刻に実行されるSubプロシージャ
Sub ScheduledMacro()
MsgBox "定時処理を開始します!", vbInformation
' ここに自動実行させたい処理を書く
' 例:今日の日付をA1セルに入力
ThisWorkbook.Worksheets("Sheet1").Range("A1").Value = Now()
End Sub
' ③ 予約をキャンセルするSubプロシージャ
Sub OnTimeキャンセル()
Application.OnTime TimeValue("09:00:00"), "ScheduledMacro", , False
MsgBox "予約をキャンセルしました。", vbInformation
End Sub
' ④ 現在時刻から〇秒後に実行する(相対時刻指定)
Sub 30秒後に実行()
Application.OnTime Now() + TimeValue("00:00:30"), "ScheduledMacro"
MsgBox "30秒後に実行するよう予約しました。", vbInformation
End Sub
コードの流れを解説します。
Application.OnTime TimeValue(“09:00:00"), “ScheduledMacro" の書き方で「9時00分に ScheduledMacro というマクロを実行する」という予約ができます。
キャンセルしたいときは、第4引数に False を渡して Application.OnTime を再実行します。
Now() + TimeValue(“00:00:30") のように書くと、「現在時刻から30秒後」という相対的な時刻指定が可能になります。
注意点として、OnTimeメソッドはエクセルが開いている間しか機能しません。
「パソコンを閉じたら自動実行が止まる」という点を覚えておきましょう。
実践!スケジュール管理を自動化するVBAの活用例
ここからが本記事のメインパートです。
ここまで学んだ6つの関数を組み合わせて、実務で使えるスケジュール管理の自動化コードを3つ紹介します。
活用例①|期日に応じてセルの色を自動変更するVBA(3日以内→赤・7日以内→黄色)
私が実際に自分のスケジュール管理に使っているコードです。
A列にタスク名、B列に締め切り日が入力されているシートを想定しています。
Sub 期日色分け自動処理()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
Dim lastRow As Long
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
' まず既存の背景色をリセット
ws.Range("A2:C" & lastRow).Interior.ColorIndex = xlNone
Dim i As Long
For i = 2 To lastRow
' B列の締め切り日が空欄の行はスキップ
If ws.Cells(i, 2).Value = "" Then GoTo NextLine
Dim deadline As Date
deadline = CDate(ws.Cells(i, 2).Value) ' B列の日付を取得
' 今日から締め切り日までの残り日数を計算
Dim daysLeft As Long
daysLeft = DateDiff("d", Date, deadline)
' C列に残り日数を表示
ws.Cells(i, 3).Value = daysLeft & "日前"
' 残り日数に応じてセル色を変更
If daysLeft < 0 Then
' 期日超過:赤(濃い)
ws.Range("A" & i & ":C" & i).Interior.Color = RGB(255, 0, 0)
ws.Range("A" & i & ":C" & i).Font.Color = RGB(255, 255, 255) ' 白文字
ElseIf daysLeft <= 3 Then
' 3日以内:赤(薄い)
ws.Range("A" & i & ":C" & i).Interior.Color = RGB(255, 153, 153)
ElseIf daysLeft <= 7 Then
' 7日以内:黄色
ws.Range("A" & i & ":C" & i).Interior.Color = RGB(255, 255, 153)
End If
NextLine:
Next i
MsgBox "スケジュールの色分け処理が完了しました。", vbInformation
End Sub
コードの流れを解説します。
処理の最初に Interior.ColorIndex = xlNone で既存の背景色をリセットしています。
これを入れておかないと、前回実行時の色が残り続けてしまうためです。
DateDiff(“d", Date, deadline) で残り日数を計算し、その値に応じてIf分岐で色を塗り分けています。
期日超過(マイナス)は濃い赤に白文字で視認性を高め、3日以内は薄い赤、7日以内は黄色という3段階で色を変えています。
このマクロをボタンに登録しておけば、毎朝1クリックでスケジュール表が自動的に色分けされる仕組みの完成です。
活用例②|セルを点滅させて緊急タスクに気づかせるVBA
期日が今日・明日のタスクを点滅させることで、絶対に見逃さない仕組みを作ります。
OnTimeメソッドを使って、0.5秒ごとにセルの色をオン・オフ切り替えることで「点滅」を再現します。
' 点滅フラグ(グローバル変数)
Dim isBlinking As Boolean
' ① 点滅を開始するSubプロシージャ
Sub 点滅開始()
isBlinking = True
Call セル点滅処理
MsgBox "点滅を開始しました。停止するには「点滅停止」マクロを実行してください。"
End Sub
' ② 点滅を停止するSubプロシージャ
Sub 点滅停止()
isBlinking = False
' 色をリセットして点滅を止める
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
ws.Range("A2:C10").Interior.ColorIndex = xlNone
MsgBox "点滅を停止しました。"
End Sub
' ③ 点滅処理の本体(OnTimeで繰り返し呼び出される)
Sub セル点滅処理()
If Not isBlinking Then Exit Sub ' フラグがFalseなら終了
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
' 今日か明日が締め切りのセルだけを点滅させる
Dim lastRow As Long
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
Dim i As Long
For i = 2 To lastRow
If ws.Cells(i, 2).Value = "" Then GoTo NextLine2
Dim daysLeft As Long
daysLeft = DateDiff("d", Date, CDate(ws.Cells(i, 2).Value))
' 残り1日以内のタスクを点滅
If daysLeft >= 0 And daysLeft <= 1 Then
If ws.Cells(i, 1).Interior.Color = RGB(255, 0, 0) Then
ws.Range("A" & i & ":C" & i).Interior.ColorIndex = xlNone
Else
ws.Range("A" & i & ":C" & i).Interior.Color = RGB(255, 0, 0)
End If
End If
NextLine2:
Next i
' 0.5秒後に再度このSubを呼び出す(ループ処理)
Application.OnTime Now() + TimeValue("00:00:01"), "セル点滅処理"
End Sub
コードの流れを解説します。
isBlinking というグローバル変数をフラグとして使い、点滅の開始・停止を制御しています。
セル点滅処理 の末尾に Application.OnTime Now() + TimeValue(“00:00:01"), “セル点滅処理" と書くことで、1秒ごとに自分自身を呼び出し続けるループ構造を作っています。
停止したいときは isBlinking = False にするだけで、次の呼び出し時に If Not isBlinking Then Exit Sub で処理が止まります。
活用例③|毎朝定刻に自動でスケジュール更新マクロを実行する
OnTimeメソッドを使って、エクセルを起動したときに「毎朝9時に期日色分け処理を自動実行する」という予約を設定します。
' Workbook_Openイベントに書く(ThisWorkbookのコードウィンドウに記述)
Private Sub Workbook_Open()
' エクセルを開いたときに9時00分の実行を予約する
Application.OnTime TimeValue("09:00:00"), "期日色分け自動処理"
MsgBox "本日9時00分にスケジュール更新マクロを予約しました。", vbInformation
End Sub
コードの流れを解説します。
Workbook_Open はエクセルファイルを開いたとき自動的に実行されるイベントプロシージャです。
これをThisWorkbookのコードウィンドウに書いておくと、ファイルを開くたびに自動でOnTimeの予約が設定される仕組みになります。
あとは毎朝エクセルを開くだけで、9時になったら「活用例①」の期日色分けマクロが自動で走り、スケジュール表が最新状態に更新されます。
VBAで時間操作をマスターしたら、次は副収入へ
ここまで読んでくれた方は、時間操作に関するVBAの基本を一通り理解できたと思います。
実は、このVBAスキルは仕事の効率化だけでなく、副収入を得るためにも活用できるんです。
私自身の経験をお伝えします。
スケジュール管理の自動化マクロを作れるようになった頃、「このスキルを収入につなげられないか?」と考え始め、スキルを販売できるココナラを利用してみることに。
最初のうちは信頼度がゼロなので、なかなか仕事を獲得することができませんでした。
そこで自己紹介やポートフォリオを充実させ、単価が低くても作業量をこなして実績を積み重ねていきました。
登録から1年ほど経ったころ、VBAスキルを活かしたマクロ開発の依頼を受注できるようになり、月に2万~3万円の副収入を得ることができました。
リピートしてくれる依頼者も増え、継続的な収入につながっていったのです。
副業として「隙間時間にVBAの仕事をしたい」という方には、まずはスキルを実績としてまとめたプロフィールを作ることからスタートするのがおすすめです。
関連記事「【体験談あり】VBAスキルで副収入を得る方法|未経験から案件獲得まで」では、私がゼロから副収入を得るまでの具体的な方法をまとめていますので、合わせて読んでみてください。
→ → → VBAスキルで副収入をゲットする方法はこちら
より高度な案件を獲得する方法
ある程度のスキルが身についてきたら、案件の単価や規模を上げることも視野に入ります。
私はクラウドワークス テックに登録し、本業以外の時間(1日4時間稼働可能・完全リモート)という条件で案件を紹介してもらいました。
事前のサポートが手厚く、「どのような仕事なのか」「自分に務まるのか」を担当者と一緒に確認できるため、安心して副業をスタートさせることができます。
月に10万円程度の報酬を受け取ることができた一方で、仕事内容によっては本業との掛け持ちがきつく感じることもあった!のが正直なところです。
VBAスキルで副業をする際は、報酬金額だけでなく「自分に務まるか」「本業を疎かにせず作業時間を確保できるか」をしっかり検討することが大切だと実感しています。
時間操作VBAを使う際の注意点
注意点①:OnTimeはエクセルが開いている間しか機能しない
OnTimeメソッドは、エクセル(正確にはExcelのアプリケーション)が起動している状態でなければ動作しません。
パソコンをシャットダウンしたり、エクセルを閉じてしまうと予約は自動的に消えます。
毎朝ファイルを開く運用と組み合わせることで、実用的な自動化が実現できます。
注意点②:DateDiffは「日の差」であって「経過日数」ではない
DateDiff(“d", Date, deadline) は日付の差を返しますが、例えば今日が1月1日で締め切りが1月3日なら「2」が返ります。
「2日後」という意味なので直感的ですが、月またぎや年またぎのケースでも正確に計算してくれるので安心です。
注意点③:CDate関数でエラーが起きることがある
セルに入力されている日付を CDate() で変換する際、セルが空欄だったり日付ではない文字列が入っていたりするとエラーが発生します。
事前に If ws.Cells(i, 2).Value = “" Then GoTo NextLine のように空欄チェックを入れておくと安全です。
まとめ ~ 時間操作VBAを使いこなしてスケジュール管理を完全自動化しよう ~
この記事では、VBAで時間・日付を操作する6つの関数の基本的な使い方と、スケジュール管理を自動化する実践コードを解説してきました。
- Timer関数で処理時間を計測し、TimeSerial・TimeValue関数で時刻データを生成・変換する
- DateAdd関数で「〇日後」「〇ヶ月後」を計算し、DateDiff関数で残り日数を求める
- OnTimeメソッドを使えば、指定した時刻にマクロを自動実行する
これらを組み合わせることで、「期日に応じてセルを自動色分け」「緊急タスクをセル点滅で通知」「毎朝定時にスケジュール更新を自動実行」という3つの実践的な自動化が実現できます。
最初は基本コードをそのままコピペして動かすところから始めてみましょう。
動いた瞬間の「おお、動いた!」という感覚が、VBAをもっと学びたいという意欲につながっていきます。
もし「自分の業務に合わせた複雑なチェック処理を実装したい」「既存のマクロを改良したい」といったご要望がありましたら、マメBlogのエクセルマクロ開発依頼にご相談ください。
業務内容に合わせたオーダーメイドマクロを設定させていただきます。
最後まで読んでいただきありがとうございました。
エクセルVBAを使って面倒なルーティーン作業を自動化しちゃいましょう。






