首页 > 解决方案 > 过滤一列并从另一列复制数据

问题描述

我有下面的代码,它从工作表 1 中过滤 AT 列中的 1 并尝试复制 AS、E、C 列中的数据并粘贴到工作表 2 中。问题是,如果中间有空格,则无法复制 E 和 C 中的整个数据,因为 end(xldown) 只能复制到第一个空白单元格。有人可以帮我纠正它,以便一旦在 AT 列中过滤了 1,那么代码应该能够从头到尾复制列 E 和 C 中的数据。


        Worksheets(worksheet1).select
Rows("3:3").select
Selection.autofilter
Range(AT).slect
Activehseet.Range("$A$3:$AT$1185").Autofilter Field:=46, Criteria:="1"
Range("AS4").Select
Range(Selction, Selection.End(xldown)).select
Selection.copy

标签: excelvba

解决方案


首先,绝对有必要避免在 Excel VBA中使用 Select 以生成可靠的代码。

第二个问题是,正如您发现的那样Selection.End(xlDown),直到下一个空闲单元格才会下降。为了在列中找到最后使用的单元格,您需要从最后一个单元格开始并 go xlUp

Set LastUsedCell = Cells(Rows.Count, "AS").End(xlUp)

因此,要摆脱所有.SelectSelection语句,首先声明一个变量作为对工作表的引用:

Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("SheetName")

现在,您ws无需选择即可访问此工作表。然后您需要在 AT 列中找到最后使用的行。否则,您的过滤器使用Range("$A$3:$AT$1185")限制为 1185。

Dim LastUsedCell As Range
Set LastUsedCell = ws.Cells(ws.Rows.Count, "AS").End(xlUp)

ws.Range("$A$3", LastUsedCell).Autofilter Field:=46, Criteria:="1"

如果您现在只想复制过滤后的数据,则需要确保仅获得过滤范围内的可见单元格,因为ws.Range("$A$3", LastUsedCell)将引用该范围内的所有单元格,而不仅仅是您过滤的单元格。

Dim FilteredData As Range
On Error Resume Next  'next line will throw an error if there are no visible cells
Set FilteredData = ws.Range("$A$4", LastUsedCell).SpecialCells(xlCellTypeVisible)
On Error Goto 0  'don't forget to re-enable error reporting!

最后,您需要测试是否找到了可见的单元格:

If FilteredData Is Nothing Then
    MsgBox "No filtered data found"
    Exit Sub
End If

FilteredData.Copy 

推荐阅读