Situação:
Estou usando o conteúdo da célula "D2" para nomear a planilha. Acabei de editar o código abaixo para capturar várias entradas problemáticas, postar uma mensagem e fornecer um valor que funciona e é óbvio que precisa ser substituído.
Código:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim BadData As Boolean
If Intersect(Target, ThisWorkbook.Sheets(2).Range("D2")) Is Nothing Then
Exit Sub
End If
BadData = False
If Len(Target.Value) > 31 Or IsEmpty(Target.Value) Then
BadData = True
ElseIf InStr(Target.Value, "[") <> 0 Then
BadData = True
ElseIf InStr(Target.Value, "]") <> 0 Then
BadData = True
ElseIf InStr(Target.Value, "*") <> 0 Then
BadData = True
ElseIf InStr(Target.Value, "?") <> 0 Then
BadData = True
ElseIf InStr(Target.Value, "\") <> 0 Then
BadData = True
ElseIf InStr(Target.Value, "/") <> 0 Then
BadData = True
ElseIf InStr(Target.Value, ":") <> 0 Then
BadData = True
End If
If BadData Then
MsgBox "You have entered an unacceptable ID value." & vbCrLf & _
vbCrLf & _
"The Site No entry must:" & vbCrLf & _
vbCrLf & _
"1) Be a value less than 31 characters long" & vbCrLf & _
"2) Not contain the following characters: /, \, :, ?, *, [, ]" & vbCrLf & _
"3) Not be a blank value" & vbCrLf & _
"4) Be compatible with excel sheet name restrictions"
Target.Value = "Enter Site ID"
End If
ThisWorkbook.Sheets(2).Name = Target.Value
End Sub
Embora o código acima pareça funcionar, tenho certeza de que há várias outras maneiras de atingir o mesmo resultado final. A declaração IF múltipla resultando no mesmo valor me incomodou um pouco.
Originalmente, pensei em colocar todas as verificações individuais de InStr em uma declaração OR longa com as verificações Len e IS Empty, mas escolhi não fazer isso, pois imaginei que seria um problema para outra pessoa tentar descobrir o código. Percebi que pode haver algum benefício em ELSEIF impedir que verificações subsequentes sejam feitas se uma verificação TRUE resultar.
Pergunta
Eu queria saber se existe uma maneira melhor de fazer isso?