1

У меня есть центральный сводный лист, который автоматически генерируется с использованием VBA с данными из других различных других листов. Когда данные на других листах изменяются, VBA автоматически (используя Workbook_SheetChange) очищает сводный лист и повторно генерирует его.
По большей части это, кажется, работает нормально, но я сталкиваюсь со странной проблемой, когда меняю данные через выпадающий список Data Validation.

Когда Workbook_SheetChange запускается после изменения значения в раскрывающемся списке, кажется, что vba не может полностью удалить данные с листа, который я пытаюсь изменить.
.Cells.ClearContents не может очистить ячейки, и .Hyperlinks.Delete приводит к остановке выполнения vba (но ссылки, по-видимому, удаляются правильно).
Еще одна вещь, которую я заметил, была это .Hyperlinks.Count возвращался правильно только в том случае, если изменение было выполнено через выпадающий список, любое другое изменение всегда возвращало бы 0 (даже если у него не было других проблем, перечисленных выше).

Не совсем уверен, является ли это предполагаемым поведением или ошибкой, но это, конечно, кажется странным. По крайней мере, VBA, похоже, не выдает никаких ошибок.

Есть ли способ сделать эту работу с выпадающими?

У меня есть пример кода ниже, который демонстрирует эту проблему:

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

0