Страницы: 1
RSS
Ошибка при попытке удалить значения в ячейках строки умной таблицы (run-time error '-2147417848 (80010108)')
 
Добрый день,

В связи с отсутствием знаний в VBA пытаюсь создать файл, используя примеры в интернет.
Одна из задач - удалить данные в остальных столбцах строки, в которой пользователь изменил значение в столбце "Тип" (см. пример). Т.к. при смене типа, требуется заново выбрать "Техоперацию" и, как следствие, возможны другие "единицы измерения", количества, а также формулы, по которым считается итоговая сумма по строке.

Пытаюсь сделать через событие Worksheet.Change
Но, чтобы я не делал, какие бы варианты не подставлял, все время получаю ошибку "-2147417848 (80010108)' Метод 'ClearContents' of object 'Range' failed.
Прошу помочь при возможности и объяснить, что не так в коде?

Заранее благодарю
 
Sviman144, добрый день. У вас бесконечный цикл получается. Может так?
Код
Private Sub Worksheet_Change(ByVal Target As Range)

    Dim curRng As Object
    
    If Target.Cells.Count > 1 Then Exit Sub
    
    Application.EnableEvents = False
    If Not Intersect(Columns("C"), Target) Is Nothing Then
        Set curRng = Target.Offset(, 1).Resize(, 5)
        curRng.ClearContents
    End If
    
    Application.EnableEvents = True

End Sub
Изменено: Alex - 03.03.2026 13:50:52
 
Попробуйте так
Код
Private Sub Worksheet_Change(ByVal Target As Range)
Dim iTbl As ListObject
On Error Resume Next
Set iTbl = Me.ListObjects("ОперацииРасчет")
If Not Intersect(Target, iTbl.ListColumns(2).DataBodyRange) Is Nothing And Target.Count = 1 Then
  Application.ScreenUpdating = False
  Application.EnableEvents = False
  Target.Offset(, 1).Resize(, 5).ClearContents
End If
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub

И раз уж используете Умную таблицу, то в коде лучше работать с ее объектами и свойствами
The VBA Guide To ListObject Excel Tables
Изменено: Sanja - 03.03.2026 15:12:07
Согласие есть продукт при полном непротивлении сторон
 
Спасибо всем за оперативные ответы.

Если добавить "Application.EnableEvents = False/True" в том числе, в "мой" вариант, то тоже все работает.
Получается, в любом случае, "бесконечный цикл", который купируется через Application.EnableEvents = False/True.

"Бесконечность" происходит из-за того, что результатом события "Worksheet.Change" является новое изменение листа? Но, вроде как, повторное событие не должно возникать, т.к. меняются другие ячейки, а не те, которые прописаны в условии "IF", разве нет?
 
Цитата
Sviman144 написал: Но, вроде как, повторное событие не должно возникать, т.к....
Событие возникнет при любом изменении на листе, а вот обрабатывать его или должны Вы описать в своем коде
Согласие есть продукт при полном непротивлении сторон
 
Цитата
написал:
т.к. меняются другие ячейки
Разве? Активная ячейка (ActiveCell) в вашем условии остается той же.  
Изменено: Alex - 03.03.2026 14:11:37
 
Sanja,
в вашем примере в обоих упоминаниях Application.EnableEvents = True. Так и должно быть? Ведь "по умолчанию" итак "True" стоит, разве нет?
 
Sanja,
прошу прощения, еще один вопрос вдогонку...

Если я беру ваш код 1 в 1, но добавляю в конце
Код
Debug.Print Target.Address
, то получаю, например:
$L$21:$P$21
$K$21

Почему в одном target.address получается 2 диапазона?

При этом, если этот debug.print вставляю внутрь блока If, то результат будет одиночным: $K$21
 
Цитата
Sviman144 написал: Так и должно быть?
Нет конечно. В начале должно быть False, конечно). Изменил
Изменено: Sanja - 03.03.2026 15:12:25
Согласие есть продукт при полном непротивлении сторон
 
Всем — большое спасибо!
Задача решена!
Страницы: 1
Читают тему
Наверх