• ベストアンサー

「何年と何日前」と表示したい

Sub test1() Dim dtm日付 As Date Dim i As Integer dtm日付 = #1/1/2010# i = Date - dtm日付 MsgBox i & "日前" End Sub これで、何日前かは取得できたのですが 何年と何日形式にするにはどうすればいいでしょうか

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

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

下記が不都合な結果が出るちか、間違ったことを言っているようなら済みません。 参考にしてください。 -- http://officetanaka.net/excel/vba/function/DateDiff.htm エクセルVBAにもDateDiff関数があります。 ーー (原理) エクセルの日付データは、日付シリアル値という、1900年1月1日からの カレンダー的な日付の、その日が何番目の日付になるかという正整数を持ってます。 だから2つの日付の日付シリアル値を「(整数の)引き算」をすれば、2つの日付間の日数はすぐ出せます。 しかし、365日以上の日数が予想される場合、365日を単位に年数を計算すると (割り算して商を使う)年お出す方法よりも、1年が、365日、366日あったりするので、たぶん質問者のいう、1年と違う場合が出るだろうと推測する。 ーー 貴社などの場合、何年とか何か月というのは「応当日」主義で考えるのではないですか。 何か月先の同日経過で何か月と数える。FROMTOのTOの日付で、少の月で月末に応当日がなければ、月末日越えで月数を+1するような計算では。 ーー エクセル(ワークシート=普通の関数)関数DATEDIFでは (1)引数にYを指定して、満年数を出し、 (2)それと別に、1年未満月数を出す YMを指定の関数と (3)日を出す引数 MD(1か月未満の日)をだし 3つの関数の結果の数を(年月日の単位など付けて)&で結合して、表現しては どうでしょう。内容的にはこれの計算ではないですか。 例として 関数は3セルに =DATEDIF(A1,B1,"Y") DIFFではない =DATEDIF(A1,B1,"YM") =DATEDIF(A1,B2,"MD") 結果は、シートのA1:C3 2014/2/1 2016/4/19 2 2014/2/1 2016/4/19 2 2014/2/1 2016/4/19 18 ーー それでエクセルVBAでも使える関数DateDiffを使い、できるかな、とやってみようとした。 しかしDateDiffの引き数に、YMやMDが無いようだ。 Sub test01() '--以下は使えないと思う例 d1 = Range("A1") d2 = Range("B1") df = d2 - d1 MsgBox df dy = DateDiff("yyyy", d1, d2) dm = DateDiff("m", d1, d2) dd = DateDiff("d", d1, d2) MsgBox dy & "年" & dm & "月" & dd & "日" '---以下は1方法。面倒ですが 'シートの関数を入れて、計算 結果を使って表示 MsgBox [C1] & "年" & [c2] & "月" & [c3] & "日" '[C1]はC1セルの値の書き方 End Sub 最後の行あたりのやり方は、苦肉の策。 ーー dd = Application.WorksheetFunction.DateDif(d1, d2, "d")はエラーになるよう。 VBScりptのDatedif関数もエクセル関数のような引数がない。 ーー VBAで、自己計算で、年、月、日を出すのはやめた方がよさそうに思う。場合分けとテスト が複雑となる思う。 ーー 小生は、あまり実戦でこれらをゴリゴリ使う機会はなく、テストも面倒なので、質問者の 方でいろいろやってみて、納得して使ってください。

ZSAOZAOXHIE
質問者

お礼

ありがとうございます。

その他の回答 (2)

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.2

 「dtm日付に格納されている日付よりも後の日付で、月と日が本日現在の日付と同じ日付の内、最も古い日の日付」を求めて変数bufに格納してから、変数bufの日付が本日現在の日付の何年前の日付なのかという事と、変数bufの日付が「dtm日付に格納されている日付」の何日後なのかを求めれば良いと思います。 Sub test2() Dim dtm日付 As Date Dim buf As Date Dim myTerm As String dtm日付 = #4/21/2014# buf = DateSerial(Year(dtm日付), Month(Date), Day(Date)) If DateDiff("d", dtm日付, buf) < 0 Then _ buf = DateAdd("yyyy", 1, buf) myTerm = Trim(Replace(" " & DateDiff("yyyy", buf, Date) _ & "年" & DateDiff("d", dtm日付, buf) & "日前", " 0年", "")) MsgBox myTerm End Sub

ZSAOZAOXHIE
質問者

お礼

ありがとうございます。

  • ubku
  • ベストアンサー率37% (227/608)
回答No.1

かなり泥臭いですが Sub test() Dim d1 As Date Dim d2 As Date d1 = #2/1/2016# d2 = #3/1/2020# Dim dd As Double Dim yd As Double Dim d3 As Date Dim strYear As String yd = DateDiff("yyyy", d1, d2) '月日を比較(閏年で) If CDate("2016/" & Format(d1, "MM/dd")) <= CDate("2016/" & Format(d2, "MM/dd")) Then d3 = DateAdd("yyyy", yd, d1) strYear = yd Else d3 = DateAdd("yyyy", yd - 1, d1) strYear = yd - 1 End If dd = DateDiff("d", d3, d2) MsgBox (strYear & "年と" & dd & "日") End Sub

ZSAOZAOXHIE
質問者

お礼

ありがとうございます。

関連するQ&A

  • 該当の日付時点で該当者が何歳かを取得したいのですが

    Sub Macro1() Dim dtm日付 As Date Dim dtm誕生日 As Date Dim i As Integer dtm日付 = #10/1/2015# dtm誕生日 = #7/1/1986# i = dtm日付 - dtm誕生日 MsgBox "Aさんは" & dtm日付 & "の時点では、" & i & "才です。" End Sub こんな感じでVBAコードを作ってみたのですが 肝心の何歳かを算出する方法がわかりません。

  • 今日より何日経過しているかを取得するには?

    Sub Macro() Dim dtm日付 As Date dtm日付 = #1/1/2015# If dtm日付 Then MsgBox "何日前です" End If End Sub のように、dtm日付が今日より何日前かを取得する方法はありますか?

  • [と”の意味を教えてください。

    http://okwave.jp/qa/q5945112.html を参考に、 Sub test1() Dim i As Integer i = 2 If i Like "[1-3]" Then MsgBox i & "です" End If End Sub Sub test2() Dim i As Integer i = 2 If i Like "[1-5]" Then MsgBox i & "です" End If End Sub Sub test3() Dim i As Integer i = 2 If i Like "[1-10]" Then MsgBox i & "です" End If End Sub を作ったのですが、 test3はうまく行きません。 意味としては、 iが "[1-10]"の中の数字の間のどれかであれば、 MsgBox i & "です" を表示させたいです。 でも上記のマクロを実行させた結果、 "[1-10]"の中で計算が行われてるのではないかと思います。 だから、test3は、1-10=-9 という事になり、msgboxが反応しないのではないかと思っています。 でもそうすると、test2だって "[1-5]"は、-4になって、i=2とは違う値なのに なぜMsgBoxが反応してしまうのかわかりません。 でもそもそも[と”の意味が分からないのでそこから教えていただけませんか? “の意味、は二つで挟んで文字列にすると思っています。

  • 今の自分の年齢を取得するvbaコードが知りたい

    今の自分の年齢を取得するvbaコードが知りたいのですが Sub test1() Dim dtm誕生日 As Date dtm誕生日 = #7/1/1986# MsgBox Format(Date - dtm誕生日, "yyyy/mm/dd") MsgBox DateDiff("yyyy", dtm誕生日, Date) End Sub を作ってみたのですが 違うのが返りました。 DateDiff("yyyy", dtm誕生日, Date) は、30が返ってしまいます。 今日の時点ではまだ29歳なのですが そういう場合どうすればいいでしょうか? 「現在は29歳です」と返したいのですが、 どのようにすればいいでしょうか?

  • 「1から5の間なら」とするには?

    「1から5の間なら」とするには? エクセルvbaです。 Sub test1() Dim i As Integer i = 1 If i = 1 Or i = 2 Or i = 3 Or i = 4 Or i = 5 Then MsgBox "1-5までのどれかです" End If End Sub は、最大でも5なので手入力でできますが、 これが1から100までならor演算子で繋ぐのは大変なので Sub test2() Dim i As Integer i = 1 If i = [1-5] Then MsgBox "1-5までのどれかです" End If End Sub みたいなことをやりたいのですが、うまくいきません。 デバッグしてもエラーにもなりません。 自分でコードを書いといて聞くのもおかしいですがtest2の意味と、表題の方法を教えてください。 よろしくお願いします。

  • iと言う変数の値が1から10の間にないならば

    「iと言う変数の値が1から10の間にないならば」、としたいのですが どのようなコードを書けばいいのでしょうか? Sub test1() Dim i As Integer i = 11 If 1 < i < 10 Then MsgBox i & "は1から10の間にはありません" End If End Sub だと、メッセージが表示されてしまいます。

  • プロシージャーの外で宣言した変数の値の破棄の仕

    プロシージャーの外で宣言した変数の値の破棄の仕方について教えてください。 ++++++++++++++++++ Dim i As Long Sub test() i = i + 10 MsgBox i End Sub ++++++++++++++++++ を実行すると、どんどん値が増えていきますが、 回避するには、 ++++++++++++++++++ Dim i As Long Sub test() i = i + 10 MsgBox i i = 0 End Sub ++++++++++++++++++ とするしかないのでしょうか? ++++++++++++++++++ Dim i As Long Sub test() i = i + 10 MsgBox i Set i = Nothing End Sub ++++++++++++++++++ としたら、エラーになりました。

  • 変数が勝手に変わります

    Dim i As Integer:Dim i2 As Integer:Dim card(5) As Integer:Dim expectPoint0card(1) As Integer '0枚のカードを交換する場合のすべての選択肢の期待値 Dim expectPoint1card(5) As Integer Sub porkerGame() card(1) = 1: card(2) = 2: card(3) = 3: card(4) = 4: card(5) = 5 getExpectPoint1card expectPoint1card End Sub Sub getExpectPoint1card(expectPoint1card() As Integer) Dim tesu1 As Integer:Dim sum1 As Integer For i = 1 To 5 getTesuSum1 i, tesu1, sum1 expectPoint1card(i) = sum1 / tesu1 Next i End Sub Sub getTesuSum1(rowNumber As Integer, tesu1 As Integer, sum1 As Integer) Dim card2(5) As Integer:tesu1 = 0:sum1 = 0 MsgBox rowNumber copy card, card2, 5 MsgBox rowNumber For i = 4 To 55 MsgBox rowNumber card2(rowNumber) = i addTesuSum card2, tesu1, sum1 Next i End Sub Sub copy(row() As Integer, row2() As Integer, i2 As Integer) For i = 1 To i2 row2(i) = row(i) Next i End Sub 上記のプログラムで、ウィンドウに1,6,4,5,6と表示され、その次には、エラーが表示します。僕は、ウィンドウに表示される変数RowNumberの値がしばらくの間は1のままであるようにプログラムを書いたつもりなのですが、変数rowNumberの値が変わるのは、どうしてでしょうか?教えてください。お願いします。

  • application.inputbox 空白時に

    こんにちは。EXCEL VBA初心者です。 application.inputbox でセル範囲を取得する場合、空白の場合は iを次に進ませたいのですが、 何か方法はないでしょうか? Sub test1() Dim Target As Range Dim i As Integer i = 1 For i = 1 To 5 Set Target = Application.InputBox("セルを選択してください", Type:=8) MsgBox i Next i End Sub

  • エクセルのVBAで質問があります。

    現在自分はカレンダーを作成していて、カレンダーに祝日を入れたいと思っています そこで これを if文もしくはselectcase どっちを使ったら楽か教えてもらいたいです Sub MakeCalendar(hi As Date) Dim i As Integer 'カレンダーにセットする日付 Dim g As Integer '日付をセットする行番号 Dim r As Integer '日付をセットする列番号 Dim lastDay As Integer '作成するカレンダーの月末 g = 2 'その月の開始曜日を算出 r = Weekday(DateSerial(Year(hi), Month(hi), 1), vbSunday) '指定された日付の翌月1日をもとて、日付の前の日を計算する lastDay = Day(DateSerial(Year(hi), Month(hi) + 1, 1) - 1) For i = 1 To lastDay 'iに日付の設定 Cells(g, r).Value = i If r = 7 Then r = 1 '戻して g = g + 1 '1行下に書く Else r = r + 1 '1列→に移動する End If Next End Sub Sub test() Range("A2:G7").Value = "" 'A2~G2にカレンダー表示 MakeCalendar Range("I2").Value 'I2に日付を入力する End Sub Sub test() Range("A2:G7").Value = "" 'A2~G2にカレンダー表示 MakeCalendar Range("I2").Value 'I2に日付を入力する End Sub このようなマクロを組んでいまして、祝日(ゴールデンウィークなど)を赤で塗りつぶすような物を考えています。 VBAは初心者でまだあまりわかっていないので、ご教授ください

専門家に質問してみよう