Сперва присваиваем переменной 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:
- The number of rows is different everytime. (manual effort)
- Columns are not in order.
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
20k8 gold badges73 silver badges104 bronze badges
asked Aug 24, 2016 at 11:21
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 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é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
Skip to content
На чтение 2 мин. Просмотров 5.1k.
Что делает макрос: Часто, когда вы работаете с набором отфильтрованных данных, вы хотите скопировать отфильтрованные строки в новую книгу. Конечно, вы можете вручную скопировать эти строки, просто открыть новую книгу и вставить строки, а затем отформатировать вновь вставленные данные так, чтобы все столбцы подходили. Но если вы делаете это достаточно часто, вы можете использовать макрос, чтобы ускорить процесс.
Содержание
- Как макрос работает
- Код макроса
- Как этот код работает
- Как использовать
Как макрос работает
Этот макрос захватывает диапазон 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 использует свойство AutoFilterMode, чтобы проверить есть ли на листе автофильтры. Если нет, то мы выходим из процедуры.
- Каждый объект AutoFilter имеет свойство Range. Это свойство Range возвращает строки, к которым применяется Автофильтр, то есть он возвращает только те строки, которые отображаются в отфильтрованном наборе данных. На шаге 2 мы используем метод копирования, чтобы захватить эти строки, а затем вставить строки в новую книгу. Обратите внимание, что мы используем Workbooks.Add.Worksheets, это говорит Excel вставить данные в первый лист вновь созданной книги.
- Шаг 3 говорит Excel, чтобы размер столбцов соответствовал данным, которые мы только что вставили.
Как использовать
Для реализации этого макроса, вы можете скопировать и вставить его в стандартный модуль:
- Активируйте редактор Visual Basic, нажав ALT + F11.
- Щелкните правой кнопкой мыши имя проекта / рабочей книги в окне проекта.
- Выберите Insert➜Module.
- Введите или вставьте код.
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?
asked Nov 8, 2011 at 21:21
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 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
Jon49Jon49
4,3844 gold badges36 silver badges73 bronze badges
- Make a new column.
-
In your new column, enter this formula and fill down for your entire dataset:
=IF(ISNUMBER(SEARCH("-",B1)),"Match","")
-
Sort the table using your new column. Then you can copy & paste.
answered Nov 8, 2011 at 21:30
PowerUserPowerUser
11.5k18 gold badges63 silver badges98 bronze badges