Eu tenho uma folha de resumo central que é gerada automaticamente usando o VBA com dados de outras várias outras planilhas. Quando os dados em outras planilhas são alterados, o VBA automaticamente (usando Workbook_SheetChange
) limpa a planilha de resumo e a gera novamente.
Para a maior parte, isso parece funcionar bem, mas tive um problema estranho sempre que altero os dados por meio de um menu suspenso Validação de dados.
Quando Workbook_SheetChange
é executado depois de alterar o valor em uma lista suspensa, o vba parece não conseguir limpar totalmente os dados da planilha que estou tentando alterar.
.Cells.ClearContents
falha ao limpar as células e .Hyperlinks.Delete
faz com que o vba pare de executar (mas os links parecem ser removidos corretamente).
Outra coisa que notei foi que .Hyperlinks.Count
estava retornando corretamente apenas se a mudança fosse feita através da lista suspensa, qualquer outra mudança sempre retornaria 0 (mesmo que não tivesse os outros problemas listados acima).
Não tenho certeza se esse é um comportamento intencional ou um bug, mas certamente parece estranho. No mínimo, o VBA não parece estar causando erros.
Existe alguma maneira de realmente fazer isso funcionar com suspensões?
Eu tenho um código de exemplo abaixo que demonstra esse problema:
Option Explicit
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
If Sh.Name = "Sheet1" Then
Dim TestSheet As Worksheet
Set TestSheet = Worksheets("Sheet2")
With TestSheet
' .Cells.Clear 'We don't want to fully clear the sheet.
.Cells.ClearContents
'.Cells.ClearFormats 'Sadly this also clears conditional formatting
.Cells.ClearComments
.Cells.ClearNotes
.Cells.ClearOutline
Debug.Print "TEST1 - " & .Hyperlinks.Count
.Hyperlinks.Delete
Debug.Print "TEST2" 'This doesn't run if sheet change is caused by dropdown
End With
End If
End Sub