Страницы: 1
RSS
VBA вставка массива в отфильтрованный диапазон
 
Доброе время суток
Возникла проблема со вставкой массива в отфильтрованный диапазон. Без фильтрации всё вставляется как положено, а вот если установить фильтр, то получается белиберда. Неужели есть только один путь сбросить фильтр?

Код
Worksheet.AutoFilter.ShowAllData
 
 
Когда-то давно выкладывал на всеобщее обозрение:
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Дмитрий, спасибо! Ваше решение и подобные находил, по вопросу и вариантам, но это всё же не то.
Видимо я коряво задал вопрос. Мне нужно записать весь массив, а не только в видимые ячейки. Но если диапазон отфильтрован, то пишется "чёрте что и с боку бантик", не смотря на то, что читается в массив отфильтрованный диапазон правильно, то есть значения и скрытых и видимых ячеек. При записи же выходит что в видимые ячейки пишется первый элемент массива, а в остальные не записывается ничего. (Excel 2010 32bit).
Получается, что нужно будет написать макрос, запоминающий состояние фильтра, сбрасывающий фильтр, записывающий массив, восстанавливающий состояние фильтрации. Выходит только так. Жаль.
 
Вы где и что читали? И как? У меня представлен код, который вставляет скопированное только в видимые ячейки. Вам достаточно взять эту часть кода и подпихнуть туда массив вместо перечисления ячеек.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Дмитрий, чего сердимся?
Вы мой то код смотрели? Меня не интересует, вставка значений только в видимые ячейки, именно поэтому мне ни к чему модифицировать ВАШ код.
Популярно, надо чтобы этот код
Код
Dim A( 1 To 10, 1 To 1) As Double
'...
Range("A2").Resize(Ubound(A, 1), Ubound(A, 2)).Value = A
 
работал вне зависимости от того - есть ли фильтр (скрытые строки) в диапазоне строк 2- 11 столбца А.
 
Хорошо. Еще раз:
Цитата
anvg пишет: Возникла проблема со вставкой массива в отфильтрованный диапазон
Ответ последний меня поразил:
Цитата
anvg пишет: Меня не интересует, вставка значений только в видимые ячейки
Вы определитесь чего хотите, что ли. Вы хотите вставить ячейки...Куда?

Мне всегда казалось, что отфильтрованные и видимые - это одно и то же. Видимо действительно казалось. Не разъясните разницу? Или мы о чем-то разном думаем? Если все же мы об одном и том же - то самый оптимальный способ именно тот, что описан в статье. С фильтром познаете горя, это факт. Плюс ячейки могут быть скрыты расширенным фильтром или простым скрытием.

Или уже покажите, что должно получиться в результате.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
anvg пишет: Дмитрий, чего сердимся?
Наверное, из-за того, что Вы невнимательно читали:
Цитата
По просьбам посетителей сайта решил доработать данную процедуру. Теперь возможно копировать любые диапазоны: со скрытыми строками, скрытыми столбцами и вставлять скопированные ячейки также в любые диапазоны: со скрытыми строками, скрытыми столбцами. Работает совершенно так же, как и предыдущий: нажатием клавиш Ctrl+q копируем нужный диапазон(со скрытыми/отфильрованными строками и столбцами или не скрытыми), а вставляем сочетанием клавиш Ctrl+w. Вставка производится так же в скрытые/отфильтрвоанные строки и столбцы или без скрытых.
F1 творит чудеса
 
Цитата
anvg пишет:
Неужели есть только один путь сбросить фильтр?
Добрый день Андрей.
Другой путь, записать циклом:

Код
For iRow = 1 To UBound(vData)
Cells(iRow + 1, 2) = vData(iRow, 1)
Next
 
 
Доброе время суток
Всем спасибо! Проще было написать код для восстановления параметров автофильтра (хотя с датами - засада), чем в каждую ячейку писать значение массива, их более 100 000.
 
Не сразу понял, чего хочется. Все же "отфилтрованный диапазон" увел меня не в ту степь.
Можно так попробовать:
Код
Sub test()
    Dim vData As Variant, iRow As Long
    Dim rr As Range
    Dim pSheet As Worksheet
    Dim LRow As Long
    Set pSheet = ActiveSheet
    LRow = Range("A1").CurrentRegion.Rows.Count
    vData = Range(Cells(2, 2), Cells(LRow, 2)).Value
    For iRow = 1 To UBound(vData)
        vData(iRow, 1) = "fid" & CStr(iRow)
    Next
    Set rr = Cells(LRow + 1, 1).Resize(UBound(vData), 1)
    rr.Formula = vData
    rr.Copy
    Cells(2, 2).Resize(UBound(vData), 1).PasteSpecial xlValues
End Sub
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
anvg пишет:
, чем в каждую ячейку писать значение массива, их более 100 000.
Если в таблице ячеек - 100 000, а столбцов - 10, то количество строк = 10 000. Тогда может так ?

Код
Sub test123()
    Dim vData() As Variant, iRow As Long, Rng As Range
    Dim pSheet As Worksheet
    Dim LCnt As Long
    Application.ScreenUpdating = False
    Set pSheet = ActiveSheet
    Set Rng = pSheet.Range("A1").CurrentRegion
    LCnt = Rng.Rows.Count - 1
    Set Rng = Rng.Rows(2).Resize(LCnt)
    ReDim vData(1 To LCnt)
    For iRow = 1 To LCnt
        vData(iRow) = Rng.Rows(iRow).FormulaLocal
        vData(iRow)(1, 2) = "fid" & CStr(iRow)
        Rng.Rows(iRow).FormulaLocal = vData(iRow)
    Next
    Application.ScreenUpdating = True
End Sub
Изменено: С.М. - 22.07.2014 15:48:16
 
А что вот это:
Код
vData(iRow)(1, 2) = "fid" & CStr(iRow) 
просто счётчик?
F1 творит чудеса
 
vData(iRow)(1, 2) - 2-й элемент массива-строки vData(iRow).
Изменено: С.М. - 22.07.2014 16:01:53
 
это я понял, я не совсем понял, что мы туда загоняем
F1 творит чудеса
 
Максим Зеленский, извините, вспомнился армейский анекдот:
"... вижу, что это нейтронный отражатель. Я спрашиваю - почему не покрашен ?"
 
:D  ладно-ладно
F1 творит чудеса
 
Ладно, согласен, я перемудрил с vData(iRow)(1, 2).
 
Доброе время суток.
Коллеги, ещё раз большое спасибо!
Страницы: 1
Наверх