Ok, o (s) seu (s) problema (s) são provenientes principalmente do uso de On Error Resume Next
.
-
Sua instrução if lançará um erro se o intervalo não existir. Isso significa que não será avaliado e, em vez disso, você passará para a próxima linha devido ao currículo seguinte.
-
Agora desativará os eventos. Assim, o seu evento só será acionado uma vez, já que você nunca parece reativá-lo.
-
Agora, limpará todo o conteúdo, sem nunca ter testado sua interseção.
Então, precisamos fazer duas coisas:
- Corrigir a avaliação
- Desconecte o Application.EnableEvents = false ou, pelo menos, corrija-o. A maioria dos eventos só é gerada pelo usuário fazendo alterações em vez do script VBA, portanto, é possível ignorar isso completamente.
A melhor maneira de corrigir isso seria chamar uma função mais segura que verifique se o intervalo existe e retorna verdadeiro ou falso, dependendo desse resultado.
Algo parecido com isso pode ser mais útil para você:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
'Initialize cabinet finishing board
If RangeExists("RSTcabFINISHING") Then 'See below for what this does. We only progress if we get true.
If Not Intersect(Target, Range("RSTcabFINISHING")) Is Nothing Then
Target.Offset(0, 1).Resize(, 3).ClearContents
End If
End If
End Sub
Function RangeExists(RangeName As String)
On Error GoTo NotValid: 'If we fail, jump to "NotValid"
If Range(RangeName).Rows >= 0 Then 'Test if the range exists - if it doesn't we'll get an error, if it does it
'will have 0 or more rows
RangeExists = True 'We didn't error and we do have 0 or more rows, so the function is true
End If
Exit Function 'Break out of the function before we hit our error handler
NotValid: 'We only get this far if an error was thrown (Range doesn't exist)
RangeExists = False 'Flag the function as false before returning
End Function