Скопировать отфильтрованные ячейки 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. Введите или вставьте код.

Column B contains the numbers 17, 1408 and some numbers that have this format 000000-000-00

I put a filter for cells that contain «-«. It shows me the numbers with the format above.

I want to copy them to column A, but every one of them to be on the same row.

If I select then copy/paste it will tell me that it cannot do this with multiple selections.

Is there a solution?

Community's user avatar

asked Nov 8, 2011 at 21:21

Andrei Ion's user avatar

In A2:

=IF(ISERROR(SEARCH("-",B2)),"",B2)

Fill down the formula in Col A. Follow up with copy/pastespecial-values if you need to convert from a formula to a fixed value.

answered Nov 8, 2011 at 22:43

Tim Williams's user avatar

Tim WilliamsTim Williams

150k8 gold badges96 silver badges124 bronze badges

This worked for me:

Private Sub CopyRange()

    Dim r1 As Range
    Dim r2 As Range

    Set r1 = ActiveSheet.Range("A1:C1,A3:C3")
    Set r2 = ActiveSheet.Range("D5")

    r1.Copy r2

End Sub

As a side note, you can use advanced filter in the code or in excel and specify a range for it to be copied to.

answered Nov 8, 2011 at 22:00

Jon49's user avatar

Jon49Jon49

4,3844 gold badges36 silver badges73 bronze badges

  1. Make a new column.
  2. In your new column, enter this formula and fill down for your entire dataset:

    =IF(ISNUMBER(SEARCH("-",B1)),"Match","")

  3. Sort the table using your new column. Then you can copy & paste.

answered Nov 8, 2011 at 21:30

PowerUser's user avatar

PowerUserPowerUser

11.5k18 gold badges63 silver badges98 bronze badges

Понравилась статья? Поделить с друзьями:
  • Скопировать вставить excel если формула
  • Скопировать формат ячейки в word
  • Скопировать открытый текст word
  • Скопировать все файлы папки в одну книгу excel
  • Скопировать формат ячейки excel горячие клавиши