Я работаю в Excel 2013, пишу макрос в VBA и пытаюсь присвоить значение всем ячейкам в столбце объекта списка (таблицы), включая те, которые могут быть скрыты фильтрами. Назначение значения каждой ячейке в отдельности, казалось, значительно замедляло процесс, и я нашел предложение скопировать диапазон в вариантный массив, выполнить итерацию по массиву, чтобы изменить значения, а затем скопировать массив обратно в диапазон.
varray = table.DataBodyRange.Columns(columnIndex).Value
For i = 1 to UBound(varray, 1)
If (condition) then
varray(i, 1) = i
End If
Next i
table.DataBodyRange.Columns(columnIndex).Value = varray
По большей части это работает и решает проблему скорости. Он перестает работать, когда есть фильтр для любого столбца в таблице. Насколько я могу судить, массив все равно копируется из таблицы правильно, но не копируется обратно корректно. Все ячейки до первой ячейки, скрытой фильтром, будут обработаны правильно, но скрытые ячейки не будут изменены, а для всех ячеек после скрытых ячеек будет установлено первое значение в массиве.
Это происходит только тогда, когда ячейки скрыты фильтром, а не когда скрыты строки рабочего листа.
кто-нибудь знает, почему это произошло? Есть ли способ правильно повторно применить массив, несмотря на фильтр? Если нет, есть ли способ временно удалить фильтр, внести изменения, а затем вернуть тот же фильтр на место? Или просто лучший способ сделать это, не жертвуя скоростью?
Любая помощь будет оценена по достоинству. Спасибо!