2014-03-26 17 views
0

所以我有60K行这个文件。我的数据分析人员需要经过这一步并挑选出约30K行。每隔几天发生一次。VBA Autofilter客户编号格式栏?

他们有60K行1张,他们有另一个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。所以id 1将是000001.

问题是,当我使用.value把id放入kill数组时,它得到的id没有格式化。所以ID 000001将只是1.这将是很好,除了自动过滤器现在不工作。因为id-1与id-000001不匹配。我做了一些检查,发现我可以使用killArray(index) = ActiveCell.Offset(i - 1, 0).text,但在我的研究(和测试)过程中,我发现这非常慢。

有没有办法让autofilter忽略格式?我已经做了大量的研究,但我只能找到有问题的人。我没有与日期

+0

使用Format:'killArray(index)= Format(ActiveCell.Offset(i-1,0).value2,“000000”)'可能会更快。如果我在一个语句中将整个列加载到一个变体数组中,那么它可能会更快地将范围加载到一个变量中,然后循环遍历数组格式的元素 – JosieP

+0

,这不会使它成为二维数组吗?我可以使用2D阵列作为自动过滤器吗? – user1759942

+0

不,但你可以使用'application.transpose(range.value2)'得到一个数组:-) – JosieP

回答

1

您:

For i = 1 To numrows 
    killArray(Index) = ActiveCell.Offset(i - 1, 0).Value2 
Next 

这可以被替换也许可以与

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 
+0

awsome,谢谢:) – user1759942

0

如果你有一个需要速度的问题,首先删除非必要的循环:

killArray(Index) = ActiveCell.Offset(numrows - 1, 0).Value2 
+0

我应该指定,'killarray'是一个数组有30k索引,每张拉一张。所以它循环遍历拉片中的每一行,并将每一行添加到数组中的一个点上,所以一旦将该表中的最后一个元素添加到数组中,您的解决方案是否会运行? – user1759942

+0

你没有改变** Index **的循环,你只是在改变**我** ......所以如果** Index **碰巧是768,那么你会改变** Index(768 )** 30,000次! –

+0

* facepalm *你是对的,我离开了那条线。'index = index + 1'在我的代码中,我只是在这里错过了它。 – user1759942