• ベストアンサー

エクセルVBAで、月の最終日セルを取得する方法を教えて下さい。

エクセルで、あるデータを入れるための、1ヶ月の表を作成しています。 1ヶ月は毎月21日から、翌月20日までです。 セルA1に、作成したい月の最初の日付、たとえば2008/5/21と入力し、 マクロボタンを押すと、 A5に2008/5/21、B5に2008/5/22、C5に2008/5/23・・・・(表示は21,22,23) と自動で出るようにしました。 この時5/31と6/1の間に罫線を1本、入れたいのです。 月によって、6/31と7/1の間、2/28と3/1の間というふうに。 月の最終日、もしくは最初を取得して、VBAで罫線を指定したいのですが、 この最終日の指定の方法がわかりません。 どのようにしたら良いか、教えて下さい。

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんにちは。 >この時5/31と6/1の間に罫線を1本、入れたいのです。 質問のタイトルの「月の最終日セルを取得する方法」では、難しくなりますから、1日にします。 つきの最終日を取得する方法と、1日を取得する方法は、同じようだけれども、違います。 '--------------------------- Dim myDate As Date Const mDATE As Date = #2/21/2008#  myDate = DateSerial(Year(mDATE), Month(mDATE) + 1, 0)  MsgBox Month(mDATE) & "月の最終日: " & Day(myDate) '--------------------------- Sub Test1() Dim i As Long With ActiveSheet For i = 1 To .Range("A65536").End(xlUp).Row  If IsDate(.Cells(i, 1).Text) Then   If Day(.Cells(i, 1).Value) = 1 Then    'Resize(,3) は、罫線の長さ    With .Cells(i, 1).Resize(, 3).Borders(xlEdgeTop)     .LineStyle = xlContinuous     .Weight = xlThin     .ColorIndex = 1 'xlAutomatic よりも、明示的に色を入れたほうが良い   End With   End If  End If Next End With End Sub

その他の回答 (3)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.4

例えば>月の最初の日付、たとえば2008/5/21と入力 の場合なら、その日付からMonthを取り5ですが Sub test01() dt = Cells(1, "A") MsgBox dt matu = DateSerial(Year(dt), Month(dt) + 1, 0) MsgBox matu End Sub のように月に+1し、日を0にすると月末日が取れます。 後は第5行の中でこの日付を探索すればよい。 探索は Findメソッド 総当り法 (付が縦に並んでおればMATHやVLOOKUPも使えます) などあります。 Sub test01() dt = Cells(1, "A") MsgBox dt matu = DateSerial(Year(dt), Month(dt) + 1, 0) MsgBox matu x = Range("A5:Z5").Find(what:=matu).Column With Range(Cells(5, x), Cells(10, x)).Borders(xlRight) .LineStyle = xlContinuous .Weight = xlThick End With MsgBox x End Sub Range("A5:Z5").は手抜きしてます。正してください 第5行~10行まで縦の罫線を引く例です。

回答No.3

DateSerialと言う関数があって、年月日に対応するバリアント型 (内部処理形式 Date の Variant) の値を返す関数です。 で、dateserial(2008,6,0)=2008/5/31(前月の最後の日)を返したり、dateserial(2009,1,0)=2008/12/31(前年の12/31)を返します。 またDate型は+1すれば、適切な日付を返してくれます。 Private Sub CommandButton1_Click() Dim targetDate As Date Dim c As Integer Dim d As Integer targetDate = Range("A1") '5行目をクリア Rows(5).Clear Rows(5).Borders(xlEdgeRight).LineStyle = xlNone 'データ列初期値 c = 1 '+1して21日になるまで繰り返す Do '1日ならその左に罫線を書く If Day(targetDate) = 1 Then With Cells(5, c).Borders(xlEdgeLeft) .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = xlAutomatic End With End If '日にちを書く Cells(5, c) = targetDate 'パラメータ+1 targetDate = targetDate + 1 c = c + 1 Loop While Day(targetDate) <> 21 End Sub p.s. 罫線のパラメータは適切に変更してください。(ANo.2参照)

  • marbin
  • ベストアンサー率27% (636/2290)
回答No.1

Day(日付) の戻り値が"1"だったら「ついたち」と判定できます。 あとはOffsetでしょうか。

関連するQ&A