Хитрости »
Основные понятия (23)
Сводные таблицы и анализ данных (9)
Графики и диаграммы (5)
Работа с VB проектом (12)
Power BI и Power Query (14)
Условное форматирование (5)
Списки и диапазоны (5)
Макросы(VBA процедуры) (63)
Разное (38)
Баги и глюки Excel (2)

Как вставить скопированные ячейки только в видимые/отфильтрованные ячейки

 

В общем-то смысл статьи уже, думаю, понятен из названия. Просто чуть-чуть расширю.

Ни для кого не секрет, что 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

Для полноты картины, данные макросы лучше назначить на горячие клавиши(в приведенных ниже кодах это делается автоматически при открытии книги с кодом). Для этого приведенные ниже коды необходимо просто скопировать в модуль ЭтаКнига(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.

Скачать пример

  Tips_Macro_CopyPasteInHiddenRows.xls (46,5 KiB, 8 319 скачиваний)


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

rCell.Copy rResCell.Offset(lr, lc)

на такую:

rResCell.Offset(lr, lc) = rCell.Value

В файле ниже обе эти строки присутствуют, Вам надо лишь оставить ту, которая больше подходит под Ваши задачи.

Скачать пример:

  Tips_Macro_CopyPasteInHiddenCells.xls (54,5 KiB, 6 502 скачиваний)


Так же см.:
[[Excel удаляет вместо отфильтрованных строк - все?! Как избежать]]


Статья помогла? Поделись ссылкой с друзьями!
  Плейлист   Видеоуроки

Поиск по меткам

Access apple watch Multex Outlook Power Query и Power BI VBA работа в редакторе VBA управление кодами Бесплатные надстройки Дата и время Диаграммы и графики Записки Защита данных Интернет Картинки и объекты Листы и книги Макросы и VBA Надстройки Настройка Печать Поиск данных Политика Конфиденциальности Почта Программы Работа с приложениями Работа с файлами Разработка приложений Сводные таблицы Списки Тренинги и вебинары Финансовые Форматирование Формулы и функции Функции Excel Функции VBA Ячейки и диапазоны акции MulTEx анализ данных баги и глюки в Excel ссылки
Обсуждение: 84 комментария
  1. Дмитрий:

    Дмитрий, здравствуйте!
    У меня почему-то не работают ваши файлы.
    Приведу пример на последнем файле:
    Открываю его в Excel 2013; разрешаю редактирование-вылезает ошибка Run-time error '1004':
    Method 'OnKey' of object'_Application' failed
    Когда нажимаю debug вылезает окошко макроса и там подсвечена желтым часть строки:
    Application.OnKey "^q", "My_Copy"
    А если пробую нажимать в таблице ctrl+q, то вылезает окошко форматирования
    Подскажите, пожалуйста, как это исправить.

    • Дмитрий, когда скачиваете файл с интернета - он открывается в защищенном режиме, о чем у Вас появляется предупреждение. Нельзя обратиться к свойствам листов и книг, если книга открыта в защищенном режиме. А именно так по умолчанию открываются книги, скачанные откуда-то. Варианта по сути два:
      1. При открытии файла разрешить редактирование и перезапустить книгу.
      2. Добавить папку, в которую скачиваются вложения, в список доверенных(Файл -Параметры -Центр управления безопасностью -Параметры центра управления безопасностью -Надежные расположения).
      Есть еще вариант: в настройках макросов разрешить запуск макросов с уведомлением. Тогда сначала будет появляться запрос на редактирование, а самым последним запрос на разрешение выполнения содержимого.

      • Дмитрий:

        Дмитрий, спасибо большое!
        После пересохранения книги и добавления надежного расположения все заработало=)

    • Саша:

      Дмитрий. Большое спасибо!

    • Саша:

      Готов донатить таким людям. Спасибо что вы есть

  2. Дмитрий:

    Еще раз здравствуйте!
    А не подскажете, как копировать так, чтобы сохранялся формат и размеры ячеек в которые копируются данные?

    • В самом конце статьи написано какую строку на что заменить, чтобы форматы во вставляемых ячейках не изменялись и вставлялись только значения.

      • Дмитрий:

        Прошу прощения за мою невнимательность, в памяти отложилось, что там было сказано только про формулы) Спасибо за ответ.

  3. Максим:

    Здравсвуйте. Подскажите как можно скорректировать Ваш код.
    У Вас в коде активируется активная ячейка активного листа
    Set rResCell = ActiveCell
    А можно ли, что бы активировалась выбранная пользователем ячейка в другой книге. И с нее уже шла вставка.
    Пытался написать макрос который бы активировал уже открытую книгу, но навыков в этом у меня не хватило.

    • Максим, в моем коде ничего не активируется :) Вы можете сочетанием клавиш(Ctrl+q) скопировать диапазон в одной книге, далее активировать нужную книгу, лист и ячейку в них и вставить, начиная с активной ячейки. Попробуйте.

  4. Максим:

    Эти команды работают прекрасно ). Просто Ваш макрос я уже делаю под себя. И суть задачи была такова. Необходимо в рабочей книге заполнить диапазон значений, из другой книги, обе книги имеют скрытые ячейки. Для оптимизации работы из первой книги запускается макрос выбора необходимого файла, далее запускается макрос который выделяет в этом файле необходимый мне диапазон (диапазон всегда одинаковый), далее я применил ваш код для копирования и вставки. Но проблема в том что вставка идет в туже книгу из которой и копировалось. Жестко указать ячейку вставки в первой книге не получается, так как она всегда разная.

  5. Максим:

    Большое спасибо за ссылку. Ваш макрос уже облегчил мне работу, надеюсь что смогу до конца разобраться )

  6. Михаил:

    Дмитрий, добрый день
    Подскажите, что я делаю не так?
    Выходит ошибка " Вставляемый диапазон не должен содержать больше одной области"
    Спасибо

    • Михаил, очевидно, не внимательно читали статью и копируете или вставляете диапазоны не при помощи указанных сочетаний(Ctrl+q и Ctrl+w), а стандартными средствами.

      • Георгий:

        такая же ошибка при попытке вставить скопированный диапазон со скрытыми ячейками в новое место
        пс. пользуюсь контроКУ +контролДаблЮ

        • Георгий:

          Вопрос решился, почему то скопировался не весь скрипт

        • Георгий, ну вот давайте хотя бы так: Вы статью внимательно читали? Код используете, наверное, первый, тот что в статье, а не тот, что во втором файле? И диапазон при этом копируете тоже отфильтрованный. А первый код не работает с такими диапазонами, о чем и говорит. Если хотите копировать любые диапазоны(со скрытыми ячейками) и в такие же любые вставлять - ну прочтите статью и увидите, что в конце статьи я приложил еще файл, в котором реализован как раз более универсальный код. Сам код при этом в статье ОТСУТСТВУЕТ, он только в файле.

  7. Фёдор:

    Дмитрий, Большое спасибо Вам за ваш макрос!

  8. Владислав:

    Дмитрий, спасибо вам огромное за данный макрос, он позволяет сэкономить уйму времени при работе =). Не могли бы вы подсказать, возможно ли данный макрос сделать так, что бы он вставлял не значениями, а связями (hyperlink).

    • Владислав, для оформления гиперссылками придется сильно потрудиться. При этом не думаю, что это лучшая мысль, т.к. у книг есть ограничения на общее кол-во гиперссылок. А из этого следует, что при больших объемах данных очень даже вероятен факт получения неработоспособного результирующего файла.

  9. daur251282:

    Мужик, ты просто чёртов ГЕНИЙ ! Рахмет огромный, у меня всё работает (копировал макрос из файла примера). Слегка доработал (у меня и источник копирования и файл вставки - оба защищены, я в начале каждого макроса вставил снятие пароля и в конце - опять на пароль).

    Единственное, что не понимаю в твоём Коде - это вот это вот:
    'получение отсортированных адресов диапазона
    Function NoDups(rRng As Range) - для чего эта функция? И участвует ли она в макросах копирования и вставки? (насколько я понял - не участвует, но вдруг...)

    • daur251282, спасибо за отзыв. Функция NoDups нужна, чтобы отсортировать адреса скопированных ячеек в нужном порядке. Актуально, если выделение происходило через Ctrl или снизу вверх - в этом случае они по умолчанию могут располагаться в произвольном порядке и вставка пройдет неверно.

  10. Рамиль:

    Да ты гениальный тип! Спасибо!

    • ixet08:

      Дмитрий, спасибо за макрос, из всех найденных аналогичных он лудший.
      Есть предложение для повышения удобства использования.
      Зачем нужно копировать область средствами макроса? По Ctrl-C начиная с Excel 2007 уже копируются только отфильтрованные строки. Предлагаю их подхватить из буфера и вставлять по Ctrl-Q. Тогда может и обработка быстрее пойдет, на больших объемах-то думает долго.
      А использование Ctrl-W неудобно, это стандартное сочетание винды для закрытия окон

      • ixet08, к сожалению у VBA нет нормального доступа к буферу обмена Excel. Поэтому приходится принудительно создавать новый объект, чтобы его обработать. При этом само по себе копирование не занимает больше времени, чем стандартное Ctrl+C. Тут проблема именно при вставке, т.к. идет определение скрытых или отображенных ячеек. И это не быстро. В своей надстройке MulTEx я значительно ускорил этот процесс, но там код уже совершенно иной.
        Сочетания клавиш можно сменить на свои - где это сделать в статье показано(искать в модуле ЭтаКнига). Т.к. у всех разные предпочтения к гор.клавишам я специально отдельно привел код где это можно сделать.

        • ixet08:

          Благодарю за ответ. Про проблему с доступом к буферу не знал.
          Hotkeys уже настроил под себя

Поделитесь своим мнением

Комментарии, не имеющие отношения к комментируемой статье, могут быть удалены без уведомления и объяснения причин. Если есть вопрос по личной проблеме - добро пожаловать на Форум


Для оформления сообщений Вы можете использовать следующие тэги:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Тренинги

Заказать
Юридическая информация

Использование материалов сайта

Политика Конфиденциальности

ИП Щербаков Дмитрий Валентинович
ОГРНИП: 318502700083307
ИНН: 504013350772

Наши партнеры

Перейти
Перейти

Счетчики

Рейтинг@Mail.ru Яндекс.Метрика
© 2018 Excel для всех   Войти