業務効率化に役立つVBA/マクロのさまざまなTipsをコード例を交えて紹介していきます。今回は、WeekDay関数/WeekdayName関数で日付から曜日を取得する方法、DateSerial関数で月末の日を取得する方法、Format関数で西暦の日付を和暦に変換する方法を解説します。
今回は日付に関するTipsを紹介する。日付を入力すると曜日が自動的に取得できたり、指定した月が何日まであるか(30日か31日かなど)、また日付を和暦に変換したり、といったTipsについて解説する。
これらのTipsを知っているだけで、日付データを扱う場合において、効率よく作業を行うことができるだろう。ぜひ、ここで紹介する3つのTipsを会得してもらいたい。
まずは、「日付から曜日を取得する」Tipsだ。
日付から曜日を取得するには「WeekDay({date})」関数と「WeekdayName({weekday})」関数を使用する。
{date}には日付を表す文字列を指定し、{weekday}には、WeekDay関数で取得された、曜日を表す数値を指定する。曜日を表す数値は、「1」(日曜日)〜「7」(土曜日)となる。
図1のように、「入力日」を入力するセルと、「OK」ボタンが配置されているとしよう。
図1で「入力日」セルに、日付を入力して曜日を表示するマクロはリスト1になる。VBE(Visual Basic Editor)を起動してModule1内にリスト1のマクロを記述する。
Option Explicit Sub 曜日の取得() Dim 曜日 As Long If IsDate(Range("C2").Value) = True Then 曜日 = Weekday(Range("C2")) Range("D2").Value = WeekdayName(曜日) Else MsgBox "日付が不正です。" Exit Sub End If End Sub
まず、4行目で「入力日」セルに入力された値が、日付かどうかを判別するために、IsDate関数を使用する。入力された値が日付であった場合は、5〜6行目の処理を行う。
5行目の変数「曜日」には、WeekDay関数にセル「C2」に入力された値を指定して、曜日を表す数値を取得する。6行目では、WeekdayName関数に、曜日を表す数値の格納されている変数「曜日」を引数に指定して、「D2」のセルに曜日を表示している。
「入力日」セルに入力された値が、日付でなかった場合は、8行目のように警告メッセージを表示して処理を抜ける。
リスト1のマクロを「OK」ボタンに関連付け、実行した結果が図2だ。
さて、「月末の日を取得する」Tipsは、どんな場合に役に立つだろう。1月から12月までが何日まであるかは、ほとんどの方がご存じのはずだ。しかし、パソコンはそれを知らない。教えてやらなければPCが勝手に月末の日を導き出してくれることはない。
今回のサンプルのように、今日の日付を入力しただけで、今月は何日まであるのかを教えてくれれば、便利ではないだろうか。今月が30日か31日か、28日か29日かを再認識して、その予定で業務を進めることができる。
月末の日を取得するには「DateSerial({year},{month},{day})」関数を使う。
{year}には「年」を表す1〜9999の整数型(Integer)の式を、{month}には月を表す1〜12の整数型(Integer)の式を、{day}には日を表す1〜31の整数型(Integer)の式をそれぞれ指定する。全て必須だ。
図3のように日付を入力するセルと、「OK」ボタンが配置されているとしよう。
「日付入力」セルに日付を入力して、その月末の日を取得するマクロはリスト2になる。
Sub 月末の日を取得() Dim 月末日 As Date Dim 年月日 As Date 年月日 = DateSerial(Year(Range("I2").Value), Month(Range("I2").Value) + 1, 1) - 1 Range("J2").Value = Month(Range("I2").Value) & "月は" & Right(年月日, 2) & "日まであります" End Sub
まず2行目と3行目でDate型の変数「月末日」と「年月日」を宣言する。4行目では、変数「年月日」には、DateSerial関数を使って、セル「I12」に入力されている「年」と「月」を指定する。「月」の値には1を足す必要がある。「日」には「1」を指定している。そして、これらの値から1を引いている。
例えば4月の月末は30日なので、「4月30日」は「5月1日」の前日ということになる。そこで「月」の値には1を足し、全体の値から1を引くことで、入力した「月」の月末を取得できることになる。
図4のように「2020/2/1」と入力しても、実際に必要な値は、「2020」という「年」と、「2」という月だけの値で、「1」という日は特に関係はない。
5行目では、「J2」のセルにRight関数を使って、「年月日」変数の値の右から2文字を取り出している。例えば、変数「年月日」に格納された値が、「2014/4/30」なら右から2文字の「30」を取り出すことになる。これで取得した月末の月と日を表示している。
リスト2のマクロを「OK」ボタンに関連付け、実行した結果が図4だ。
最後に「和暦に変換する」Tipsを紹介しよう。西暦で入力した日付を和暦に変換する必要性は、日常業務においても多々あるのではないだろうか。「2014/10/10」を、「平成26年10月10日」に変換する作業は、請求書などを作成する場合において、特に利用される頻度が高いと思う。そのTipsを紹介しよう。
和暦に変換するには、「Format({expression},{style})」関数を使う。
{expression}には、有効な式を指定する。これは必須の引数だ。{style}には、書式指定文字列を指定する。これは省略可だ。書式指定文字列については「カスタムの日付と時刻の書式指定文字列」を参照してほしい。
図5のように、日付を入力するセルと「変換」ボタンが配置されているとしよう。
日付セルに日付を入力して、その日付を和暦に変換するマクロはリスト3になる。
Sub 和暦に変換() Range("O2").Value = Format(Range("N2"), "ggg") & Format(Range("N2"), "e年") & Format(Range("N2"), "mm月") & Format(Range("N2"), "dd日") End Sub
Format関数に、「N2」セルに入力した日付を指定する。Typeには、「ggg」で元号、「e」で和暦年、「mm」で「01」という書式の月、「dd」で「01」という書式の日を表す。この値を「O2」のセルに表示する。
このリスト3のマクロを「変換」ボタンに関連付け、実行すると図6のようになる。
なお今回のTipsでは、日付未入力の場合のエラー処理は行っていない。各自が実装してみてほしい。
今回は日付に関するTipsを3つ紹介した。どれも単独でのサンプルになっているので、どのような場合に、このTipsを利用すれば便利か、その用途を読者自身でも考えていただきたい。
今回のTipsは、必ず日常の業務では必要になる処理であると、筆者は思っている。曜日を取得したり、西暦を和暦に変換したりする処理は、Excelで作成する伝票処理などには、必要不可欠な処理ではないかと思う。ぜひ、システムに取り入れていただきたい。
薬師寺 国安(やくしじ くにやす) / 薬師寺国安事務所
薬師寺国安事務所代表。Visual Basicプログラミングと、マイクロソフト系の技術をテーマとした、書籍や記事の執筆を行う。
1950年生まれ。事務系のサラリーマンだった40歳から趣味でプログラミングを始め、1996年より独学でActiveXに取り組む。
1997年に薬師寺聖とコラボレーション・ユニット「PROJECT KySS」を結成。
2003年よりフリーになり、PROJECT KySSの活動に本格的に参加。.NETやRIAに関する書籍や記事を多数執筆する傍ら、受託案件のプログラミングも手掛ける。
Windows Phoneアプリ開発を経て、現在はWindowsストアアプリを多数公開中。
Microsoft MVP for Development Platforms - Client App Dev(Oct 2003-Sep 2012)。
Microsoft MVP for Development Platforms - Windows Phone Development(Oct 2012-Sep 2013)。
Microsoft MVP for Development Platforms - Client Development(Oct 2013-Sep 2014)。
Copyright © ITmedia, Inc. All Rights Reserved.