andronus Пользователь Сообщений: 147 |
#1 21.02.2019 16:53:42 Здравствуйте. Имеется файл с двумя листами — «НетФильтра» и «ЕстьФильтр». На первом листе имеется таблица и кнопка с кодом:
Он выделяет две ячейки сразу под надписью «Числитель». На втором листе имеется аналогичная первому листу таблица, но с фильтром (скрыты некоторые строки) и кнопка с кодом:
Мною подразумевалось, что SpecialCells(xlCellTypeVisible) будет выделять только видимые ячейки, но это не так — выдается ошибка, мол нет ячеек по условию. Подскажите плиз, как произвести выделение по видимым ячейкам на втором листе в рамках текущего кода (это важно, т.к. код будет использоваться в формуле)? При условии, что начальная ячейка — А2 (как и видно в коде), и что фильтр может быть разным, то есть вместо Resize(2, 1) в коде должно быть выделение до конца видимых ячеек столбца. Итоговый вид, как я предполагаю, должен быть примерно таким:
Да, он неправильный, но суть, надеюсь понятна — смещение от ячейки A1 вправо на два столбца и одну ячейку вниз, и дальнейшее выделение вниз до первой пустой видимой ячейки. Прикрепленные файлы
Изменено: andronus — 21.02.2019 17:21:53 |
||||||
ocet p Пользователь Сообщений: 438 |
#2 21.02.2019 17:36:31 Попробуйте:
|
||
andronus Пользователь Сообщений: 147 |
ocet p, а вы пробовали? У меня ошибка «Object Required». Range().Select , потому что, повторюсь, значение из скобок будет использоваться в формуле. Селект тут просто для проверки, что выделяется верная область. Изменено: andronus — 21.02.2019 17:45:54 |
Anchoret Пользователь Сообщений: 1059 Anchoret |
#4 21.02.2019 18:26:15 andronus, в пошаговом режиме выполните след.код:
Изменено: Anchoret — 21.02.2019 18:28:56 |
||
andronus Пользователь Сообщений: 147 |
#5 21.02.2019 18:34:35 Anchoret, прошу, прочтите еще раз внимательнее мои слова — нужно изменить код только в скобках Range().Select, потому что это значение будет применяться в формуле. Он должен выглядеть как-то так:
Вот с Range([A1].Offset(1, 2).Address).Select всё нормально. Нужно всего лишь (просто я не знаю как): Offset(1, 2) добавить выделение вниз до окончания непрерывных данных. Я не верю, что нельзя сделать макросом то, что я могу сделать руками. Я перерыл гугл, кучу зарубежных сайтов, справок и прочего. На вас последняя надежда… Изменено: andronus — 21.02.2019 18:35:15 |
||
Anchoret Пользователь Сообщений: 1059 Anchoret |
andronus, Вы лучше скажите зачем Вам формула через макрос, когда все можно сделать макросом? Ну и как предположил в прошлой Вашей теме структура файла примера явно отличается от структуры файла, где это все планируется применить. Изменено: Anchoret — 21.02.2019 18:48:48 |
andronus Пользователь Сообщений: 147 |
#7 21.02.2019 18:55:29 Anchoret, это совсем неважно, но поясняю. Есть задача, в рамках которой в ячейки столбца А будут вставляться формулы, содержащие в себе суммы значений выделенных диапазонов, вот так:
Но т.к. могут отфильтровываться некоторые строки, то нельзя использовать жестко объявленные диапазоны типа Range(«C1:C2») или изменение размеров выделения типа Resize(2, 1) . Изменено: andronus — 21.02.2019 18:56:06 |
||
Anchoret Пользователь Сообщений: 1059 Anchoret |
#8 21.02.2019 19:00:50 andronus,не правильный ответ. Какую задачу Вы пытаетесь решить с помощью этих манипуляций? Для указанного выше действа (точкой отсчета является активная ячейка):
Изменено: Anchoret — 21.02.2019 19:19:40 |
||
andronus Пользователь Сообщений: 147 |
Anchoret, вставка формулы в столбец. В формуле значения числителя и знаменателя берутся из выделений. Range([A1].Offset(1, 2).Address).Select : Offset(1, 2) добавить выделение вниз до окончания непрерывных данных. Я уже повторяюсь. |
andronus Пользователь Сообщений: 147 |
Anchoret, у вас прям целый саб, но он не нужен, к сожалению. |
Anchoret Пользователь Сообщений: 1059 Anchoret |
#11 21.02.2019 20:03:29 andronus, все по последнему вопросу. наслаждайтесь:
Но если строка
будет скрыта (2-я строка) фильтром или руками, то выдаст ошибку.
Изменено: Anchoret — 21.02.2019 20:38:41 |
||||||
ocet p Пользователь Сообщений: 438 |
andronus, хочете или не хочете, надо это сделать циклом, используя например «Areas», потому что вы никогда не будете знали которые строки будут скрытыми а которые нет, это зависит от критериев фильтрации. Тут для вас инфо как использовать «Areas»: https://www.planetaexcel.ru/forum/index.php?PAGE_NAME=read&FID=1&TID=114353&… Смотрите #5 — Jack Famous … или может #4 — Nordheim … (?) … без «Areas» Изменено: ocet p — 21.02.2019 21:16:04 |
RAN Пользователь Сообщений: 7091 |
#13 21.02.2019 21:46:16
Изменено: RAN — 21.02.2019 23:01:01 |
||
k61 Пользователь Сообщений: 2441 |
#14 22.02.2019 05:07:18
|
||
Paul Zealand Пользователь Сообщений: 97 |
#15 22.02.2019 06:06:39
такой еще чутка кривовато-страноватый способ. Ну, мало ли. Вдруг подойдет. Изменено: Paul Zealand — 22.02.2019 06:07:01 |
||
andronus Пользователь Сообщений: 147 |
#16 22.02.2019 11:24:06
Не работает. Всем спасибо за участие. С сожалением для себя узнал, что не всё можно сделать макросами. За ночь приняли решение делать эту часть задачи вручную, благо часть не такая большая ожидается. Еще раз всем спасибо. |
||
Anchoret Пользователь Сообщений: 1059 Anchoret |
andronus, не знаю куда Вы добавляли код из предложенных вариантов, но свой я тестировал на Вашем же файле-примере. Полагаю остальные участники тоже. Тестовый файл с тремя вариантами Изменено: Anchoret — 22.02.2019 15:18:20 |
Михаил Лебедев Пользователь Сообщений: 2855 |
#18 25.02.2019 10:18:33
Нельзя выделить видимые ячейки, если все ячейки — невидимые. Естественно, что выдается ошибка.
… м.б. Вам просто воспользоваться функцией =ПРОМЕЖУТОЧНЫЕ.ИТОГИ() ? Она как раз использует только видимые ячейки.
Вы просто не всё узнали. И отказались найти ответ на свой вопрос. А ночь — не лучшее время для принятия решений. Изменено: Михаил Лебедев — 25.02.2019 10:20:38 Всё сложное — не нужно. Всё нужное — просто /М. Т. Калашников/ |
||||||
andronus Пользователь Сообщений: 147 |
#19 25.02.2019 11:58:50 Думаю, вопрос решен, найден воркараунд на зарубежных сайтах. Можно выделять первую видимую ячейку под фильтром, а дальше уже перемещаться по диапазонам. Вариант раз:
Но он слишком громоздок и несколько сабов это не дело. Вариант два, наиболее подходящий (перемещает на одну ячейку вниз даже при наличии фильтра):
Изменено: andronus — 25.02.2019 11:59:59 |
||||
Михаил Лебедев Пользователь Сообщений: 2855 |
#20 25.02.2019 12:37:56
смешно…
не верю Всё сложное — не нужно. Всё нужное — просто /М. Т. Калашников/ |
||||||
andronus Пользователь Сообщений: 147 |
#21 25.02.2019 13:10:20
Что смешного в том, что интернет не ограничен Россией (по крайней мере, пока. И, как говорится, не дай бог)? На зарубежных сайтах тоже море инфы.
Так вы проверьте для начала. Вот такой код у меня прекрасно работает:
Осталось его в цикл запихнуть, а вот это я не знаю как. Изменено: andronus — 25.02.2019 13:10:49 |
||||||
Paul Zealand Пользователь Сообщений: 97 |
#22 28.02.2019 09:30:31 andronus, не понимаю чего Вы мучаетесь, найти первую видимую ячейку после фильтра не составляет большого труда. Дальше если Вам нужно использовать формулу в этих ячейках, то просто объявите переменную. У меня идеентичная необходимость была на днях. Решил подобным примитивным способом.
Изменено: Paul Zealand — 28.02.2019 09:31:27 |
||
Paul Zealand Пользователь Сообщений: 97 |
#23 28.02.2019 09:42:59 andronus, в Вашем файле такой код работает.
Изменено: Paul Zealand — 28.02.2019 09:43:21 |
||
andronus Пользователь Сообщений: 147 |
Paul Zealand, спасибо, решение уже было найдено выше. |
Jack Famous Пользователь Сообщений: 10846 OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome |
#25 28.02.2019 12:09:10 OFF:
почему не просто «костыль» (слэнг) или дословно «обходной приём» По «задаче»: неуменеие/нежелание правильно сформулировать проблему не даёт получить решение. С другой стороны, работает и ладно — но это путь тёмной стороны силы Изменено: Jack Famous — 28.02.2019 12:11:53 Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄ |
||
БМВ Модератор Сообщений: 21376 Excel 2013, 2016 |
Jack Famous, «костыль» (слэнг) это не обходной прием, а что-то рабочее, но ненадежное. Прямой аналог с обычным медицинским костылем, когда это помогает двигаться, но неполноценно. По вопросам из тем форума, личку не читаю. |
andronus Пользователь Сообщений: 147 |
#27 28.02.2019 12:26:14 Jack Famous, окей, я использовал неверный термин, по вашему мнению. Тем не менее, решение найдено, и оно рабочее на 100%, можно применять его в дальнейшем. Вот оно, повторюсь:
Изначально задача звучала так — выделять определенные ячейки. Как — неважно. Ни один из предложенных вариантов не подошел. Зато подошел вариант, который позволяет выделить ячейку сразу под фильтром, а дальше уже от нее плясать по диапазонам. И это решение оказалось идеальным в данном случае. |
||
andronus Пользователь Сообщений: 147 |
БМВ, в данном случае, абсолютно надежное и работающее решение. Я не могу показать вам код целиком (конфиденциальность на проекте), но тем не менее, всё прекрасно работает. |
Jack Famous Пользователь Сообщений: 10846 OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome |
#29 28.02.2019 12:41:10
я запомнил это именно как «обходной приём», потому что большинство «костылей», встречавшихся мне, весьма надёжны и, как раз, выполняют свою реальную/жизненную функцию, только не «помогает двигаться, но неполноценно», а «позволяет выполнять повседневные задачи, пока нога не заживёт (читай, «разрабы не подсуетятся»)»
а где вы видите противоречие с
Изменено: Jack Famous — 28.02.2019 12:45:07 Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄ |
||||||
andronus Пользователь Сообщений: 147 |
#30 28.02.2019 12:45:52
Мне показалось, это было сказано с каким-то недоверительным подтекстом. Впрочем, мы уже в явный оффтоп скатились. Тему можно закрывать, всем огромное спасибо за участие! |
||
Skip to content
This tutorial shows how to only select visible cells from a selected range using Excel or VBA
METHOD 1. Select visible cells only
EXCEL
Select a range > Home tab > Editing group > Click on Find & Select > Go To Special > Select Visible cells only > Click OK
This image represents the original data that has all of the cells visible. |
This image shows the same data, however, row 4 is now hidden and is not visible. Therefore, if you select and try to copy or delete this information it will also delete the content in the hidden row. |
1. Select the range, which has hidden cells. Note: in this example row 3 has been hidden in the selected range. |
2. Select the Home tab. |
3. Click Find & Select in the Editing group. 4. Click Go To Special. |
5. Select Visible cells only in the Go To Special window.. 6. Click OK. |
This image shows the result of the process, which now only has the visible cell selected. |
METHOD 1. Select visible cells only
VBA
Sub Select_only_visible_cells()
‘declare a variable
Dim ws As Worksheet
Set ws = Worksheets(«Analysis»)
‘select visible cells only in the selected range
ws.Range(«B2:C6»).SpecialCells(xlCellTypeVisible).Select
End Sub
ADJUSTABLE PARAMETERS
Worksheet Selection: Select the worksheet in which you want to apply a restriction to a cell by changing the Analysis worksheet name in the VBA code. You can also change the name of this object variable, by changing the name ‘ws’ in the VBA code.
Range: Select the range from which you only want to select visible cells by changing the range reference («B2:C6») in the VBA code.
Explanation about how to select visible cells only
EXPLANATION
EXPLANATION
This tutorial shows how to only select visible cells from a selected range using Excel or VBA.
This tutorial provides one Excel method and one VBA method that can be applied to only select visible cells from a selected range. The Excel method uses the ‘Visible cells only’ option from the Go To Special menu. The VBA method uses the SpecialCells(xlCellTypeVisible) function to select visible cells only.
Related Topic | Description | Related Topic and Description |
---|---|---|
Paste ignoring hidden or filtered cells | How to paste values ignoring hidden or filtered cells |
I have a database that has in excess on 200,000 rows. When I was writing a VBA script I had a database of about 20,000 rows in mind so I didn’t care whether the database was filtered or not because the VBA script ran quickly. So given the realization that the database is huge and testing the VBA script I was surprised to notice how slowly it ran. So without further to say this is how my code looks like :
Set wsDB = ThisWorkbook.Sheets("DB")
Dim nameIndex As Long: nameIndex = Application.Match(name, wsDB.Rows(1), 0)
Dim formula As String
formula = "=IFERROR(AVERAGEIFS(" + GRA(nameIndex) + "," + GRA(dateIndex) + ",R2C," + GRA(cellNameIndex) + ",RC1" + "),"""")"
where GRA is a function that returns the address of the range of a column.
Private Function GRA(ByRef rngIndex As Long)
GRA = "DB!" + CStr(Range(Cells(2, rngIndex), Cells(rowNos, rngIndex)).Address(1, 1, xlR1C1, 0, 0))
End Function
So given that I now filter the table beforehand how can I adjust my code so that it ignores all the hidden rows and takes into account only what is visible. Of course I am aware that a simple dirty solution would be to simply copy the filter database and paste it in a new sheet but that will affect the performance which is what I’m trying to improve.
Хитрости »
1 Май 2011 268582 просмотров
Как вставить скопированные ячейки только в видимые/отфильтрованные ячейки
Ни для кого не секрет, что Excel позволяет выделять только видимые строки. Например, если некоторые из них скрыты или к ним применен фильтр.
если кто-то не знает, как это сделать: выделяем диапазон — Alt+;(для английской раскладки);Alt+ж(для русской). Подробнее можно почитать в этой статье
Если после выделения только видимых ячеек их скопировать, то скопируются они как положено. Но при попытке вставить скопированное в отфильтрованный диапазон(либо содержащий скрытые строки) — то результат вставки будет не совсем такой, как Вы ожидали. Данные будут вставлены даже в скрытые строки. Либо как вариант получим ошибку «Данная команда не применима к несвязанному диапазону».
Копируем единый диапазон ячеек и вставляем только в видимые
Чтобы данные вставлялись только в видимые ячейки, можно применить такой макрос:
Option Explicit Dim rCopyRange As Range 'Этим макросом копируем данные Sub My_Copy() If Selection.Count > 1 Then Set rCopyRange = Selection.SpecialCells(xlVisible) Else: Set rCopyRange = ActiveCell End If End Sub 'Этим макросом вставляем данные, начиная с выделенной ячейки Sub My_Paste() If rCopyRange Is Nothing Then Exit Sub If rCopyRange.Areas.Count > 1 Then MsgBox "Вставляемый диапазон не должен содержать более одной области!", vbCritical, "Неверный диапазон": Exit Sub Dim rCell As Range, li As Long, le As Long, lCount As Long, iCol As Integer, iCalculation As Integer Application.ScreenUpdating = False iCalculation = Application.Calculation: Application.Calculation = -4135 For iCol = 1 To rCopyRange.Columns.Count li = 0: lCount = 0: le = iCol - 1 For Each rCell In rCopyRange.Columns(iCol).Cells Do If ActiveCell.Offset(li, le).EntireColumn.Hidden = False And _ ActiveCell.Offset(li, le).EntireRow.Hidden = False Then rCell.Copy ActiveCell.Offset(li, le) lCount = lCount + 1 End If li = li + 1 Loop While lCount >= rCell.Row - rCopyRange.Cells(1).Row Next rCell Next iCol Application.ScreenUpdating = True: Application.Calculation = iCalculation End Sub
Как использовать: Для начала надо убедиться, что разрешены макросы и при необходимости включить их: почему не работает макрос. Затем копируем код выше, из Excel переходим в редактор VBA(Alt+F11) —Insert —Module. Вставляем туда скопированный код. Теперь код можно вызывать нажатием клавиш Alt+F8 -выделяем имя макроса —Выполнить(Run).
Для полноты картины, данные макросы лучше назначить на горячие клавиши(в приведенных ниже кодах это делается автоматически при открытии книги с кодом). Для этого приведенные ниже коды необходимо просто скопировать в модуль ЭтаКнига(ThisWorkbook):
Option Explicit 'Отменяем назначение горячих клавиш перед закрытием книги Private Sub Workbook_BeforeClose(Cancel As Boolean) Application.OnKey "^q": Application.OnKey "^w" End Sub 'Назначаем горячие клавиши при открытии книги Private Sub Workbook_Open() Application.OnKey "^q", "My_Copy": Application.OnKey "^w", "My_Paste" End Sub
Теперь можно скопировать нужный диапазон нажатием клавиш Ctrl+q, а вставить его в отфильтрованный — Ctrl+w.
Если необходимо переносить только значения(т.е. если в ячейке будут формулы, то в итоге будет перенесен результат вычисления этой формулы), надо заменить строку в коде:
rCell.Copy ActiveCell.Offset(li, le)
на такую:
ActiveCell.Offset(li, le) = rCell.Value
Скачать пример
Tips_Macro_CopyPasteInHiddenRows.xls (46,5 KiB, 14 213 скачиваний)
Копируем только видимые ячейки и вставляем только в видимые
По многочисленным просьбам доработал код. Теперь возможно копировать любые диапазоны: со скрытыми строками, скрытыми столбцами и вставлять скопированные ячейки также в любые диапазоны: со скрытыми строками, скрытыми столбцами. Работает совершенно так же, как и предыдущий: нажатием клавиш Ctrl+q копируем нужный диапазон(со скрытыми/отфильтрованными строками и столбцами или не скрытыми), а вставляем сочетанием клавиш Ctrl+w. Вставка производится так же в скрытые/отфильтрованные строки и столбцы или без скрытых.
Если в копируемом диапазоне присутствуют формулы, то во избежание смещения ссылок можно копировать только значения ячеек — т.е. при вставке значений будут вставлены не формулы, а результат их вычисления. Или если необходимо сохранить форматы ячеек, в которые происходит вставка — будут скопированы и вставлены только значения ячеек. Для этого надо заменить строку в коде(в файле ниже):
rCell.Copy rResCell.Offset(lr, lc)
на такую:
rResCell.Offset(lr, lc) = rCell.Value
В файле ниже обе эти строки присутствуют, Вам надо лишь оставить ту, которая больше подходит под Ваши задачи.
Скачать пример:
Tips_Macro_CopyPasteInHiddenCells.xls (54,5 KiB, 12 769 скачиваний)
Так же см.:
Excel удаляет вместо отфильтрованных строк — все?! Как избежать
Статья помогла? Поделись ссылкой с друзьями!
Видеоуроки
Поиск по меткам
Access
apple watch
Multex
Power Query и Power BI
VBA управление кодами
Бесплатные надстройки
Дата и время
Записки
ИП
Надстройки
Печать
Политика Конфиденциальности
Почта
Программы
Работа с приложениями
Разработка приложений
Росстат
Тренинги и вебинары
Финансовые
Форматирование
Функции Excel
акции MulTEx
ссылки
статистика
В дополнение к моим комментариям ранее, вот метод, который будет работать с некоторыми ограничениями:
Вы не можете иметь более 65536 строк данных; и вы не можете иметь действительно длинный текст (911 символов +) или пустые видимые ячейки; и данные не должны содержать строку «|~|»
Если эти условия соблюдены, вы можете использовать что-то вроде этого:
Dim v
Dim sFormula As String
With Selection
sFormula = "IF(SUBTOTAL(103,OFFSET(" & .Cells(1).Address(0, 0) & ",row(" & .Address(0, 0) & ")-min(row(" & .Address(0, 0) & ")),1))," & .Address(0, 0) & ",""|~|"")"
End With
Debug.Print sFormula
v = Filter(Application.Transpose(Evaluate(sFormula)), "|~|", False)
Вы можете адаптировать это для обхода третьего ограничения, изменив альтернативный текст в строке формулы.