- ベストアンサー
VBAで日付についての質問
お世話になります。 下記についてのVBA記述方法をご教示頂きたく 宜しくお願い致します。 記 1)20080924と言う日付が表示されているセルから 09の月だけを違うセルに表示する(取得)方法 2)20080924と言う日付が表示されているセルから 一月減らして(200808)違うセルに表示する(取得)方法 3)20080924と言う日付が表示されているセルから 一月増やして(200808)違うセルに表示する(取得)方法
- みんなの回答 (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 日付計算は、起算日当日を含む、含まない、営業日数でかぞえる等 条件によって結果が大きく変わりますからご注意を。
その他の回答 (5)
- kunkun_129
- ベストアンサー率64% (16/25)
#3の回答者です。 tuki=Month(Mday) <==========月 上の様に訂正です。 タイプミスが多いです。ごめんなさい。
お礼
お礼が遅くなりました。 ありがとうございました。
- kunkun_129
- ベストアンサー率64% (16/25)
#3の回答者です。 一部訂正です。 >>日常業務(特に業務用)では、2008/01/31の1ケ月先は2008/02/28日にしないと 下が正しいです。 日常業務(特に業務用)では、2008/01/31の1ケ月先は2008/02/29日にしないと 今年はうるう年だった。
- kunkun_129
- ベストアンサー率64% (16/25)
どの様な用途に使われるかわかりませんが。 注意点があります。 特に業務用で用いる時は、+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)
セル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)
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)
お礼
お礼が遅くなりました。 ありがとうございました。
お礼
遅くなりました。 ありがとうございました。