• ベストアンサー

VBAで日付についての質問

お世話になります。 下記についてのVBA記述方法をご教示頂きたく 宜しくお願い致します。       記 1)20080924と言う日付が表示されているセルから   09の月だけを違うセルに表示する(取得)方法 2)20080924と言う日付が表示されているセルから   一月減らして(200808)違うセルに表示する(取得)方法 3)20080924と言う日付が表示されているセルから   一月増やして(200808)違うセルに表示する(取得)方法

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

  • ベストアンサー
  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.6

こんにちは。 まず、20080924 という数値(文字列?)をシリアル値化します。 下記では、Foamat 関数で yyyy/mm/dd と書式化した文字列を DateValue 関数でシリアル値に変換しています。   DateValue(Format("20080924","0000/00/00")) 月は、Month 関数で取り出せますし、Format 関数でも取り出せます。 出力先がセルであるならば、セルの表示形式でも表示できますね。   Month(DateValue("2008/09/24")   Format(DateValue("2008/09/24","m") また、日付の加減算を行う場合 VB(A)では DateAdd 関数が用意され てます。月末日が 30、31 であるか、うるう年なのかは考慮しなくとも 計算してくれますよ。 Sub testproc()   Dim s  As String   Dim d As Date      s = Range("A1").Text ' // 20080924 が入力されている      ' // yyyy/mm/dd に書式化し、シリアル値に変換   d = DateValue(Format(s, "0000/00/00"))      ' // 月 を mm で表示   With Range("B1")     .Value = d     .NumberFormat = "mm"   End With      ' // 一月前を yyyymm で表示   With Range("C1")     .Value = DateAdd("m", -1, d)     .NumberFormat = "yyyymm"   End With      ' // 一月後を yyyymm で表示   With Range("D1")     .Value = DateAdd("m", 1, d)     .NumberFormat = "yyyymm"   End With End Sub 日付計算は、起算日当日を含む、含まない、営業日数でかぞえる等 条件によって結果が大きく変わりますからご注意を。

miruchoko
質問者

お礼

遅くなりました。 ありがとうございました。

その他の回答 (5)

回答No.5

#3の回答者です。 tuki=Month(Mday)     <==========月 上の様に訂正です。 タイプミスが多いです。ごめんなさい。

miruchoko
質問者

お礼

お礼が遅くなりました。 ありがとうございました。

回答No.4

#3の回答者です。 一部訂正です。 >>日常業務(特に業務用)では、2008/01/31の1ケ月先は2008/02/28日にしないと 下が正しいです。 日常業務(特に業務用)では、2008/01/31の1ケ月先は2008/02/29日にしないと 今年はうるう年だった。

回答No.3

どの様な用途に使われるかわかりませんが。 注意点があります。 特に業務用で用いる時は、+1ケ月、-1ケ月は注意が必要です。 DateSerial(yyyy, mm, dd)で+1ケ月、-1ケ月を単純に求めると 大変な事になります。 例えば、2008/01/31 に+1ケ月をDateSerialで求めると DateSerial(2008,1+1, 31) ---> 2008/03/02 になり、日常業務からみた場合、 違和感がでます。 日常業務(特に業務用)では、2008/01/31の1ケ月先は2008/02/28日にしないと まずいからです。この様に末日近くの+1ケ月先は注意が必要です。 特に、金利計算・償却資産管理・販売管理等には、大変まずい事になります。 d = Cells(1, 1) Mday = DateSerial(Val(Left(d, 4)), Val(Mid(d, 5, 2)), Val(Right(d, 2))) tuki=Month(ds)     <==========月 Xday=DateSerial(year(Mday), month(Mday) - 1, day(Mday)) if day(Xday)<3 and day(Mday)>27 then Xday=DateSerial(year(Xday), month(Xday), 0) end if yyyymm=format(year(Xday),"0000")+format(month(Xday),"00")   <===== -1月先 年月 Xday=DateSerial(year(Mday), month(Mday) + 1, day(Mday)) if day(Xday)<3 and day(Mday)>27 then Xday=DateSerial(year(Xday), month(Xday), 0) end if yyyymm=format(year(Xday),"0000")+format(month(Xday),"00")   <=====+1月先 年月 尚、デバッグしていないので、多少バグがあればあしからず。大体上の感じで末を考慮しないと いけません。

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

セルA1にデータがあるとして Sub test01() d = Cells(1, 1) ds = DateSerial(Val(Left(d, 4)), Val(Mid(d, 5, 2)), Val(Right(d, 2))) MsgBox ds MsgBox Month(ds) '----- ds1 = DateSerial(Val(Left(d, 4)), Val(Mid(d, 5, 2)) - 1, Val(Right(d, 2))) MsgBox ds1 '--- ds2 = DateSerial(Val(Left(d, 4)), Val(Mid(d, 5, 2)) + 1, Val(Right(d, 2))) MsgBox ds2 End Sub 書式などに頼らず、一旦、日付シリアル値に変換を勧めます。 20080924 20080124 20081224 にA1を変えて、ー1月する場合、1月の場合前年12月、 +1月する場合、12月の場合来年1月になることを確認のこと。 ーー 日付シリアル値に変換は、DateValue関数でも出来る。

  • okormazd
  • ベストアンサー率50% (1224/2412)
回答No.1

A1:20080924 (日付書式、yyyymmddとする) 表示だけ変わるが、元データはそのままの方法。 1) B1:=A1 (日付書式、mmにする、09と表示) 2) C1:=EOMONTH(A1,-1) (日付書式、yyyymmにする、200808と表示) 3) D1:=EOMONTH(A1,1) (日付書式、yyyymmにする、200810と表示) のことか。 それとも、元データも変わる、文字列で取得する方法。 1) B1:=MID(A1,5,2) 2) C1:=LEFT(EOMONTH(A1,-1),6) 3) D1:=LEFT(EOMONTH(A1,1),6)

miruchoko
質問者

お礼

お礼が遅くなりました。 ありがとうございました。

関連するQ&A