【问题标题】:Runtime error = '1004'运行时错误 = '1004'
【发布时间】:2018-07-07 19:21:30
【问题描述】:

我正在尝试编写一个程序,该程序将根据每个学生的分数向他们显示字母等级。基本上,指示的等级将显示在 C 列中。从数据表中,John 将获得等级“A”,因为他的分数高于或等于 85。另外,他的等级单元格将被填充为绿色并居中对齐.但是,对于分数低于 35 的学生,学生将在 C 列中获得“F”级。此外,该学生的整行(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

【问题讨论】:

  • c = (Selection.End(xlToRight).row) / r中的.row不应该是.column吗?此外,您为什么要依赖 Selection 以及产生错误的代码行是什么?
  • 声明变量只要c r i j
  • @Jeep 是的,这是列的计数。但是我不知道为什么当只使用 A 列和 B 列时,列数的输出显示为 8。错误状态“应用程序定义或对象定义错误”
  • c = cells(columns.count, r).End(xlToLeftt).column 并开始使用正确引用的父工作表。

标签: vba excel for-loop runtime-error


【解决方案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 列。

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

  1. 现在输入您的规则,一次一个。在此示例中,我将所有包含“A”的单元格以绿色突出显示。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-25
    • 2017-12-14
    • 1970-01-01
    • 1970-01-01
    • 2015-12-06
    • 2016-07-06
    相关资源
    最近更新 更多