Как вставить скопированные ячейки только в видимые/отфильтрованные ячейки
Что умеет Excel
В общем-то смысл статьи уже, думаю, понятен из названия. Просто чуть-чуть расширю.
Ни для кого не секрет, что 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
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
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, 951 скачиваний)
Так же см.:
→Excel удаляет вместо отфильтрованных строк - все?! Как избежать

9817

Спасибо большое! Помогите, а как сделать, чтобы в данном случае вставки в видимые ячейки вставлялись только значения копируемых ячеек
С ув, Евгений
спасибо, действительно полезная и понятная статья. Макрос работает и делает то, то нужно
Спасибо большое! эта проблемы многих мучала — ни на одном форуме внятного ответа не было. макрос работает!!