Excel VBA質問箱 IV

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

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


10904 / 13646 ツリー ←次へ | 前へ→

【19266】生年月日の検索から学齢を表示する方法を教えてください。 きくちゃん 04/10/27(水) 3:31 質問[未読]
【19267】Re:生年月日の検索から学齢を表示する方法... ichinose 04/10/27(水) 8:28 発言[未読]
【19275】Re:生年月日の検索から学齢を表示する方法... ichinose 04/10/27(水) 10:15 発言[未読]
【19284】Re:生年月日の検索から学齢を表示する方法... きくちゃん 04/10/27(水) 12:53 お礼[未読]
【19297】Re:生年月日の検索から学齢を表示する方法... ichinose 04/10/27(水) 17:30 発言[未読]

【19266】生年月日の検索から学齢を表示する方法を...
質問  きくちゃん  - 04/10/27(水) 3:31 -

引用なし
パスワード
   ある名簿のB列に93/05/24,92/06/23,91/04/01等のように生年月日が入力されており、
B列が93/04/02〜94/04/01生まれはA列に小5、92/04/02〜93/04/01生まれはA列に小6のように表示したいのですが、件数が数千件もあるので一括で表示できるマクロを教えてください。よろしくお願いします。

【19267】Re:生年月日の検索から学齢を表示する方...
発言  ichinose  - 04/10/27(水) 8:28 -

引用なし
パスワード
   ▼きくちゃん さん:
おはようございます。

>ある名簿のB列に93/05/24,92/06/23,91/04/01等のように生年月日が入力されており、
>B列が93/04/02〜94/04/01生まれはA列に小5、92/04/02〜93/04/01生まれはA列に小6のように表示したいのですが、件数が数千件もあるので一括で表示できるマクロを教えてください。よろしくお願いします。

「="小"&DATEDIF(B1,DATE(YEAR(TODAY()),4,1),"y")-5」
こんな数式で出来ませんか(B1にシリアル値の生年月日)?

上記は、小学生の例ですが、中、高も含むなら

「=DATEDIF(B1,DATE(YEAR(TODAY()),4,1),"y")」

の結果から、対応表を作成して結果をだしてもよいと思いますが・・・。

6---小1
7---小2



11--小6
12--中1

というような・・・。

【19275】Re:生年月日の検索から学齢を表示する方...
発言  ichinose  - 04/10/27(水) 10:15 -

引用なし
パスワード
   >おはようございます。
>
>>ある名簿のB列に93/05/24,92/06/23,91/04/01等のように生年月日が入力されており、
>>B列が93/04/02〜94/04/01生まれはA列に小5、92/04/02〜93/04/01生まれはA列に小6のように表示したいのですが、件数が数千件もあるので一括で表示できるマクロを教えてください。よろしくお願いします。
>
>「="小"&DATEDIF(B1,DATE(YEAR(TODAY()),4,1),"y")-5」
>こんな数式で出来ませんか(B1にシリアル値の生年月日)?
考え方は、↑でいいと思いますが、Today()を使用すると、月が1〜3のとき、
学年が変わってしまい(方法はあるけれど)、数式が複雑になるので
どこかのセルにたとえば、セルE1に年度を入力しておきます(2004等)。

「="小"&DATEDIF(B1,DATE(E1,4,1),"y")-5」

とした方がよいでしょうか?

【19284】Re:生年月日の検索から学齢を表示する方...
お礼  きくちゃん  - 04/10/27(水) 12:53 -

引用なし
パスワード
   ▼ichinose さん:
>>おはようございます。
>>
>>>ある名簿のB列に93/05/24,92/06/23,91/04/01等のように生年月日が入力されており、
>>>B列が93/04/02〜94/04/01生まれはA列に小5、92/04/02〜93/04/01生まれはA列に小6のように表示したいのですが、件数が数千件もあるので一括で表示できるマクロを教えてください。よろしくお願いします。
>>
>>「="小"&DATEDIF(B1,DATE(YEAR(TODAY()),4,1),"y")-5」
>>こんな数式で出来ませんか(B1にシリアル値の生年月日)?
>考え方は、↑でいいと思いますが、Today()を使用すると、月が1〜3のとき、
>学年が変わってしまい(方法はあるけれど)、数式が複雑になるので
>どこかのセルにたとえば、セルE1に年度を入力しておきます(2004等)。
>
>「="小"&DATEDIF(B1,DATE(E1,4,1),"y")-5」
>
>とした方がよいでしょうか?

>ichinoseさん、ありがとうございました。
>名簿には、幼児から大学生まで含まれておりますので、
>「=DATEDIF(B1,DATE(YEAR(TODAY()),4,1),"y")」で実行してみました。
>本日の段階では、学齢は全て問題なく数値化されました。
>月が1〜3のとき、
>学年が変わってしまい(方法はあるけれど)、数式が複雑になる
>というのは、2005年の1〜3月に実行した場合の事でしょうか?
>また、数値化された学齢を小1、小2・・・、中1、中2・のように一括で置換する方法も教えていただけませんでしょうか。宜しくお願いいたします。

【19297】Re:生年月日の検索から学齢を表示する方...
発言  ichinose  - 04/10/27(水) 17:30 -

引用なし
パスワード
   ▼きくちゃん さん:
こんにちは。

>>>
>>>「="小"&DATEDIF(B1,DATE(YEAR(TODAY()),4,1),"y")-5」
>>>こんな数式で出来ませんか(B1にシリアル値の生年月日)?
>>考え方は、↑でいいと思いますが、Today()を使用すると、月が1〜3のとき、
>>学年が変わってしまい(方法はあるけれど)、数式が複雑になるので
>>どこかのセルにたとえば、セルE1に年度を入力しておきます(2004等)。
>>
>>「="小"&DATEDIF(B1,DATE(E1,4,1),"y")-5」
>>
>>とした方がよいでしょうか?
>
>>名簿には、幼児から大学生まで含まれておりますので、
>>「=DATEDIF(B1,DATE(YEAR(TODAY()),4,1),"y")」で実行してみました。
>>本日の段階では、学齢は全て問題なく数値化されました。
>>月が1〜3のとき、
>>学年が変わってしまい(方法はあるけれど)、数式が複雑になる
>>というのは、2005年の1〜3月に実行した場合の事でしょうか?
そういうことです。
それに今日の時点で来年の学齢を求めたいと思っても出来ませんよね?
私は、↑これが引っかかっていたので年度指定が良いと思ったのですが・・・。
(この辺は、用途にもよるので一概には言えませんが)
今、学齢に一括変換できればそれでよいのであれば、どっちでも良いですね!!


取り合えず、Today()関数を使用する方法で行きましょうか?
学齢変換するシートは、
以下のようなレイアウトだとしましょうか
A列(氏名)、B列(生年月日、シリアル値で)、C列(学齢)いずれも1行目は、項目名とします(仮にSheet1をシート名とします)。

  A   B     C
1 氏名  生年月日  学齢
2  a  93/04/02  
3  b  00/05/01  
4  c  90/08/24  
5  d  86/08/25  


別のシートに対応表を作りましょう。
ここでは、シート名は、Sheet2します。
A列には4/1時点の満年齢 B列は、学齢、いずれも1行目は、項目名とします。

   A        B

1 4/1時点での満年齢 学齢
2    0      幼児
3    6      小1
4    7      小2
5    8      小3
6    9      小4
7    10      小5
8    11      小6
9    12      中1
10   13      中2
11   14      中3
12   15      高1
13   16      高2
14   17      高3
15   18      大学
16   22      (未入力ではなく、空白を入れておきます)

セルC16は、空白にして下さい(そうしないと、22歳以上は、0になってしまいますから)。

こんな対応表を作成した場合、Sheet1の学齢セル(例えば、C2)には、

「=VLOOKUP(DATEDIF(B2,DATE(IF(MONTH(TODAY())>3,YEAR(TODAY()),YEAR(TODAY())-1),4,1),"y"),Sheet2!$A$2:$B$16,2,TRUE)」

こんな数式で「小5」と表示されます。

後は、オートフィル操作でよいと思いますが、VBAでするなら

標準モジュールに
'==========================================================
Sub main()
  With Range("b2", Cells(Rows.Count, 2).End(xlUp))
   If .Row > 1 Then
     .Offset(0, 1).Formula = _
       "=VLOOKUP(DATEDIF(B2,DATE(IF(MONTH(TODAY())>3,YEAR(TODAY()),YEAR(TODAY())-1),4,1)" & _
       ",""y""),Sheet2!$A$2:$B$16,2,TRUE)"
     End If
   End With
End Sub

Sheet1をアクティブにした状態で実行して下さい。

尚、B列の生年月日が入力してある行を基準にセル範囲を取得しています。

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