[ExcelVBA] 指定月の最初日と最終日の日付を取得する関数
何か処理をするときに何日から何日までって日付で挟むことないですか? それが、「この月」っていう範囲なことないですか? スタートの1日はともかく、最終日は30か31か、はたまた28か29か、その都度取得しなきゃいけないのが微妙に面倒で、頻繁じゃないけどたま~に書くので、そろそろ面倒になってきて関数化しました。多分ググればいっぱい出てくるけど。
オレオレ関数専用functionsモジュールへ
私は自分用にいくつか汎用的なモジュールを持っていて、新しく何か作るときにインポートして使ってるんですが、そのなかに「functions」という名前の標準モジュールがあります。
これはその名のとおり関数を書いてあるモジュールで、たまに使う微妙にめんどくさいやつ(特定の名前のシートの存在有無を調べるとか、シートの最終端を取得するとか、アルファベットに対応する数値を取得するとか)を関数化してストックしてるので、今回そこに追記したオレオレ関数です。
月の最初日を取得する関数
Public Function getFirstDay(tgtDay As Date) As Date '## 指定月の1日を日付型で取得 getFirstDay = DateSerial(Year(tgtDay), Month(tgtDay), 1) '1日を返す End Function
DateSerial関数で、日だけを 1 で固定して日付を生成することで、その月の初日を取得することができます。
月の最終日を取得する関数
Public Function getLastDay(tgtDay As Date) As Date '## 指定月の最終日を日付型で取得 getLastDay = DateSerial(Year(tgtDay), Month(tgtDay) + 1, 0) '最終日を返す End Function
DateSerial関数は、日付として認識できない数値が指定されていた場合、日付と認識できる数値へ調整してくれる特徴があります。これを利用して、月に「+1」と記述して「次月」となるように指定します。続けて日を「0」を指定すると「次月1 日の前日」と認識され、「当月の末日」を取得することができるのです。これで 30 か 31 かはたまた 28 か 29 か悩むことがありません。
使う側の記述
Debug.Print getFirstDay(Date) '今月の最初日を日付型で取得 Debug.Print getLastDay(Date) '今月の最終日を日付型で取得
例では本日の日付を関数に渡してるので「今月」を取得することになりますが、渡す日付を変えれば違う月を取得できます。関数を用意しておくと記述がスッキリしていいですよね。
ExcelVBAに興味をお持ちの方は、こちらの記事もどうぞ!
- これからExcelのマクロを始めたいという方に!簡単な練習問題作りました。
- 私がExcelVBAでよく使う便利なコード・スニペットまとめ
- プログラム初心者さんへ贈る、エラーが起きたら試してみて欲しいこと
- ExcelVBAのクラスモジュールって何?という人向けの使い方まとめ
書籍を執筆しています。
コメントは承認制ですので、反映までしばらくお待ち下さい。(稀にスパムの誤判定にて届かないこともあるようですので、必要な際はお問い合わせからお願い致します。)
YouTubeでQ&Aコンテンツを企画しています
運営しているYouTubeチャンネルで、ご相談やご質問を募集しています。動画のコメントやお問い合わせページからお気軽にご相談をお寄せください。