Копирование отфильтрованных ячеек в excel vba

Сперва присваиваем переменной Rng диапазон отфильтрованных ячеек

Код
 Dim Rng As Range
With .AutoFilter.Range
       Set Rng = .SpecialCells(xlCellTypeVisible) 'с шапкой таблицы
       'Set Rng = .Offset(1, 0).Resize(.Rows.Count - 1, .Columns.Count).SpecialCells(xlCellTypeVisible) 'без шапки таблицы
End With

а дальше копируем диапазон куда надо

Код
Rng.Copy Destination:=BazaSht.Cells(iLastRowBaza, 1) 'копируем диапазон куда надо

P.S. И не забываем сделать проверку на наличие видимых данных, а то фильтр поставите — данных, например, нет, а вы их будете пытаться скопировать

Код
   If Worksheets("Лист1").AutoFilter.Range.Columns(1).SpecialCells(xlVisible).Count = 1 Then 'если нет отфильтрованных строк, кроме шапки таблице, то
            MsgBox "Данных, отвечающим заданным критериям в таблице нет!", vbExclamation, "Ошибка"
            .ShowAllData 'снимаем установленный фильтр
            Exit Sub
        End If

I have two sheets. One has the complete data and the other is based on the filter applied on the first sheet.

Name of the data sheet : Data
Name of the filtered Sheet : Hoky

I am just taking a small portion of data for simplicity. MY objective is to copy the data from Data Sheet, based on the filter. I have a macro which somehow works but its hard-coded and is a recorded macro.

My problems are:

  1. The number of rows is different everytime. (manual effort)
  2. Columns are not in order.

enter image description here
enter image description here

Sub TESTTHIS()
'
' TESTTHIS Macro
'
'FILTER
Range("F2").Select
Selection.AutoFilter
ActiveSheet.Range("$B$2:$F$12").AutoFilter Field:=5, Criteria1:="hockey"

'Data Selection and Copy
Range("C3").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
Sheets("Hockey").Select
Range("E3").Select
ActiveSheet.Paste

Sheets("Data").Select
Range("D3").Select
Range(Selection, Selection.End(xlDown)).Select
Application.CutCopyMode = False
Selection.Copy
Sheets("Hockey").Select
Range("D3").Select
ActiveSheet.Paste

Sheets("Data").Select
Range("E3").Select
Range(Selection, Selection.End(xlDown)).Select
Application.CutCopyMode = False
Selection.Copy
Sheets("Hockey").Select
Range("C3").Select
ActiveSheet.Paste

End Sub

ashleedawg's user avatar

ashleedawg

20k8 gold badges73 silver badges104 bronze badges

asked Aug 24, 2016 at 11:21

Ananya Pandey's user avatar

Best way of doing it

Below code is to copy the visible data in DBExtract sheet, and paste it into duplicateRecords sheet, with only filtered values. Range selected by me is the maximum range that can be occupied by my data. You can change it as per your need.

  Sub selectVisibleRange()

    Dim DbExtract, DuplicateRecords As Worksheet
    Set DbExtract = ThisWorkbook.Sheets("Export Worksheet")
    Set DuplicateRecords = ThisWorkbook.Sheets("DuplicateRecords")

    DbExtract.Range("A1:BF9999").SpecialCells(xlCellTypeVisible).Copy
    DuplicateRecords.Cells(1, 1).PasteSpecial


    End Sub

answered Aug 22, 2017 at 1:46

Arpan Saini's user avatar

Arpan SainiArpan Saini

4,3641 gold badge38 silver badges50 bronze badges

1

I suggest you do it a different way.

In the following code I set as a Range the column with the sports name F and loop through each cell of it, check if it is «hockey» and if yes I insert the values in the other sheet one by one, by using Offset.

I do not think it is very complicated and even if you are just learning VBA, you should probably be able to understand every step. Please let me know if you need some clarification

Sub TestThat()

'Declare the variables
Dim DataSh As Worksheet
Dim HokySh As Worksheet
Dim SportsRange As Range
Dim rCell As Range
Dim i As Long

'Set the variables
Set DataSh = ThisWorkbook.Sheets("Data")
Set HokySh = ThisWorkbook.Sheets("Hoky")

Set SportsRange = DataSh.Range(DataSh.Cells(3, 6), DataSh.Cells(Rows.Count, 6).End(xlUp))
    'I went from the cell row3/column6 (or F3) and go down until the last non empty cell

    i = 2

    For Each rCell In SportsRange 'loop through each cell in the range

        If rCell = "hockey" Then 'check if the cell is equal to "hockey"

            i = i + 1                                'Row number (+1 everytime I found another "hockey")
            HokySh.Cells(i, 2) = i - 2               'S No.
            HokySh.Cells(i, 3) = rCell.Offset(0, -1) 'School
            HokySh.Cells(i, 4) = rCell.Offset(0, -2) 'Background
            HokySh.Cells(i, 5) = rCell.Offset(0, -3) 'Age

        End If

    Next rCell

End Sub

answered Aug 24, 2016 at 14:30

Rémi's user avatar

RémiRémi

3723 silver badges8 bronze badges

2

When i need to copy data from filtered table i use range.SpecialCells(xlCellTypeVisible).copy. Where the range is range of all data (without a filter).

Example:

Sub copy()
     'source worksheet
     dim ws as Worksheet
     set ws = Application.Worksheets("Data")' set you source worksheet here
     dim data_end_row_number as Integer
     data_end_row_number = ws.Range("B3").End(XlDown).Row.Number
    'enable filter
    ws.Range("B2:F2").AutoFilter Field:=2, Criteria1:="hockey", VisibleDropDown:=True
    ws.Range("B3:F" & data_end_row_number).SpecialCells(xlCellTypeVisible).Copy
    Application.Worksheets("Hoky").Range("B3").Paste
    'You have to add headers to Hoky worksheet
end sub

answered Aug 24, 2016 at 11:34

3

it needs to be .Row.count not Row.Number?

That’s what I used and it works fine
Sub TransfersToCleared()
Dim ws As Worksheet
Dim LastRow As Long
Set ws = Application.Worksheets(«Export (2)») ‘Data Source
LastRow = Range(«A» & Rows.Count).End(xlUp).Row
ws.Range(«A2:AB» & LastRow).SpecialCells(xlCellTypeVisible).Copy

answered Oct 6, 2020 at 18:09

Chunsah's user avatar

Skip to content

На чтение 2 мин. Просмотров 5.1k.

Что делает макрос: Часто, когда вы работаете с набором отфильтрованных данных, вы хотите скопировать отфильтрованные строки в новую книгу. Конечно, вы можете вручную скопировать эти строки, просто открыть новую книгу и вставить строки, а затем отформатировать вновь вставленные данные так, чтобы все столбцы подходили. Но если вы делаете это достаточно часто, вы можете использовать макрос, чтобы ускорить процесс.

Содержание

  1. Как макрос работает
  2. Код макроса
  3. Как этот код работает
  4. Как использовать

Как макрос работает

Этот макрос захватывает диапазон AutoFilter, открывает новую книгу, а затем вставляет данные.

Код макроса

Sub SkopirovatOtfiltrovannieStroki()
'Шаг 1: Проверить, есть ли на листе фильтр
If ActiveSheet.AutoFilterMode = False Then
Exit Sub
End If
'Шаг 2: Скопируйте отфильтрованный диапазон для новой книги 
ActiveSheet.AutoFilter.Range.Copy
Workbooks.Add.Worksheets(1).Paste
'Шаг 3: Столбцы приводим в соответствие по размеру
Cells.EntireColumn.AutoFit
End Sub

Как этот код работает

  1. Шаг 1 использует свойство AutoFilterMode, чтобы проверить есть ли на листе автофильтры. Если нет, то мы выходим из процедуры.
  2. Каждый объект AutoFilter имеет свойство Range. Это свойство Range возвращает строки, к которым применяется Автофильтр, то есть он возвращает только те строки, которые отображаются в отфильтрованном наборе данных. На шаге 2 мы используем метод копирования, чтобы захватить эти строки, а затем вставить строки в новую книгу. Обратите внимание, что мы используем Workbooks.Add.Worksheets, это говорит Excel вставить данные в первый лист вновь созданной книги.
  3. Шаг 3 говорит Excel, чтобы размер столбцов соответствовал данным, которые мы только что вставили.

Как использовать

Для реализации этого макроса, вы можете скопировать и вставить его в стандартный модуль:

  1. Активируйте редактор Visual Basic, нажав ALT + F11.
  2. Щелкните правой кнопкой мыши имя проекта / рабочей книги в окне проекта.
  3. Выберите Insert➜Module.
  4. Введите или вставьте код.

ink

0 / 0 / 1

Регистрация: 29.05.2014

Сообщений: 9

1

Копирование отфильтрованного диапазона

06.08.2011, 19:55. Показов 23968. Ответов 4

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Прошу подсказать,

Как скопировать из таблицы и перенести в другую таблицу
отфильтрованный автофильтром (2 условия) диапазон ячеек по столбцу «G»
например

Visual Basic
1
2
3
4
    Rows("13:13").Select
    Selection.AutoFilter
    ActiveSheet.Range("$A$13:$AG$20000").AutoFilter Field:=1, Criteria1:="ААА"
    ActiveSheet.Range("$A$13:$AG$20000").AutoFilter Field:=10, Criteria1:="<>"

Необходимо скопировать и перенести на другой лист все отфильтрованные данные
например по столбцу «G»

Заранее спасибо.



0



Настаев

65 / 51 / 2

Регистрация: 15.12.2010

Сообщений: 297

06.08.2011, 23:06

2

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Sub Макрос1()
        
    'скопировать
    Range("G1:G13").SpecialCells(xlCellTypeVisible).Copy
    
    'вставить на второй лист
    Sheets(2).Paste
    
    'сбить мурашек
    Application.CutCopyMode = False
        
End Sub



2



0 / 0 / 0

Регистрация: 07.05.2014

Сообщений: 5

21.12.2011, 19:33

3

Настаев

а как сделать если диапазонов 2 и более а не один



0



730 / 406 / 95

Регистрация: 19.12.2010

Сообщений: 756

21.12.2011, 19:48

4



0



Почетный модератор

21371 / 9105 / 1082

Регистрация: 11.04.2010

Сообщений: 11,014

21.12.2011, 19:55

5

rustam009, еще несколько дней, и та тема станет прошлогодней.
Не стоит поднимать такие темы, тем более, Вы не автор темы.
В тему больше не пишем



0



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

21.12.2011, 19:55

5

I am trying to copy data from cells that have been autofiltered in vba. My code looks like this:

 For Each myArea In myRange.Areas
      For Each rw In myArea.Rows
          strFltrdRng = strFltrdRng & rw.Address & ","
      Next
 Next

 strFltrdRng = Left(strFltrdRng, Len(strFltrdRng) - 1)
 Set myFltrdRange = Range(strFltrdRng)
 myFltrdRange.Copy
 strFltrdRng = ""

 Workbooks(mainwb).Activate
 Workbooks(mainwb).Worksheets("Sheet1").Range("A1").Select
 Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

But when the variable strFltrdRng is this long:

"$B$2:$H$2,$B$3:$H$3,$B$4:$H$4,$B$5:$H$5,$B$6:$H$6,$B$7:$H$7,$B$8:$H$8,$B$10:$H$10,$B$11:$H$11,$B$12:$H$12,$B$13:$H$13,$B$15:$H$15,$B$17:$H$17,$B$18:$H$18,$B$19:$H$19,$B$20:$H$20,$B$21:$H$21,$B$22:$H$22,$B$23:$H$23,$B$26:$H$26,$B$27:$H$27,$B$28:$H$28,$B$2"

It throws me an error: Method ‘Range’ of object_Global’ failed. However when I shorten the strFltrRng, I am able to copy the data.

Is there any way to solve this problem?

Понравилась статья? Поделить с друзьями:

А вот еще интересные статьи:

  • Копирование одного листа на другой лист в excel vba
  • Копирование объединенных ячеек в одну excel
  • Копирование номеров excel это
  • Копирование несколько листов в excel
  • Копирование нескольких ячеек в одну excel

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии