筛选一张纸上的select以返回结果,然后将该结果粘贴到另一张纸上

问题:

我有一张3张工作簿,每张都有“HeatNumbers”,“HeatSheetTemplate”和“Heat vs Order”。 Heat vs Order工作表每天都会添加一些新的数据行,所以行数总是在变化。 以下是栏目标题和一些数据的图片:

在这里输入图像说明

我在找什么:

在HeatNumbers表上,我有一个执行一些VBA代码的button。 下面是该表的一张照片:

在这里输入图像说明

这是我需要发生的事情:一个用户将input数据到J行的黑色框中。 每一行可以包含一个FO#。 当点击button时,我需要通过黑盒子区域中的任何FO#过滤上面的Heat vs Order表单中的所有数据,将结果集复制到HeatNumbers表单,从第2行col A开始,然后删除Heat vs Order表单中的filter。

我曾经尝试过:

我已经能够做到这一点的唯一方法是让用户手动过滤Heat vs. Order工作表上的数据,并将结果复制并粘贴到HeatNumbers选项卡上。 这很麻烦,很不幸,很容易出错。

以下是使用macroslogging器生成的代码:

Sub Filter_FO() ' ' Filter_FO Macro ' Range("A1:H20000").AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:= Sheets("HeatNumbers").Range("J4:J22"), Unique:=False ActiveWindow.SmallScroll Down:=-15 Range("A4:H300").Select Selection.Copy Sheets("HeatNumbers").Select ActiveWindow.SmallScroll Down:=-15 Range("A2:H300").Select ActiveSheet.Paste End Sub 

为了使filter正常工作,您需要使用一个CriteriaRange ,它只包含其中包含值的单元格。 最简单的方法是使用.End(xlDown)函数。 这个工作方式与CTRL + DOWN箭头的function相同,只要没有空白,就会select该列数据中的最后一个单元格。

第二部分是可能提高被过滤数据的范围。 现在你正在select一个大的区域,并希望它包括你想要的数据。 如果你的代码现在可以工作,你可以离开它。 改进包括:

  • 只使用列字母,以便整个列被过滤。 这工作,如果标题停留在第1行。这是有点慢。
  • 如果数据是一个大块,可以使用.End(xlUp)来查找最后一行并使用它。 这包括在下面。

然后最后一块是select正确的数据复制范围。 我只是采取了数据范围,并使用.SpecialCells(xlCellTypeVisible)select可见的单元格。

为了使副本干净地工作,我清除了HeatNumbers上的A:H列,以防止任何旧数据出现。 当我重新粘贴数据时,我会包含标题。 这是你的macros观唯一真正的区别。

 Sub FilterDataAndClearAndCopy() 'get references to sheets Dim sht_data As Worksheet Dim sht_filter As Worksheet Set sht_data = Sheets("Heat vs Order") Set sht_filter = Sheets("HeatNumbers") 'get the block of data to set the filter over Dim rng_data As Range Dim int_lastRow As Integer int_lastRow = sht_data.Range("A" & sht_data.Rows.Count).End(xlUp).Row Set rng_data = sht_data.Range("A1:H" & int_lastRow) 'get the criteria range... assumes at least one entry below J3 Dim rng_filter As Range Set rng_filter = Range(sht_filter.Range("J3"), sht_filter.Range("J3").End(xlDown)) 'filter the data rng_data.AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:=rng_filter, Unique:=False 'clear out data sht_filter.Range("A:H").Clear 'select data to copy rng_data.SpecialCells(xlCellTypeVisible).Copy 'paste that data to filter sheet sht_filter.Range("A1").PasteSpecial xlPasteAll 'remove the filter sht_data.ShowAllData End Sub