- ベストアンサー
生年月日から学年を計算するVBコードのバグについて
- 生年月日から学年を計算するVBコードにバグがあります。
- 9月までは正しく学年が表示されますが、10月になると一つ前の学年が表示されます。
- 修正が必要な箇所は、4月~12月の学齢計算の部分です。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
10行目:Monthの解は数値なので比較する値は""で囲わない If Month(Date) >= "4" Then => If Month(Date) >= 4 Then 16行目:10行目と同じ、且つ10行目の例外値のすべてなので ElseIf Month(Date) < "4" Then => Else 21行目~22行目:無意味なので削除 Else idx = 19 後、問題とは別ですが Umareは日付ですよね。 If IsNull(Umare) Then => If IsDate(Umare) Then の方がいいのでは? もうひとつ学齢の計算なら日付の比較は4月1日ではなく4月2日だと思うけど... idx = DateDiff("yyyy", Umare, DateSerial(Year(Date), 4, 1)) idx = DateDiff("yyyy", Umare, DateSerial(Year(Date) - 1, 4, 1))
その他の回答 (1)
- Wendy02
- ベストアンサー率57% (3570/6232)
#1さんの回答で、ほとんど、こちらの考えている部分と一致していますので、やめようとは思いましたが、私なら、こういうコードを書く(本格的なものとは違います)というサンプルコードを置いておきます。参考にしてみてください。 If IsNull(Umare) Then Jokyo = "" Null値は、Null値をVariant型の変数に入れないと判定できません。つまり、人為的にいれないと出ません。ワークシート等なら、="" や =Empty です。ただし、IsEmpty(変数)は、ここでは違います。 また、Jokyo="" は、関数が文字型なら、値を入れなければ、「""」(長さ0の文字列)になります。 なお、今回は、あえてDateDiff は使いません。理由は特にありません。 たぶん、ワークシートで使う分には、ByVal キーワードは不要な気がします。 '// Function EdGrade(ByVal yrBirth As Variant) As String Dim d As Date, i As Long Dim dif As Long Dim stat As String 'エラー排除 If IsDate(yrBirth) = False Then EdGrade = CVErr(xlErrValue): Exit Function d = yrBirth If d > Date Then EdGrade = CVErr(xlErrNA): Exit Function If DateSerial(Year(Date), Month(d), Day(d)) > DateSerial(Year(Date), 4, 1) Then i = 0 Else i = 1 End If dif = Year(Date) - Year(d) + i Select Case dif Case 0 To 4 stat = "未入学" Case 5 stat = "幼稚園年少" Case 6 stat = "幼稚園年長" Case 7 To 12 stat = "小学" & dif - 6 & "年生" Case 13 To 15 stat = "中学" & dif - 12 & "年生" Case 16 To 18 stat = "高校" & dif - 15 & "年生" Case Else stat = "既卒生" End Select EdGrade = stat End Function