• ベストアンサー

エクセル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/17068)
回答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

  • Excelでの当該月の最終日取得について

    Excel2000を使用しています。 質問なんですが、年月を指定してその月の最終日を取得するにはどうすれば良いのでしょうか? 例えば、2004年2月の最終日を取得する場合。 セルA1に 2004  セルA2に   2 を入力して セルA3に  29 と表示させたいのです。 よろしくお願いします。

  • Excel VBAについて

    Excel VBAについて ExcelのセルA1に日付データ(yyyy/mm/dd hh:mm)が入っています。 このエクセルファイルを開いている間、セルA1の日付(時分)が更新されたらマクロを実行するようにしたいのですが、どのようにしたらよいのでしょうか。 セルA1の日付データが更新されるタイミングは決まっていません。 セルA1の日付データが更新されたらマクロ実行というのが難しいのであれば、 10秒おきにマクロを実行というようなことができないでしょうか。 ご教授願います。

  • Excel VBA セルの指定方法について

    Excell2013です。 次のような表(一部)があります。   日   項目      額       分類   12 ノート 250 3 この、250を、別表の分類3の列(H列)の12日の行(15行)のセルに、そこにすでに値があれば250との合計値として入力したいのです。 データによって日付も分類も違いますので、マクロで自動的に入力したいのですが、どうもよくわかりません。 このような場合のVBAでの入力先セルの指定のしかたをどうすればよいのかどなたかご教示ください。

  • EXCEL VBA マクロ 日付

    こんばんわ。 EXCEL VBA マクロ の日付について質問があります。 セル"A1"で"年"(例:2008)、セル"B1"で"月"(例:5)を指定します。 C1からC500くらいまで(毎日増えていきます)日付が入っています。 A1、B1で指定した年月と同じC列の日付を 10桁スラッシュ区切りの形式(例:2008/05/15)で 右隣のセル(D列)にコピーしたいんです。 困ったことにC列は形式が決まっているわけではありません。 たとえば、2008年5月15日の場合、 ・20080515・2008年5月15日・2008.05.15・2008.5.15 ・2008/05/15・2008/5/15・08/05/15・2008-5-15 その他、いろいろ考えられます。 これをマクロでやるにはどうすればいいでしょうか。 毎月一回実行します。 日付の形式をチェックするところで やり方がわからなくて困っています。 よろしくお願いします。

  • VBA(エクセル)で『17.10.11』を『平成17年10月11日』の変換出力

    エクセルのVBAでプログラムをつくりました。 その内容はシート1でいくつかセルに値を入力した後、 マクロを実行すると指定したセルのそのままの内容が、シート2へコピーされるというものです。 そこで『日付』を入力する欄があるのですが、 そこには『17.10.11』と入力する欄があるのです。 これをシート2へコピー出力するときに 『平成17年10月11日』という風に方変換して 出力したいのです。どうすればいいでしょうか? どうか教えていただけたらうれしいです。 ちなみにコピープログラムはこんな感じにしています s.Cells(r, 1).Copy Sheets("Sheet2").Range("A1") A1セルに日付を入れる欄があるのでここを型変換して出力したいのです。助けてください。

  • エクセルVBAでワークシート関数のようにしたい

     例えば、セルA1に日付を入力して、セルB1に関数WEEKDAYが入力されていると、すぐセルA1の値を返してくれますが、これと同じことをVBAで再現したいのですが、可能でしょうか?  マクロやVBAでWEEKDAYを記述しても、「ツール」→「マクロ」→「マクロ」か「VBA」でやらないとA1の値をB1に返せないので、A1に日付を入力した瞬間、B1に値を返したいのですが、よろしくお願いします。

  • VBAで保護セルのコピー

    セルA17:Q27の範囲にデータがあります。 この中の1部のセルは保護されており編集できません。 これを1セットし下にコピーしていきたいです。 最初はA28:Q38 次はA39:A49・・・ 11行ずつとなります。 VBAでやるとどのように書けばいいのでしょうか? SpecialCellsで最終行を取得していく方法もありますが ほかにうまい方法はありますか? マクロを使わずExcelでコピー&貼り付けではコピー先の 保護部分が無効になってしまうためVBAでやろうと思っています。 -------------- もう1つ手間をかけますがB列には平日の日が入ります。 その月のdayから曜日を取得できるのは知っていますが 祝日なども除いた日を入れていくことができるでしょうか? 5月で言うと3,4,5日はコピーしません

  • 日付データで計算し、土、日分の2行追加する方法

    excel2010 日付データで計算し、土、日の2行を追加するマクロを作成しました。 途中は、正しく2行追加されます。 しかしながら、最終行が月曜日だけだと、最終行(月曜日)と最終行-1(金曜日)の間に 2行追加されません。 作成したマクロのどこが悪いのかを教えていただきたく。 構成は次の通り A列に日付のデータがA4セルから貼り付けられています。 A3セルは、題目で日付という文字列があります。 A列には、最初土、日の日付(行)がありません。 土、日の行、2行分を追加するために、計算式で行と次の行の差が3以上だったら 2行追加というマクロを設定します。 マクロは次の通り Sub donichiadd() '' Dim MxR As Long Dim h As Long MxR = Range("A65536").End(xlUp).Row - 1 For h = MxR To 5 Step -1 If Cells(h, 1) - Cells(h - 1, 1) >= 3 Then Cells(h, 1).Resize(2).EntireRow.insert End If Next h End Sub マクロは以上。 データが下記だとします。 A4セル:6/1 A5セル:6/2 A6セル:6/3 A7セル:6/4 A8セル:6/5 A9セル:6/8 A10セル:6/9 A11セル:6/10 A12セル:6/11 A13セル:6/12 A14セル:6/15 この状態でマクロを実行すると、 6/8と6/5の間は2行追加されますが、 6/15と6/12の間には2行追加されません。 尚、A15セルに6/16があった場合にマクロを実行すると、 6/15と6/12の間に2行追加されます。 最終行が月曜日だけだと、土、日分の2行を追加することが出来ない状態です。 どこが悪いのか教えていただきたく。

  • VBAを使用し10行おきにセルの下に罫線を引く方法

    Excel2003のVBAを使用し、10行おきに太い罫線をセルの下側に引きたいのですが、ご存知な方教えて頂けないでしょうか? 出来る事なら、セルの中に×が入っている行は自動的に省いて(選ばず)10行おきに罫線を引きたいと思っています。 先日、解決した内容の質問ですが、新たに3行目から最終行までとか罫線を引きたい行を指定出来るようにコーディングいただけると大変助かります。

  • エクセルで結合セルがあるため最終行が解りません。

    エクセルで結合セルがあるため最終行が解りません。 A列2行目と3行目が結合セル(見出し)のためA列の最終行(罫線を除きデータが入ってる行)を求めれなくて困ってます。データは4行目以降から入力していく予定ですが Range("A" & Rows.Count).End(xlUp).Row は2となるため+1で入力行を求めてると3となってしまいます。A4からAの最後の行の範囲で罫線を除く最終行を出せればよいのですが  最初は4 以下順次5 6 7 ‥ どなたかご教示頂けないでしょうか?

専門家に質問してみよう