У меня есть центральный сводный лист, который автоматически генерируется с использованием 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