生年月日から18年と1ヵ月後のデータを計算する方法

このQ&Aのポイント
  • 生年月日データから18年と1ヵ月後のデータを作成する方法を教えてください。
  • Excelのバージョンが2002で、生年月日データから18年と1ヵ月後のデータを新しいセルに入力したいです。
  • 給与計算月(21日~翌20日)によるため、生年月日データから給与計算月ベースの18年と1ヵ月後のデータを作成する式を作りたいです。
回答を見る
  • ベストアンサー

生年月日関係の計算

エクセルのバージョンは2002です。 2000/01/01のような生年月日のデータから、18年と1ヵ月後(年月のみ)のデータを作ります。 書式を変更するのではなく、新しいセルに打ち込みます。 なお、給与計算月(21日~翌20日)によるため、 たとえば1995/7/25なら2013/9      1995/7/15なら2013/8      1995/11/15なら2013/12            1995/11/25なら2014/1      1995/12/25なら2014/2  というように「給与計算月ベースの18年と1ヵ月後」のデータになるような式を作ります。 この条件で、L83のある生年月日を変換するのに =IF(MONTH(L83)+1=13,YEAR(L83)+19,IF(AND(DAY(L83)>20,MONTH(L83)+2=13),YEAR(L83)+19,YEAR(L83)+18))&"/"&IF(AND(DAY(L83)>20,MONTH(L83)+1=13),2,IF(AND(MONTH(L83)+2=13,DAY(L83)>20),1,IF(DAY(L83)>20,MONTH(L83)+2,IF(MONTH(L83)+1=13,1,MONTH(L83)+1)))) こんな式を強引に作ってうまく適用できたのですが、 もっとうまいやり方は無かったのだろうか・・・と思って質問しました。 やってみると意外に複雑です。 式を単純化できる方いらっしゃいましたら、後学のために教えてください。 よろしくお願いします

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

  • ベストアンサー
  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.1

アドインで分析ツールを有効にしていれば、 =EOMONTH(L83-20,217)+1 アドインを使いたく無いなら =DATE(YEAR(L83-20)+18,MONTH(L83-20)+2,1) いずれも、セルの表示形式をユーザ定義でyyyy/mにして下さい。

nasu000_002
質問者

お礼

両方試して、問題なく適用できました。 DATE関数でうまくいかなくて結局IFにしていたんですが、こんな方法があったとは。 ありがとうございました。-20ってのがミソですね

その他の回答 (2)

noname#204879
noname#204879
回答No.3

添付図参照 B1: =DATE(YEAR(A1)+18,MONTH(A1)+1+(DAY(A1)>20),1)   書式は yyyy/mm

nasu000_002
質問者

お礼

ありがとうございます。 やはりDATE関数でDAYを1日に固定するのが鉄板ですね

回答No.2

こんな感じでも良いかな =TEXT(DATE(YEAR(L83)+18,MONTH(L83)+1+(DAY(L83)>20),1),"yyyy/m")

nasu000_002
質問者

お礼

わざわざ書式を変えなくてもいいのですね。TEXT関数なんて初めて知りました。 ありがとうございました

関連するQ&A

  • if文データの別ファイル化について

    金星と火星の「○年○月○日は○座」というのがわかっていて, それを入力された年月日と比較して答えを出してるのですが、 数年間のデータを全部if文で書くと,分量が非常に多くなって しまいます。 そこで、金星と火星それぞれのデータを別ファイルにしてしまう 方法はないでしょうか?初心者なもので、なるだけ具体的に よろしくお願い致します。 以下ソースコードです。 #以下金星のデータ sub get_venus_data{ local($year,$month,$day)=@_; local($horoscope)='データなし'; if($year==1950){ if($month<=3 || ($month==4 && $day<=6)){ # ~4月の6日以下 $horoscope = 'みずがめ'; # みずがめ座 }elsif($month==4 || ($month==5 && $day<=5)){ # 4月の残り~5月の5日以下 $horoscope = 'うお'; # うお座        ・        ・       間省略        ・        ・ }elsif($month==12){ # 12月の残り~12月の31日以下 $horoscope = 'やぎ'; # やぎ座 } } return $horoscope; } #以下火星のデータ sub get_mars_data{ local($year,$month,$day)=@_; local($horoscope)='データなし'; if($year==1950){ if($month<=3 && $day<=28){ # ~3月の28日以下ならば $horoscope = 'てんびん'; }elsif($month==3 || ($month==6 && $day<=11)){ # 3残り又は6/11以下 $horoscope = 'おとめ';        ・        ・       間省略        ・        ・ }elsif($month<=12){ # 12残り $horoscope = 'みずがめ'; } } return $horoscope; } # 入力から金星と火星の星座を求める。 $venus = get_venus_data($in{'year'}, $in{'month'}, $in{'day'}); $mars = get_mars_data($in{'year'}, $in{'month'}, $in{'day'});

    • ベストアンサー
    • CGI
  • エクセルで月末を求める計算式

    エクセルで月末を求める計算式 下記の式ですが、月末の日付が正常に表示されません。 どこか間違いがありましたらご指導お願い致します。 =IF(B3="","",DAY(DATE(YEAR(TODAY()),MONTH(TODAY())+1,0)))

  • プログラムの内容

    以下のプログラムは答えとして渡されたものなんですが、 コマンド引数を使ったプログラムの流れがよくわかりません。 簡単に解説してくれる方、いませんか? #include <stdio.h> int leapyear(int year){ if(year%400 == 0) return 1; else if(year%4 == 0 && year%100 != 0) return 1; else return 0; } void addmonth(int *day, int *month, int *year){ *day = 1; (*month)++; if(*month > 12) { *month = 1; (*year)++; } } int main(int argc, char *argv[]){ int year, month, day, a=0, max_days; int month_days[12] = {31,28,31,30,31,30,31,31,30,31,30,31}; if(argc < 2) max_days = 10000; else max_days = atoi(argv[1]); printf("今日は西暦何年 何月 何日? "); scanf("%d%d%d",&year,&month,&day); while(a<max_days) { a++; day++; if(month == 2 && leapyear(year)) { if(day > 29) addmonth(&day, &month, &year); } else { if(day > month_days[month-1]) addmonth(&day, &month, &year); } } printf("今日から%d日後は、%d年%d月%d日です。",max_days, year, month, day); }

  • フォームの生年月日のデータから年齢を割り出し、sumitしたい

    はじめまして。質問させてください。 現在、個人情報を入力するフォームメールを作成中なのですが、生年月日を<select>タグで選択し、submitを押したときに、項目のチェックと年齢計算をして、年齢を<hidden>タグの値としてsubmitできるfunctionを作りたいのですが、<select>タグ内の情報が多すぎると、エラーになってしまい、submitできません。 下記、ソースです。 function CHK() { frm = document.forms[0]; //生年月日(年) if( frm.birth_year.selectedIndex == 0 ){ frm.birth_year.focus(); alert( "生年月日の年を入力してください。" ); return false; } ↑こんな感じのフォームチェックが10個ぐらい if( frm.birth_year.value != "" && m.birth_month.value != "" && frm.birth_day.value != "") { today = new Date(); tage = today.getFullYear() - Number(frm.birth_year.value); if (Number(frm.birth_month.value) > today.getMonth()+1 ) { tage = tage -1; }else if ( Number(frm.month.value) == today.getMonth()+1 && Number(frm.birth_day.value) > today.getDate() ) { tage = tage -1; } frm.age.value = tage; } frm.submit(); } 色々ためしているのですが、どうしてもエラーになってしまいます。どなたか解決法をご存知の方がいらっしゃいましたら、教えてください。

  • 日時や時刻を指定し、その時間にメッセージを表示させる方法、、、

    Visual Basic 6.0 を始めたばかりの者です。 「日時や時刻を指定し、その時間になったら  あらかじめ指定したメッセージを表示させる」 というプログラムを作ろうとしています。 自分なりに考えたのは次のような方法です。 1.Year、Month、Day、Hour、Minute関数で、今日の年月日と時刻を得て  変数に入れる。 2.コンボボックスに「2003」などの数値を入れておき、  メッセージを表示させたい年月日と時刻を選択させる。  指定された年、月、日、時間、分はそれぞれ変数に入れる 4.「設定」ボタンを押す。 3.IF関数を使い、1.と2.の変数が全部一致したら、  メッセージボックスなどを出してメッセージを表示。 If (指定したYear = 今日のYear) And _ (指定したMonth = 今日のMonth) And _ (指定したDay = 今日のDay) And _ (指定したHour = 今日のHour) And _ (指定したMinute = 今日のMinute) Then テキストボックス = "定められたメッセージを表示する" End If ここで行き詰まってしまいました。 タイマーコントロールを使うのかな?とは思うのですが、 どのようにして使えば良いのか判りません。。。 1.の段階で既に間違っているのでしょうか。 タイマーコントロールを使って、今日ではなく「今現時点の」 年月日と時刻を得る必要があるのでしょうか、、、? 恐らく簡単な事なのかも知れませんが、判りやすく教えて戴けると幸いです。 宜しくお願い致します。

  • Excel VBAで「date」関数を使いたい

    VBAを使用して年月日を入力してます。 セルに表示だけなら Year & "/" & Month… とかでもいいんですが、その日付で計算を行いたいんです。 何日足す、とか。。 それでExcelで使える Date(Year,Month,Day) を思い出したんですが、VBAではエラーになってしまいました。 Application.WorksheetFunction.Date(Year, Month, Day) や Application.Date(Year, Month, Day) もダメでした。 どのようにしたら入力した日付で計算が行えるでしょうか?

  • 生年月日から学年を計算しようと以下のようにVBを用いて作りました。が、

    生年月日から学年を計算しようと以下のようにVBを用いて作りました。が、9月までは正しく学年が表示されたのですが、10月になったとたん、一つ前の学年が表示されるようになりました。 Function Jokyo(ByVal Umare As Variant) As String Dim idx As Integer Dim moji As String If IsNull(Umare) Then Jokyo = "" Exit Function End If '4月~12月での学齢計算 If Month(Date) >= "4" Then idx = DateDiff("yyyy", Umare, DateSerial(Year(Date), 4, 1)) If Format(Umare, "mmdd") < "0401" Then idx = idx + 1 End If ElseIf Month(Date) < "4" Then idx = DateDiff("yyyy", Umare, DateSerial(Year(Date) - 1, 4, 1)) If Format(Umare, "mmdd") < "0401" Then idx = idx + 1 End If Else idx = 19 End If '-------------------------------------------------- Select Case idx Case 0 To 4 moji = "未入学" Case 5 moji = "幼稚園年少" Case 6 moji = "幼稚園年長" Case 7 To 12 moji = "小学" & idx - 6 & "年生" Case 13 To 15 moji = "中学" & idx - 12 & "年生" Case 16 To 18 moji = "高校" & idx - 15 & "年生" Case Else moji = "既卒生" End Select Jokyo = moji End Function

  • PHPで、xmlを書き換えたい

    PHP初心者です。 年月日を記録してあるxmlを、phpから書き換えたいのですが、 動作しなくて困っています。。 現在の年月日は 2011.4.7 で 書き換え後の年月日は 2100.9.9 にしたいです。 「index.html」と「memory.xml」が同じフォルダ内にあります。 ●memory.xmlの内容は以下のとおりです-------------------- <?xml version="1.0"?> <memory>   <year>2011</year>   <month>4</month>   <day>7</day> </memory> ●htmlに以下のphpコードを書きました-------------------- <?php   $memoryFile = 'memory.xml';   if ( $xml = simplexml_load_file ( $memoryFile ) ) {     function changeMemory ( $year, $month, $day ) {       $xml -> year = $year; //年の書き換え       $xml -> month = $month; //月の書き換え       $xml -> day = $day; //日の書き換え       $xml -> asXML ( $memoryFile ); //ファイルに書き出す     }     changeMemory ( 2100 , 9 , 9 );   } ?> どうも、以下の1文が作動してくれない気がします。。 $xml -> asXML($memoryFile); //ファイルに書き出す どなたか原因がわかる方いらっしゃいましたら、 なにとぞご教授よろしくお願いいたします。。

    • ベストアンサー
    • PHP
  •  EXCELのIF関数についての質問です。

     EXCELのIF関数についての質問です。  IF関数については、自信がありました。 たとえば、G13をテストの得点だとして、80点よりも高い得点なら合格、さもなければ不合格と表示させてければ、if(G13>80,"合格","不合格")でOKのはずです。  ところが、今日何歳なのかを表示させる場合、G13に生年月日をいれて、 IF(OR(MONTH(TODAY())>MONTH(G13),AND(MONTH(TODAY())=MONTH(G13),DAY(TODAY())>=DAY(G13)))=TRUE,YEAR(TODAY())-YEAR(G13),YEAR(TODAY())-YEAR(G13-1))と引継ぎをうけました。  この中にあるTRUEの意味がわかりません。私の解釈では、「今日の月が誕生月よりも絶対値が大きい」又は「今日の月と誕生月が同じで、今日の日が誕生の日の絶対値と同じか多い」場合、年齢は「今日の年」-「誕生の年」、そうでない場合は年齢は「今日の年」-1-「誕生の年」です。  なので、TRUEはなくてもよいと思い、削除してみましたが、エラーが出ました。  よくわからないので、お手数ですが、教えてください

  • 在籍年数の計算について

    EXCELで社員の在籍年月数を計算式で出したいのですが、 A列に入社年月日(例:H11.1.1) B列に退社年月日(例:H12.12.31) C列に在籍年数を=YEAR(B)-YEAR(A) D列に余りの月数を=MONTH(B)-MONTH(A) とした場合、 正しくは1年0ヶ月となるはずが、 なぜか「0年11ヶ月」となってしまいます。 正しく表示されるにはどうしたらいいのでしょうか? よろしくお願いいたします。

専門家に質問してみよう