2016-09-15 128 views
1

我在工作簿中的以下两个模块:隐藏的错误消息

Private Sub Worksheet_Change(ByVal Target As Range) 
' check if target is in Column B or Column G 
If Target.Column = 2 Or Target.Column = 7 Then 
Select Case Target.Row 
    Case 12 To 18, 26 To 32 'check if target row is 12 to 18 (including) or between 26 to 32 (including) 
     Hours = Target.Value 
     If Hours <> 0 Then 
      If Hours > 8 Then 
       Target.Value = 8 
       Target.Offset(0, 1).Value = Hours - 8 
       Exit Sub 
      Else 
       If Hours < 8 Then 
        Target.Offset(0, 2).Value = 8 - Hours 
       End If 
       Exit Sub 
      End If 
     End If 
End Select 
End If 
End Sub 

Sub Clear() 
Range("B12:E18").Select 
Selection.ClearContents 
Range("G12:J18").Select 
Selection.ClearContents 
Range("B26:E32").Select 
Selection.ClearContents 
Range("C9").Select 
Selection.ClearContents 
MsgBox ("Content cleared") 
End Sub 

当我把第二个,我收到了Run time error 13 Type mismatch errorIf Hours <> 0 Then 同样的,如果我手动发生清除范围。 我该如何预防?

回答

0

当多个小区在同一时间改变,则Target参数Worksheet_Change是由所有的改变的细胞的范围(当运行Clear子如) - 该范围的.Value将在2 d值的数组,而不是单个值,因此您无法直接将其与单个值进行比较(例如,以测试它是否为零)。

最简单的方法是在Target> 1个单元格时退出。

Private Sub Worksheet_Change(ByVal Target As Range) 
' check if target is in Column B or Column G 

If Target.Cells.CountLarge > 1 Then Exit Sub '<<<<<<<<<<<<<< 

If Target.Column = 2 Or Target.Column = 7 Then 
Select Case Target.Row 
    Case 12 To 18, 26 To 32 'check if target row is 12 to 18 (including) 
          ' or between 26 to 32 (including) 
     Hours = Target.Value 
     If Hours <> 0 Then 
      If Hours > 8 Then 
       Target.Value = 8 
       Target.Offset(0, 1).Value = Hours - 8 
       Exit Sub 
      Else 
       If Hours < 8 Then 
        Target.Offset(0, 2).Value = 8 - Hours 
       End If 
       Exit Sub 
      End If 
     End If 
End Select 
End If 
End Sub 

而且这是一个简单的处理清除范围的方式:

Sub Clear() 

    Range("B12:E18, G12:J18,B26:E32, C9").ClearContents 
    MsgBox ("Content cleared") 

End Sub 

强制性: How to avoid using Select in Excel VBA macros