質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

1回答

1822閲覧

VBA 年齢の一括計算について

jjyso

総合スコア5

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2021/12/13 06:31

誕生日と基準日より一括で年齢を計算したいのですが、
下記コードだと思うような数字が表示なりません。

コードSub 年齢計算() Dim ws1 As Worksheet Dim ws2 As Worksheet Set ws1 = Sheets("シート1") Set ws2 = Sheets("シート2") Dim LastRow As Date LastRow = ws1.Cells(Rows.Count, 2).End(xlUp).Row Dim MyList() As Variant Dim 基準日 As Date Dim 誕生日 As Date Dim 年齢 As Variant 基準日 = ws2.Range("AK3") Dim i As Long ws1.Select MyList = ws1.Range("J2", Range("J" & Rows.Count). _ End(xlUp)).Resize(, 1).Value For i = 2 To UBound(MyList) For 誕生日 = 1 To LastRow 年齢 = DateDiff("yyyy", 誕生日, 基準日) + _ (Format(誕生日, "m/d") > Format(基準日, "m/d")) Next 誕生日 ws1.Cells(i, 11).Value = 年齢 Next i End Sub

誕生日は「シート1のJ列」基準日は「シート2の"AK3"」に入力されており、「シート1のK列」に年齢が表示されるようにしたいです。
誕生日のデータは1000以上あります。

皆様のご教授を頂ければと思います。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2021/12/13 06:41

思うような数字にならないとは具体的にどのような数字になるんでしょうか
jjyso

2021/12/13 07:41

実行すると「シート1のK列(年齢)」の最終行まで同じ数字が表示なってしまいます。
y_waiwai

2021/12/13 07:48

だから、具体的にどういう数字が出るんでしょうか。 説明をサボってなにかいいことあるんでしょうか
jjyso

2021/12/13 07:59

基準日を「2021/6/1」として実行すると「シート1のK列(年齢)」の最終行まで「118」と表示され、基準日を「2021/12/1」で実行すると「シート1のK列(年齢)」の最終行まで「119」と表示されます。 「シート1のJ列(誕生日)」には「1998/1/21」「1985/5/30」といったデータが入力されています。
guest

回答1

0

ベストアンサー

vba

1 年齢 = DateDiff("yyyy", 誕生日, 基準日) + _ 2 (Format(誕生日, "m/d") > Format(基準日, "m/d"))

上記を下記に修正したらどうでしょう。

vba

1 年齢 = DateDiff("yyyy", 誕生日, 基準日) + _ 2 (Format(誕生日, "mm/dd") > Format(基準日, "mm/dd"))

"m/d"書式だと桁数が固定でないので正しく大小関係のチェックはできません。

例えば "4/1" と "12/31" だと "4/1" の方が大きいと判断される。
文字列は前から順に比較していくので。


意味不明なコードが紛れ込んでいますね。
それぞれのコードを意味を理解してください。

とりあえず下記でどうですか。

vba

1Sub 年齢計算() 2 Dim ws1 As Worksheet 3 Dim ws2 As Worksheet 4 Set ws1 = Sheets("シート1") 5 Set ws2 = Sheets("シート2") 6 7 Dim LastRow As Long 8 LastRow = ws1.Cells(Rows.Count, 10).End(xlUp).Row 9 10 Dim 基準日 As Date 11 Dim 誕生日 As Date 12 Dim 年齢 As Variant 13 14 基準日 = ws2.Range("AK3") 15 16 Dim i As Long 17 For i = 2 To LastRow 18 誕生日 = ws1.Cells(i, 10).Value 19 年齢 = DateDiff("yyyy", 誕生日, 基準日) + _ 20 (Format(誕生日, "mm/dd") > Format(基準日, "mm/dd")) 21 ws1.Cells(i, 11).Value = 年齢 22 Next i 23 24End Sub

投稿2021/12/13 07:02

編集2021/12/13 08:13
hatena19

総合スコア34075

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jjyso

2021/12/13 07:42

ご回答ありがとうございます。 計算式のほうはご指摘いただいたものに修正しましたが、実行すると「シート1のK列(年齢)」の最終行まで同じ数字が表示なってしまいます。 繰り返しの部分がおかしいのでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問