電子書籍の厳選無料作品が豊富!

お世話になります。
下記についてのVBA記述方法をご教示頂きたく
宜しくお願い致します。

      記

1)20080924と言う日付が表示されているセルから
  09の月だけを違うセルに表示する(取得)方法
2)20080924と言う日付が表示されているセルから
  一月減らして(200808)違うセルに表示する(取得)方法
3)20080924と言う日付が表示されているセルから
  一月増やして(200808)違うセルに表示する(取得)方法

A 回答 (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

日付計算は、起算日当日を含む、含まない、営業日数でかぞえる等
条件によって結果が大きく変わりますからご注意を。
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/09/28 09:11

#3の回答者です。



tuki=Month(Mday)     <==========月

上の様に訂正です。

タイプミスが多いです。ごめんなさい。
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/09/28 09:10

#3の回答者です。



一部訂正です。

>>日常業務(特に業務用)では、2008/01/31の1ケ月先は2008/02/28日にしないと

下が正しいです。

日常業務(特に業務用)では、2008/01/31の1ケ月先は2008/02/29日にしないと

今年はうるう年だった。
    • good
    • 0

どの様な用途に使われるかわかりませんが。


注意点があります。

特に業務用で用いる時は、+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月先 年月

尚、デバッグしていないので、多少バグがあればあしからず。大体上の感じで末を考慮しないと
いけません。
    • good
    • 0

セル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関数でも出来る。
    • good
    • 0

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)
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/09/28 09:09

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!