連載
» 2014年08月05日 18時00分 UPDATE

VBA/マクロ便利Tips:Excelの伝票処理で使える! 関数で日付から曜日を取得し、月末の日を求め、和暦に変換

業務効率化に役立つVBA/マクロのさまざまなTipsをコード例を交えて紹介していきます。今回は、WeekDay関数/WeekdayName関数で日付から曜日を取得する方法、DateSerial関数で月末の日を取得する方法、Format関数で西暦の日付を和暦に変換する方法を解説します。

[薬師寺国安,PROJECT KySS]
「VBA/マクロ便利Tips」のインデックス

連載目次

※本Tipsの環境:Windows 8.1 Enterprise(64ビット)+Excel 2013


 今回は日付に関するTipsを紹介する。日付を入力すると曜日が自動的に取得できたり、指定した月が何日まであるか(30日か31日かなど)、また日付を和暦に変換したり、といったTipsについて解説する。

 これらのTipsを知っているだけで、日付データを扱う場合において、効率よく作業を行うことができるだろう。ぜひ、ここで紹介する3つのTipsを会得してもらいたい。

WeekDay関数とWeekdayName関数で日付から曜日を取得する

 まずは、「日付から曜日を取得する」Tipsだ。

 日付から曜日を取得するには「WeekDay({date})」関数と「WeekdayName({weekday})」関数を使用する。

 {date}には日付を表す文字列を指定し、{weekday}には、WeekDay関数で取得された、曜日を表す数値を指定する。曜日を表す数値は、「1」(日曜日)〜「7」(土曜日)となる。

 図1のように、「入力日」を入力するセルと、「OK」ボタンが配置されているとしよう。

ExcelVBATips14_01.png 図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
リスト1 日付から曜日を取得するマクロ

 まず、4行目で「入力日」セルに入力された値が、日付かどうかを判別するために、IsDate関数を使用する。入力された値が日付であった場合は、5〜6行目の処理を行う。

 5行目の変数「曜日」には、WeekDay関数にセル「C2」に入力された値を指定して、曜日を表す数値を取得する。6行目では、WeekdayName関数に、曜日を表す数値の格納されている変数「曜日」を引数に指定して、「D2」のセルに曜日を表示している。

 「入力日」セルに入力された値が、日付でなかった場合は、8行目のように警告メッセージを表示して処理を抜ける。

 リスト1のマクロを「OK」ボタンに関連付け、実行した結果が図2だ。

ExcelVBATips14_02.png 図2 日付を入力して曜日が表示された

DateSerial関数で月末の日を取得する

 さて、「月末の日を取得する」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」ボタンが配置されているとしよう。

ExcelVBATips14_03.png 図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 月末の日を取得するマクロ

 まず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だ。

ExcelVBATips14_04.png 図4 「日付入力」セルに、日付を入力して「OK」ボタンをクリックした

Format関数で西暦で入力した日付を和暦に変換する

 最後に「和暦に変換する」Tipsを紹介しよう。西暦で入力した日付を和暦に変換する必要性は、日常業務においても多々あるのではないだろうか。「2014/10/10」を、「平成26年10月10日」に変換する作業は、請求書などを作成する場合において、特に利用される頻度が高いと思う。そのTipsを紹介しよう。

 和暦に変換するには、「Format({expression},{style})」関数を使う。

 {expression}には、有効な式を指定する。これは必須の引数だ。{style}には、書式指定文字列を指定する。これは省略可だ。書式指定文字列については「カスタムの日付と時刻の書式指定文字列」を参照してほしい。

 図5のように、日付を入力するセルと「変換」ボタンが配置されているとしよう。

ExcelVBATips14_05.png 図5 日付入力セルと「変換」ボタンを配置する

 日付セルに日付を入力して、その日付を和暦に変換するマクロはリスト3になる。

Sub 和暦に変換()
 Range("O2").Value = Format(Range("N2"), "ggg") & Format(Range("N2"), "e年") & Format(Range("N2"), "mm月") & Format(Range("N2"), "dd日")
End Sub
リスト3 和暦に変換するマクロ

 Format関数に、「N2」セルに入力した日付を指定する。Typeには、「ggg」で元号、「e」で和暦年、「mm」で「01」という書式の月、「dd」で「01」という書式の日を表す。この値を「O2」のセルに表示する。

 このリスト3のマクロを「変換」ボタンに関連付け、実行すると図6のようになる。

ExcelVBATips14_06.png 図6 西暦を和暦に変換した

 なお今回のTipsでは、日付未入力の場合のエラー処理は行っていない。各自が実装してみてほしい。

伝票処理などで活用しよう

 今回は日付に関するTipsを3つ紹介した。どれも単独でのサンプルになっているので、どのような場合に、このTipsを利用すれば便利か、その用途を読者自身でも考えていただきたい。

 今回のTipsは、必ず日常の業務では必要になる処理であると、筆者は思っている。曜日を取得したり、西暦を和暦に変換したりする処理は、Excelで作成する伝票処理などには、必要不可欠な処理ではないかと思う。ぜひ、システムに取り入れていただきたい。

著者プロフィール

kuniyasu.jpg

薬師寺 国安(やくしじ くにやす) / 薬師寺国安事務所

薬師寺国安事務所代表。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© 2017 ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。