获取Excel Vba错误但代码仍然有效?

时间:2017-11-05 14:59:13

标签: excel vba excel-vba automation

自从我使用VBA以来,已经很长时间了,甚至出类拔萃,但由于我的工作和繁琐的excel编辑工作的原因,我决定通过自动化来实现这一目标。我有一个电子表格,其中包含一个计算员工工资的表格(由于显而易见的原因,已审查的员工姓名和大部分表格已被删除):

EDITED FOR PRIVACY REASOSN

该表基于一个积分系统,未来的老板将根据员工当天的表现,在每一栏中放置1到3个点(缺席列除外)。然后,电子表格汇总了右侧“总计”列中的总点数。然后根据这些要点将员工从A +评分为C.那是我的一部分。我决定做的是编写一个简单的vba代码来自动执行该操作(有更多的员工比你在该图片上看到的那样,所以不要叫我懒惰!)。所以这是从以下开始:

Private Sub Worksheet_Change(ByVal Target As Range)
    If ActiveSheet.Range("P7").Value >= 10 Then   'Total points value
        ActiveSheet.Range("Q7").Value = "A+"      'change value of the grade
    ElseIf ActiveSheet.Range("P7").Value >= 8 Then
        ActiveSheet.Range("Q7").Value = "A"
    ElseIf ActiveSheet.Range("P7").Value >= 6 Then
        ActiveSheet.Range("Q7").Value = "B+"
    ElseIf ActiveSheet.Range("P7").Value >= 4 Then
        ActiveSheet.Range("Q7").Value = "B-"
    Else
        ActiveSheet.Range("Q7").Value = "C"
    End If
End Sub

对我来说这似乎很简单,但我有一个问题,每次运行我都会收到此错误:

  

对象“_Worksheet”的方法“范围”失败

这甚至不是。如果我在出现错误提示时点击“结束”,它就可以了!以我想要的方式完美运作!

有人可以帮助解决错误,指出我的代码中有什么错误 甚至更多的人可以向我解释为什么每次代码执行时我都会收到错误,但代码STILL会起作用。这怎么可能?

1 个答案:

答案 0 :(得分:1)

我无法在评论中发布代码,但是代码在没有错误的情况下正常运行,并且可以执行您想要执行的操作。

故障似乎是由于被检查的细胞(目标)和细胞被改变(Q7)在同时发射时发生冲突的问题。

Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo eosub
Application.EnableEvents = False
    If ActiveSheet.Range("P7").Value >= 10 Then   'Total points value
        ActiveSheet.Range("Q7").Value = "A+"      'change value of the grade
    ElseIf ActiveSheet.Range("P7").Value >= 8 Then
        ActiveSheet.Range("Q7").Value = "A"
    ElseIf ActiveSheet.Range("P7").Value >= 6 Then
        ActiveSheet.Range("Q7").Value = "B+"
    ElseIf ActiveSheet.Range("P7").Value >= 4 Then
        ActiveSheet.Range("Q7").Value = "B-"
    Else
        ActiveSheet.Range("Q7").Value = "C"
    End If
eosub:
Application.EnableEvents = True
End Sub

但是,如果您手动填写P列,那么它应该是这样的:

Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo eosub
Application.EnableEvents = False
If Target.Column = 16 Then
    If Target.Value >= 10 Then   'Total points value
        Target.Offset(0, 1).Value = "A+"     'change value of the grade
    ElseIf Target.Value >= 8 Then
        Target.Offset(0, 1).Value = "A"
    ElseIf Target.Value >= 6 Then
        Target.Offset(0, 1).Value = "B+"
    ElseIf Target.Value >= 4 Then
        Target.Offset(0, 1).Value = "B-"
    Else
        Target.Offset(0, 1).Value = "C"
    End If
End If
eosub:
Application.EnableEvents = True
End Sub

然而,最简单的方法是使用Scott Craner建议的公式设置。