excel - 过滤一列并从另一列复制数据
问题描述
我有下面的代码,它从工作表 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
- 同上复制 E 和 C 列中的数据
解决方案
首先,绝对有必要避免在 Excel VBA中使用 Select 以生成可靠的代码。
第二个问题是,正如您发现的那样Selection.End(xlDown)
,直到下一个空闲单元格才会下降。为了在列中找到最后使用的单元格,您需要从最后一个单元格开始并 go xlUp
:
Set LastUsedCell = Cells(Rows.Count, "AS").End(xlUp)
因此,要摆脱所有.Select
和Selection
语句,首先声明一个变量作为对工作表的引用:
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
推荐阅读
- css - 动画大图像在 Safari 上无法正常工作
- javascript - 阻止表单提交直到 recapcha v3 完成加载
- javascript - TypeError:无法读取nodejs中未定义的属性“电子邮件”
- node.js - 如何在 Express 中修复“无法读取未定义的属性“地图”
- r - 在 R 中聚类时从 ClusGap 获取 K
- arrays - 如何正确地将带有空格的 $string 传递给 grep
- python - 在 Django 中显示抓取的 HTML div 的所有段落
- c - fseek 只使用 fread 调用而不是读取?
- java - Oracle ADF 12c:桌面集成 Servlet DIRemoteServlet
- python - Python调度程序未运行导入中调度的函数