請求書発行などで、当月16日~翌月15日までの日数の算出が必要となっております。
当月16日のデータ(例:2010/11/16)が、ワークシート(1)のB1セルに
格納されているものとして、翌月15日までの日数をMsg出力するマクロ記述をご教授ください。
どうぞよろしくお願いいたします。
いろいろな手順や方法がありますので下記は一例です
下記では、年月を取り出し(year関数、month関数)て、年/翌月/15という形に整形(数学的加算と文字列加算)の後に差(DateDiff関数)を求めるという式になっています
Sub Macro1() With Worksheets(1).Range("B1") If Not IsDate(.Value) Then MsgBox "セルの中身は日付ではありません" Else MsgBox DateDiff("d", .Value, CDate(Year(.Value) & "/" & Month(.Value) + 1 & "/15")) End If End With End Sub
同様のことはマクロを使わずともワークシート上でも可能です
(結果が1900/1/29 0:00となってしまう場合はセルの書式設定を「標準」などに変更する必要があります)
=DATEVALUE(IF(MONTH(B1)=12,YEAR(B1)+1&"/1/15",YEAR(B1)&"/"&MONTH(B1)+1&"/15"))-B1
普通にマクロでやるならこんな感じ。
Sub Macro1() Dim myDate As Date myDate = Range("B1").Value MsgBox DateSerial(Year(myDate), Month(myDate) + 1, 1) - myDate + 15 End Sub
確か月の最終日を出す関数があったのでそれを使ってみるとこれだけでいけます。
※分析ツールの関数なのでアドインで分析ツールにチェックが必要。
Sub Macro2() MsgBox Evaluate("EOMONTH(B1,0)-B1+16") End Sub
回答受付中は「コメント・トラックバックを表示しない」になっているので、2回目の回答で失礼します
回答1では年をまたぐ場合を考慮していない習作のほうを投稿してしまいましたので、ここに訂正いたします
Sub Macro2() With Worksheets(1).Range("B1") If Not IsDate(.Value) Then MsgBox "セルの中身は日付ではありません" ElseIf Month(.Value) = 12 Then MsgBox DateDiff("d", .Value, CDate(Year(.Value) + 1 & "/1/15")) Else MsgBox DateDiff("d", .Value, CDate(Year(.Value) & "/" & Month(.Value) + 1 & "/15")) End If End With End Sub
ご回答恐縮です。またブラッシュアップ版も再度投稿していただきましてありがとうございます。たいへん参考になりました。
早速にありがとうございます。いろいろな方法があるのですね、たいへん勉強になりました。