/ / Excel VBA - Forçar erro em maiúsculas quando o conteúdo é excluído - excel, excel-vba, vba

Excel VBA - Forçar erro em maiúsculas quando o conteúdo excluído - excel, excel-vba, vba

Estou tentando forçar uma célula a assumir um valor em maiúsculas, o que funciona, usando o código abaixo.

If Intersect(Target, Range("B9", "F10")) Is Nothing Then Exit Sub
Application.EnableEvents = False
ActiveSheet.Unprotect Password:=""
Target = UCase(Target)
Application.EnableEvents = True
ActiveSheet.Protect Password:=""

No entanto, quando o conteúdo da célula é excluído (o que pode ser necessário), recebo o seguinte erro "Erro em tempo de execução" 13 ": Incompatibilidade de tipo"

Se você puder lançar alguma luz sobre isso, isso seria ótimo!

Respostas:

2 para resposta № 1

O destino é um intervalo, não uma sequência de caracteres (supondo que você esteja usando o evento Worksheet_Change).

Devem haver várias células mudando ao mesmo tempo, e não células vazias.

Quando você tem uma única célula, tudo bem, porque valor de O alvo é avaliado como Target.Value, que geralmente é possível converter como String. Quando você altera mais de uma célula de uma vez, Target.Value retornará uma matriz, que não pode ser convertida em String.

Portanto, você deve alterar cada célula de cada vez:

Dim cell as Range, cells as Range
Set cells=Intersect(Target, Range("B9", "F10"))
If cells Is Nothing Then Exit Sub
Application.EnableEvents = False
ActiveSheet.Unprotect Password:=""
For each cell In cells.Cells
Cell.Value = UCase(cell.Value)
Next
Application.EnableEvents = True
ActiveSheet.Protect Password:=""

1 para resposta № 2

Eu mantenho minha posição. O código original é:

Target = UCase(Target)

o que implica que você deseja ter o intervalo de destino em maiúsculas. A maneira de fazer isso é substituindo esta linha por:

For Each c In Target
If VarType(c.Value)=vbString Then
c.Value = UCase(c.Value)
End If
Next

que dá:

If Intersect(Target, Range("B9", "F10")) Is Nothing Then Exit Sub
Application.EnableEvents = False
ActiveSheet.Unprotect Password:=""
Dim c As Range
For Each c In Target
If VarType(c.Value)=vbString Then
c.Value = UCase(c.Value)
End If
Next
Application.EnableEvents = True
ActiveSheet.Protect Password:=""