VBA não é possível limpar completamente a planilha após ser chamado pelo menu suspenso + Workbook_SheetChange

1

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
    
por Angus Johnston 06.07.2017 / 18:22

0 respostas