我试图写一个程序,表明每个学生的字母成绩与他们的分数一致。基本上,指示的等级将显示在C列中。从数据表中,John将获得等级" A"因为他的标记高于或等于85.另外,他的等级的单元格将填充绿色并且中心对齐。但是,对于分数低于35的学生,学生将获得一个等级" F"在C栏中。此外,该学生的整行(A,B,C栏)将填充为红色。当我尝试运行程序时,我得到了一个
运行时错误=' 1004'。
有谁知道如何解决这个问题?
**我的方法是用数据计算行和列的权利吗?
Sub Green()
Dim Mark As Integer
Dim c As Integer
Dim r As Integer
Dim i As Integer
Dim j As Integer
r = Cells(Rows.Count, 1).End(xlUp).row
c = (Selection.End(xlToRight).row) / r
For i = 0 To r
For j = 0 To c
Mark = Range(i, "B").Value
If Mark >= 85 And Mark <= 100 Then
Range(i, "C").Value = "A"
Range(i, "C").Interior.Color = RGB(0, 255, 0)
Range(i, "C").HorizontalAlignment = xlCenter
ElseIf Mark >= 0 And Mark <= 35 Then
Range(i, "C").Value = "F"
Range(i, j).Interior.Color = RGB(255, 0, 0)
Range(i, "C").HorizontalAlignment = xlCenter
Else
End If
Next j
Next i
MsgBox ("Rows = " & r)
MsgBox ("Columns =" & c)
End Sub
答案 0 :(得分:1)
我的建议是您处理应用程序内置功能的条件格式。如果您不同意,请随时修改此代码。
Function LastRow(ByVal ws As Worksheet, Optional ByVal col As Variant = 1) As Long
With ws
LastRow = .Cells(.Rows.Count, col).End(xlUp).row
End With
End Function
Sub assignLetterGrade()
Dim ws As Worksheet, i As Long, ltr As String
Set ws = ThisWorkbook.Worksheets(1)
For i = 1 To LastRow(ws, "B")
Select Case ws.Cells(i, "B")
Case 85 To 100
ltr = "A"
Case 75 To 84
ltr = "B"
Case 65 To 74
ltr = "C"
Case 55 To 64
ltr = "D"
Case 0 To 54
ltr = "F"
Case Else
MsgBox "Unknown Grade! Aborting!"
Exit Sub
End Select
ws.Cells(i, "C").Value = ltr
Next
End Sub
对于条件格式,您可以尝试以下步骤:
问题仍然存在。为什么不在VBA中格式化?
你应该了解VBA的第一件事是效率很低。虽然最小的代码可能需要几分之一秒,但是一旦你的循环变得越来越大,你会注意到完成任务需要更长的时间。
此外,您遇到的问题是您的代码不是原始的,可能会有轻微的错误。当您开始构建项目时,轻微的错误可能会变成重大错误(例如:使用ActiveSheet
会想到。它可能适用于您的小项目,但接下来您知道您正在将格式应用于错误的工作表,引用错误的单元格值,依此类推)。
如果你可以避免VBA,那就去做吧。利用Microsoft优秀的条件格式UI。它非常高效且更易于管理。
此外,整个VBA项目可以在不使用VBA的情况下完成。 VBA很慢。您可以在C列中轻松使用公式来为您提供字母等级。
公式的不太高级版本是使用嵌套的If语句。
=IF(B1>=85,"A", IF(B1>=75,"B", IF(B1>=65,"C", IF(B1>=55,"D","F"))))