• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:生年月日から学年を計算しようと以下のようにVBを用いて作りました。が、)

生年月日から学年を計算するVBコードのバグについて

このQ&Aのポイント
  • 生年月日から学年を計算するVBコードにバグがあります。
  • 9月までは正しく学年が表示されますが、10月になると一つ前の学年が表示されます。
  • 修正が必要な箇所は、4月~12月の学齢計算の部分です。

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

  • ベストアンサー
  • mshr1962
  • ベストアンサー率39% (7417/18945)
回答No.1

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)
回答No.2

#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

関連するQ&A