2016-09-15 3 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 error в If Hours <> 0 Then То же самое происходит, если я вручную очистите диапазон. Как я могу предотвратить это?

ответ

0

Когда несколько клеток изменяются в то же время (например, когда вы запускаете ваш Clear суб), то Target аргумент Worksheet_Change является диапазон, состоящий из всех измененных клеток - .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

Смежные вопросы