【发布时间】:2019-06-23 15:32:49
【问题描述】:
我有一个包含 250,000 行和 10 列的 Excel 工作簿,我想将数据拆分到不同的工作簿中。我的想法是过滤列表,以便 Excel/VBA 不必每次我的代码说要在数据中查找某些内容时都遍历所有 250,000 行。
但是,我遇到了Sort 的一个特定问题,并且还有一个关于隐藏行和SpecialCells(xlCellTypeVisible) 的一般性问题。首先,这是代码:
Option Explicit
Sub Filtering()
Dim wsData As Worksheet
Dim cell As Variant
Dim lRowData As Long, lColData As Long
'filter
Set wsData = ThisWorkbook.Sheets(1)
lRowData = wsData.Cells(Rows.Count, 1).End(xlUp).Row
wsData.Range("A:A").AutoFilter Field:=1, Criteria1:="Name1"
For Each cell In wsData.Range(wsData.Cells(2, 1), wsData.Cells(100, 1)).SpecialCells(xlCellTypeVisible)
Debug.Print cell.Value
Next cell
'sort
lColData = wsData.Cells(1, Columns.Count).End(xlToLeft).Column
wsData.Range(wsData.Cells(1, 1), wsData.Cells(lRowData, lColData)).SpecialCells(xlCellTypeVisible).Sort Key1:=wsData.Range("B1:B100"), Order1:=xlDescending, Header:=xlYes ' returns error because of SpecialCells
End Sub
- “运行时错误 '1004':这不能在多范围选择上完成。选择单个范围并重试。”这发生在最后一行,在
wsData.Range(wsData.Cells(1, 1), wsData.Cells(lRowData, lColData)).SpecialCells(xlCellTypeVisible).Sort Key1:=wsData.Range("B1:B100"), Order1:=xlDescending, Header:=xlYes。只有当我使用SpecialCells(xlCellTypeVisible)时才会发生这种情况,所以wsData.Range(wsData.Cells(1, 1), wsData.Cells(lRowData, lColData)).Sort Key1:=wsData.Range("B1:B100"), Order1:=xlDescending, Header:=xlYes有效。
我在使用SpecialCells(xlCellTypeVisible) 时的想法是,只有这样 VBA 才会跳过过滤的单元格。不过,我已经尝试过了,在我看来,.Sort 无论如何都会跳过它们,不管有没有SpecialCells(xlCellTypeVisible) - 有人可以证实这一点吗?
- 这导致了我更普遍的问题:我不太清楚的一件事是 Excel/VBA 什么时候跳过过滤的行,什么时候不跳过。要遍历可见单元格,我需要使用
SpecialCells(xlCellTypeVisible)。.Sort我(也许)不会?对于我将在这些过滤列表上执行的任何操作,这个问题总是会弹出。
这让我想知道:我应该使用隐藏部分数据的原始工作表,还是应该临时创建一个新工作表,只复制我需要的数据(= 不包括我用过滤器隐藏的行)然后使用它?这张新表会以任何方式使其更快或更容易吗?在你的经历中什么更好?
【问题讨论】:
-
当您尝试复制不相邻的单元格或范围选择时会出现第一个错误,例如同一列(A1、A3、A5)中的多个不相邻行。这是因为 Excel 将范围“滑动”在一起并将它们粘贴为单个矩形。您可见的特殊单元格不相邻,因此不能复制为单个范围。
-
我想说从简单开始:将数据复制到一个变体数组,然后循环。优化该代码后,如果 VA 太慢,请仅查看其他方法(例如复制到临时表)。有很多关于 SO 的示例可以帮助您入门