Do Until循环语法错误vba excel

时间:2015-12-09 03:28:52

标签: excel vba

我正在尝试编写此模块以计算下一个单元格中%的字母等级并循环遍历行,直到该行为空。这段代码的语法有什么问题?我收到错误:运行时错误438:对象在Average = Cells(i, 6).Valve

不支持此属性或方法
Sub Grade()
Dim Average As Double
Dim i As Integer

i = 3

Do Until IsEmpty(Cells(i, 6))

Average = Cells(i, 6).Valve
Average = Average * 100

If (Average <= 60) Then
    Cells(i, 7).Valve = ("E")
End If
If (Average <= 70) Then
    Cells(i, 7).Valve = ("D")
End If
If (Average <= 80) Then
    Cells(i, 7).Valve = ("C")
End If
If (Average <= 90) Then
    Cells(i, 7).Valve = ("B")
End If
If (Average <= 100) Then
    Cells(i, 7).Valve = ("A")
End If

i = i + 1
Loop

End Sub

3 个答案:

答案 0 :(得分:1)

更改

Dim Average As Double
i As Integer

Dim Average As Double
Dim i As Integer

or

Dim Average As Double, i As Integer

or

Dim Average As Double, _
i As Integer

您的代码需要更多的工作。使用这样的东西:

Sub Grade()
Dim Average As Double
Dim i As Integer

i = 3

Do Until IsEmpty(Cells(i, 7))

    Cells(i, 6).Value = Average
    ' Perhaps the above should be 
    ' Average = Cells(i,6).Value

    If (Average < 60) Then
        Cells(i, 7).Valve = ("E")
    End If
    If (Average < 70) Then
        Cells(i, 7).Valve = ("D")
    End If
    If (Average < 80) Then
        Cells(i, 7).Valve = ("C")
    End If
    If (Average < 90) Then
        Cells(i, 7).Valve = ("B")
    End If
    If (Average < 100) Then
        Cells(i, 7).Valve = ("A")
    End If

    i = i + 1
Loop

End Sub

答案 1 :(得分:0)

只想到@zedfoxus帖子

单行如果

不需要结束
Sub Grade()
Dim Average As Double
Dim i As Long

i = 3

Do Until IsEmpty(Cells(i, 7))

    Average = Cells(i, 6).Value
    Average = Average * 100    
    If (Average < 60) Then Cells(i, 7).Value = ("E")
    If (Average < 70) Then Cells(i, 7).Value = ("D")
    If (Average < 80) Then Cells(i, 7).Value = ("C")
    If (Average < 90) Then Cells(i, 7).Value = ("B")
    If (Average < 100) Then Cells(i, 7).Value = ("A")

    i = i + 1
Loop

End Sub

除此之外,这是我对这个问题的看法。我已经使用二维数组组合了一个浓缩例程,并利用了工作表函数Vlookup。这是有效的,因为它会找到最接近的东西(当你使用数字范围时很有用)

Sub Grade()
Dim Average As Double, i As Long, MyArr As Variant
MyArr = Array(Array(60, "E"), Array(70, "D"), Array(80, "C"), Array(90, "B"), Array(100, "A"))
i = 3
Do Until IsEmpty(Cells(i, 7))
    Average = Cells(i, 6).Value * 100 'Why * 100? Anyway just copied what you have done in your code
    Cells(i, 7).Value = Application.WorksheetFunction.VLookup(Average, MyArr, 2)
    i = i + 1
Loop
End Sub

最后,因为Average变量只使用了一次,所以它并不需要在那里(虽然它可能与MyArr相同,但它会过于膨胀而无法包含在Vlookup中,它会变成很难阅读),你可以删除它,只是在Vlookup中引用它的构成来进一步压缩代码,最后,我们可以通过使用for next循环删除i=3i=i+1并轮询到最后一行数据如下:

Sub Grade()
Dim i as long, MyArr As Variant
MyArr = Array(Array(60, "E"), Array(70, "D"), Array(80, "C"), Array(90, "B"), Array(100, "A"))
For i = 3 To Range("G" & Rows.Count).End(xlUp).Row
    Cells(i, 7).Value = Application.WorksheetFunction.VLookup(Cells(i, 6).Value * 100, MyArr, 2)
Loop
End Sub

我不确定为什么你乘以100而我没有你的测试数据。我制作了自己的测试数据但是必须删除* 100以使其正常工作,我的数据在F列中。

40  
50  
60  E
65  E
70  D
75  D
80  C
85  C
90  B
95  B
100 A

这是我使用的代码:

Sub Grade2()
Dim i As Long, MyArr As Variant
MyArr = Array(Array(60, "E"), Array(70, "D"), Array(80, "C"), Array(90, "B"), Array(100, "A"))
For i = 3 To Range("F" & Rows.Count).End(xlUp).Row
    Cells(i, 7).Value = Application.WorksheetFunction.VLookup(Cells(i, 6).Value, MyArr, 2)
Next
End Sub

答案 2 :(得分:0)

我想知道你是否想要使用Formula而不是VBA。

Vlookup可以做到这一点。如下所示,希望得到这个帮助。

enter image description here

相关问题