所以我有60K行的这个文件。我的数据分析师需要经历这个并挑出大约30K行。这种情况每隔几天发生一次。
他们有1张60K行的纸张,他们有另一张30k行可以拉出来。我将它们放在一个工作簿中。那么我所做的就是写一个宏,它取出了用于查找正确行的列中的所有值(它的列A,一个ID列)并将这些值放在一个数组中。
代码:
'in this code the active sheet is the one with the 30k rows to pull
For i = 1 To numrows
killArray(index) = ActiveCell.Offset(i - 1, 0).value2 'did research and value2 is fastest
index = index + 1
Next
然后我使用了自动过滤器:
'here the sheet with all 60k rows is active
Cells(1, IdCol).entireColumn.autofilter Field:=1, Criteria1:=Array(killArray), Operator:=xlFilterValues
然后,所有30k Id将它们放入一个数组中,并使用该数组过滤包含所有行的工作表。然后,数据人员可以简要地查看它,并删除所有这些行。
现在,他们已经决定他们真的想要为ID列使用自定义格式。所有id都在1到6位之间。所以从1到999999.数据人员已经决定他们喜欢格式化它以便所有id都是6位数,带有前导0#s。所以id 1将是000001.
问题是当我使用.value将id放入kill数组时,它获取没有格式化的id。所以id 000001将只是1.这将是好的,除了自动过滤器现在不工作。因为id - 1,与id - 000001不匹配。我已经做了一些检查,我发现我可以使用killArray(index) = ActiveCell.Offset(i - 1, 0).text
但是在我的研究(和测试)过程中,我发现了这个很慢。
有没有办法让自动过滤器忽略格式化?我已经做了很多研究,但我只是设法找到有日期问题的人。我没有日期问题
答案 0 :(得分:1)
使用
可能会获得更好的表现killArray = application.transpose(some_range.value2)
for n = lbound(killarray) to ubound(killarray)
killarray(n) = Format(killarray(n), "000000")
next n
甚至
Dim killArray
Dim somerange As Range
Set somerange = Range("A2:A10000")
With somerange
killArray = Application.Transpose(Evaluate("INDEX(TEXT(" & .Address & ",""000000""),)"))
End With
答案 1 :(得分:0)
如果您需要速度,请首先删除不必要的循环:
For i = 1 To numrows
killArray(Index) = ActiveCell.Offset(i - 1, 0).Value2
Next
这可以替换为:
killArray(Index) = ActiveCell.Offset(numrows - 1, 0).Value2