自从我使用VBA以来,已经很长时间了,甚至出类拔萃,但由于我的工作和繁琐的excel编辑工作的原因,我决定通过自动化来实现这一目标。我有一个电子表格,其中包含一个计算员工工资的表格(由于显而易见的原因,已审查的员工姓名和大部分表格已被删除):
该表基于一个积分系统,未来的老板将根据员工当天的表现,在每一栏中放置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会起作用。这怎么可能?
答案 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建议的公式设置。