运行时错误=' 1004'

时间:2018-01-29 06:22:38

标签: excel vba excel-vba for-loop runtime-error

我试图写一个程序,表明每个学生的字母成绩与他们的分数一致。基本上,指示的等级将显示在C列中。从数据表中,John将获得等级" A"因为他的标记高于或等于85.另外,他的等级的单元格将填充绿色并且中心对齐。但是,对于分数低于35的学生,学生将获得一个等级" F"在C栏中。此外,该学生的整行(A,B,C栏)将填充为红色。当我尝试运行程序时,我得到了一个

  

运行时错误=' 1004'。

有谁知道如何解决这个问题?

**我的方法是用数据计算行和列的权利吗?

Data

    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

1 个答案:

答案 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

对于条件格式,您可以尝试以下步骤:

  1. 选择您计划有条件格式化的整个列
    (在我的例子中,它是C栏。
  2.   

    enter image description here

    1. 让我们创建一个新规则。
    2.   

      enter image description here

      1. 现在一次输入一个规则。在这个例子中,我突出显示包含&#34; A&#34;绿色。
      2.   

        enter image description here

        问题仍然存在。为什么不在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"))))