Excel VBA迭代不返回值

Excel VBA迭代不返回值,excel,vba,Excel,Vba,我正在编写一个非常简单的子过程,将字母等级分配给数字等级值。我有一个循环,我试图将单元格值设置为函数的输出。这似乎是一项非常简单的任务,但我循环的前两次迭代没有分配任何值。我的循环只经过4行 Function get_letter(grade As Double) Select Case grade Case 0 To 59: letter = "F" Case 60 To 69: letter = "D" Case 70 To 79: l

我正在编写一个非常简单的子过程,将字母等级分配给数字等级值。我有一个循环,我试图将单元格值设置为函数的输出。这似乎是一项非常简单的任务,但我循环的前两次迭代没有分配任何值。我的循环只经过4行

Function get_letter(grade As Double)
    Select Case grade
        Case 0 To 59: letter = "F"
        Case 60 To 69: letter = "D"
        Case 70 To 79: letter = "C"
        Case 80 To 89: letter = "B"
        Case 90 To 100: letter = "A"
    End Select
    get_letter = letter
End Function

Sub assign_letter_grade()
    Dim x As Integer
    Dim grade As Range
    Dim letter As Range

    num_rows = Range("A2", Range("A2").End(xlDown)).Rows.Count

    Set grade = Range("J2")
    Set letter = Range("K2")

    For x = 1 To num_rows
        letter.Value = get_letter(grade.Value)
        Set grade = grade.Offset(1, 0)
        Set letter = letter.Offset(1, 0)
    Next
End Sub

为什么不设置循环中前两行的值

问题来自未包含在范围内的分数。对于VBA,在C或B两种情况下,79.25的分数都不会下降。您可以尝试看看下面是否可以解决此问题:

Function get_letter(grade As Double)
Select Case grade
    Case 0 To 59.99: letter = "F"
    Case 60 To 69.99: letter = "D"
    Case 70 To 79.99: letter = "C"
    Case 80 To 89.99: letter = "B"
    Case 90 To 100.99: letter = "A" ' assuming student can get a score over 100
End Select
get_letter = letter
End Function

问题来自未包含在范围内的分数。对于VBA,在C或B两种情况下,79.25的分数都不会下降。您可以尝试看看下面是否可以解决此问题:

Function get_letter(grade As Double)
Select Case grade
    Case 0 To 59.99: letter = "F"
    Case 60 To 69.99: letter = "D"
    Case 70 To 79.99: letter = "C"
    Case 80 To 89.99: letter = "B"
    Case 90 To 100.99: letter = "A" ' assuming student can get a score over 100
End Select
get_letter = letter
End Function
试试这个:

Function get_letter(grade As Double) As String
    if grade < 60 Then
        get_letter = "F"
    Elseif grade < 70 Then
        get_letter = "D"
    Elseif grade < 80 Then
        get_letter = "C"
    Elseif grade < 90 Then
        get_letter = "B"
    Else
        get_letter = "A"
    End If
End Function
函数获取字母(等级为双精度)作为字符串
如果等级<60,则
get_letter=“F”
Elseif等级<70
获取字母“D”
Elseif等级<80
get_letter=“C”
Elseif等级<90
get_letter=“B”
其他的
获取字母“A”
如果结束
端函数
试试这个:

Function get_letter(grade As Double) As String
    if grade < 60 Then
        get_letter = "F"
    Elseif grade < 70 Then
        get_letter = "D"
    Elseif grade < 80 Then
        get_letter = "C"
    Elseif grade < 90 Then
        get_letter = "B"
    Else
        get_letter = "A"
    End If
End Function
函数获取字母(等级为双精度)作为字符串
如果等级<60,则
get_letter=“F”
Elseif等级<70
获取字母“D”
Elseif等级<80
get_letter=“C”
Elseif等级<90
get_letter=“B”
其他的
获取字母“A”
如果结束
端函数

因为您从第2行开始:

Set grade = Range("J2")
Set letter = Range("K2")
然后立即在循环中偏移1行:

Set grade = grade.Offset(1, 0)
Set letter = letter.Offset(1, 0)
因此,缺少第1行到第2行,并从第3行开始。使用循环中的
x
变量纠正问题:

For x = 1 To num_rows
    letter.Value = get_letter(grade.Value)
    Set grade = Range("J" & x)
    Set letter = Range("K" & x)
Next

因为您从第2行开始:

Set grade = Range("J2")
Set letter = Range("K2")
然后立即在循环中偏移1行:

Set grade = grade.Offset(1, 0)
Set letter = letter.Offset(1, 0)
因此,缺少第1行到第2行,并从第3行开始。使用循环中的
x
变量纠正问题:

For x = 1 To num_rows
    letter.Value = get_letter(grade.Value)
    Set grade = Range("J" & x)
    Set letter = Range("K" & x)
Next

或者使用
索引/匹配

Function get_letter(grade As Double) As String
get_letter = Evaluate("INDEX({""F"",""D"",""C"",""B"",""A""},MATCH(" & grade & ",{0,60,70,80,90,100}))")
End Function
样品


或者使用
索引/匹配

Function get_letter(grade As Double) As String
get_letter = Evaluate("INDEX({""F"",""D"",""C"",""B"",""A""},MATCH(" & grade & ",{0,60,70,80,90,100}))")
End Function
样品


当您将
=获取字母(J2)
放入K2并填写时会发生什么?第J列中的值可以是伪装成数字的文本吗?J2的值是一个计算-=如果(求和(C2:F2)/400*0.2*100+MAX(G2:H2)/100*0.8*100>100100,求和(C2:F2)/400*0.2*100+MAX(G2:H2)/100*0.8*100)只是为了确保我使用CDbl来计算值,结果仍然是一样的一点-这个公式可能更好,因为=MIN(100,求和(C2:F2)/400*0.2*100+最大值(G2:H2)/100*0.8*100)当您将
=获取字母(J2)
放入K2并填写时会发生什么?第J列中的值可以是伪装成数字的文本吗?J2的值是一个计算-=如果(求和(C2:F2)/400*0.2*100+MAX(G2:H2)/100*0.8*100>100100,求和(C2:F2)/400*0.2*100+MAX(G2:H2)/100*0.8*100)只是为了确保我使用CDbl来计算值,结果仍然是一样的一点-这个公式可能更好,因为=MIN(100,求和(C2:F2)/400*0.2*100+最大值(G2:H2)/100*0.8*100)这是可行的。在case语句中是否有更好的方法进行范围更改?在我看来,它看起来很难看。有一个Round()函数,你可以在传递到宏之前对分数使用它,在那里你可以保留你的原始代码,但这取决于你将如何定义它。。。我是说,79.25算是B还是C?(如果我是学生,我会说B)看看Gene的答案,这可能是一个更好的选择。这很有效。在case语句中是否有更好的方法进行范围更改?在我看来,它看起来很难看。有一个Round()函数,你可以在传递到宏之前对分数使用它,在那里你可以保留你的原始代码,但这取决于你将如何定义它。。。我是说,79.25算是B还是C?(如果我是学生,我会说B)看看Gene的答案,这可能是一个更好的选择