Access VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


1225 / 2272 ツリー ←次へ | 前へ→

【8115】期間の計算について 初心者 06/6/30(金) 23:45 質問[未読]
【8117】Re:期間の計算について 飛ばない豚 06/7/1(土) 13:05 発言[未読]
【8120】Re:期間の計算について 初心者 06/7/1(土) 23:14 質問[未読]
【8125】Re:期間の計算について 飛ばない豚 06/7/3(月) 11:30 回答[未読]
【8168】Re:期間の計算について 初心者 06/7/4(火) 22:38 お礼[未読]

【8115】期間の計算について
質問  初心者  - 06/6/30(金) 23:45 -

引用なし
パスワード
   例えば2006/04/01から2007/05/31までの期間を求める場合で、○年○ヶ月○日というような表示をさせるにはどのようにすれば良いでしょうか?よろしくお願いします。

【8117】Re:期間の計算について
発言  飛ばない豚  - 06/7/1(土) 13:05 -

引用なし
パスワード
   ▼初心者 さん:

期間を日数まで求めるには、いくつか問題があります。

1.まず、
> 例えば2006/04/01から2007/05/31までの期間を求める場合で、
この場合、ほしい答えは、1年2ヶ月0日 or 1年1ヶ月30日 or その他?

2.2006/05/01〜2007/06/30は
  1年2ヶ月0日 or 1年1ヶ月29日(同じ1〜末日で値が違っても良い?) or その他?

2.2006/02/16〜2007/03/15は?
3.2004/02/16〜2005/03/15は?(うるう年の場合)


とりあえず(!? もっと出てくるかもしれませんが)、
上記の場合の欲しい答え(戻り値)を挙げてみましょう。

最終的には、それらを考慮した自作関数を作る事になるかと思います。

【8120】Re:期間の計算について
質問  初心者  - 06/7/1(土) 23:14 -

引用なし
パスワード
   ▼飛ばない豚 さん:
>▼初心者 さん:
>
>期間を日数まで求めるには、いくつか問題があります。
>
>1.まず、
>> 例えば2006/04/01から2007/05/31までの期間を求める場合で、
>この場合、ほしい答えは、1年2ヶ月0日 or 1年1ヶ月30日 or その他?
 →1年2ヵ月0日です。
>
>2.2006/05/01〜2007/06/30は
>  1年2ヶ月0日 or 1年1ヶ月29日(同じ1〜末日で値が違っても良い?) or その他?
 →1年2ヵ月0日です。
>
>2.2006/02/16〜2007/03/15は?
>3.2004/02/16〜2005/03/15は?(うるう年の場合)
 →どちらも1年1ヶ月と考えたいと思います。
>
>
>とりあえず(!? もっと出てくるかもしれませんが)、
>上記の場合の欲しい答え(戻り値)を挙げてみましょう。
>
>最終的には、それらを考慮した自作関数を作る事になるかと思います。

本当はできれば、1〜末日(30日or31日)までのことやうるう年のことも考慮したいと思っておりますが、なんだか難しそうなのでとりあえずは上記のような設定でよいかなと思っております。よろしくお願いします。

【8125】Re:期間の計算について
回答  飛ばない豚  - 06/7/3(月) 11:30 -

引用なし
パスワード
   ▼初心者 さん:

私の使っているコード(ちょっと改)です。
'---------------------------------------------------------------
Function fxKIKANcalc(ByVal 日付S As Date, ByVal 日付E As Date) As String
  Dim myDateS As Date   '開始年月日
  Dim myDateE As Date   '終了年月日
  Dim myFUGO As String  '日付S>日付Eの場合、計算結果にマイナスを付ける
  Dim myYY As Long    '年数
  Dim myMM As Long    '月数
  Dim myDD As Long    '日数
  Dim myYYs As Long    '開始年
  Dim myMMs As Long    '開始月
  Dim myDDs As Long    '開始日
  Dim myYYe As Long    '終了年
  Dim myMMe As Long    '終了月
  Dim myDDe As Long    '終了日
  
  If 日付S < 日付E Then
    myFUGO = ""
    myDateS = 日付S
    myDateE = 日付E + 1
  Else
    myFUGO = "-"
    myDateS = 日付E
    myDateE = 日付S + 1
  End If
  
  myYYs = Year(myDateS)
  myMMs = Month(myDateS)
  myDDs = Day(myDateS)
  myYYe = Year(myDateE)
  myMMe = Month(myDateE)
  myDDe = Day(myDateE)
  
  myDD = myDDe - myDDs
  If myDD < 0 Then
    myDDs = Day(DateAdd("m", myYYe * 12 + myMMe - _
        (myYYs * 12 + myMMs) - 1, myDateS))
    myDD = myDDe - myDDs + Day(DateSerial(myYYe, myMMe, 0))
    myMMe = myMMe - 1
  End If
  
  myMM = myMMe - myMMs
  If myMM < 0 Then
    myMM = myMM + 12
    myYYe = myYYe - 1
  End If
  
  myYY = myYYe - myYYs
  
  '表示形式を整える
  fxKIKANcalc = myFUGO & myYY & "年" & myMM & "ヶ月" & myDD & "日"
End Function
'-------------------------------------------------------------
'注)同じ20日〜15日でも、月によって日数は違ってくる。
'例1 2003/01/20〜2004/03/15 → 01年01ヶ月25日
'例2 2003/01/20〜2004/04/15 → 01年02ヶ月27日


標準モジュールに上記コードを貼り付けて、
クエリー等から
式:fxKIKANcalc("2006/04/01","2007/05/31")
というように使用します。

参考までに。

【8168】Re:期間の計算について
お礼  初心者  - 06/7/4(火) 22:38 -

引用なし
パスワード
   ▼飛ばない豚 さん:

すばらしい回答ありがとうございました。
解決しました。
また、よろしくお願いします。

>▼初心者 さん:
>
>私の使っているコード(ちょっと改)です。
>'---------------------------------------------------------------
>Function fxKIKANcalc(ByVal 日付S As Date, ByVal 日付E As Date) As String
>  Dim myDateS As Date   '開始年月日
>  Dim myDateE As Date   '終了年月日
>  Dim myFUGO As String  '日付S>日付Eの場合、計算結果にマイナスを付ける
>  Dim myYY As Long    '年数
>  Dim myMM As Long    '月数
>  Dim myDD As Long    '日数
>  Dim myYYs As Long    '開始年
>  Dim myMMs As Long    '開始月
>  Dim myDDs As Long    '開始日
>  Dim myYYe As Long    '終了年
>  Dim myMMe As Long    '終了月
>  Dim myDDe As Long    '終了日
>  
>  If 日付S < 日付E Then
>    myFUGO = ""
>    myDateS = 日付S
>    myDateE = 日付E + 1
>  Else
>    myFUGO = "-"
>    myDateS = 日付E
>    myDateE = 日付S + 1
>  End If
>  
>  myYYs = Year(myDateS)
>  myMMs = Month(myDateS)
>  myDDs = Day(myDateS)
>  myYYe = Year(myDateE)
>  myMMe = Month(myDateE)
>  myDDe = Day(myDateE)
>  
>  myDD = myDDe - myDDs
>  If myDD < 0 Then
>    myDDs = Day(DateAdd("m", myYYe * 12 + myMMe - _
>        (myYYs * 12 + myMMs) - 1, myDateS))
>    myDD = myDDe - myDDs + Day(DateSerial(myYYe, myMMe, 0))
>    myMMe = myMMe - 1
>  End If
>  
>  myMM = myMMe - myMMs
>  If myMM < 0 Then
>    myMM = myMM + 12
>    myYYe = myYYe - 1
>  End If
>  
>  myYY = myYYe - myYYs
>  
>  '表示形式を整える
>  fxKIKANcalc = myFUGO & myYY & "年" & myMM & "ヶ月" & myDD & "日"
>End Function
>'-------------------------------------------------------------
>'注)同じ20日〜15日でも、月によって日数は違ってくる。
>'例1 2003/01/20〜2004/03/15 → 01年01ヶ月25日
>'例2 2003/01/20〜2004/04/15 → 01年02ヶ月27日
>
>
>標準モジュールに上記コードを貼り付けて、
>クエリー等から
>式:fxKIKANcalc("2006/04/01","2007/05/31")
>というように使用します。
>
>参考までに。

1225 / 2272 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
1078226
(SS)C-BOARD v3.8 is Free