Aqui está uma abordagem que não usa Regex .
Em um módulo padrão, insira este UDF ()
Public Function IsItGood(aWord As Variant) As Boolean
Dim s As String
s = "|"
tmp = s & aWord & s
patern = ""
For i = 1 To 100
patern = patern & s & i
Next i
For i = 1 To 10
patern = patern & s & "C" & i
Next i
patern = patern & s & "merge|complete framed|width|border left|border right" & s
If InStr(1, patern, tmp) > 0 Then
IsItGood = True
Else
IsItGood = False
End If
End Function
Na área do código da planilha, digite:
Private Sub Worksheet_Change (ByVal destino como intervalo)
Dim BigS As String
Se Intersect (Range ("G: G"), Target) não é nada, então saia Sub
arr = Split (alvo, "")
Para cada um em arr
Se IsItGood (a) então
Outro
MsgBox Target.Address (0, 0) & vbCrLf & um & vbCrLf & "tem coisas ruins"
Application.Undo
Fim se
A próxima
End Sub
O código do evento recebe a entrada de frase da coluna G . Analisa a frase em palavras e certifica-se de que cada palavra é um membro da lista pré-definida.
EDIT # 1:
A versão anterior do código do evento permitia muitos UnDo
s. Use esta versão:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim BigS As String
If Intersect(Range("G:G"), Target) Is Nothing Then Exit Sub
If Target.Count > 1 Then Exit Sub
If Target.Value = "" Then Exit Sub
arr = Split(Target, " ")
For Each a In arr
If IsItGood(a) Then
Else
MsgBox Target.Address(0, 0) & vbCrLf & a & vbCrLf & "has bad stuff"
Application.EnableEvents = False
Application.Undo
Application.EnableEvents = True
Exit Sub
End If
Next a
End Sub
- só será validado se uma única célula for alterada
- manipula melhor a limpeza de células
- limita o número de mensagens de erro
- elimina a causa do loop infinito ao desfazer