标签:VBA,Evaluate
使用Evaluate方法对诸如工作表名称进行检查可以避免使用循环构造。本文将以示例展示它是如何操作的。
在一些网站上,讨论过很多关于在代码中使用自动筛选来避免循环的话题。这很有意义,因为筛选可以在一个操作中完成在多个操作中循环可以完成的事情。一般来说,它比循环快得多,并且使用更少的VBA编码。
下面是尝试使用Evaluate方法进行循环的新方法。
示例要求将列D显示“Yes”的所有数据从sheet1提取到sheet2。
图1:sheet1
图2:sheet2
代码如下:
代码语言:javascript复制Sub FilterToNewLocation()
Dim ar As Variant
If Application.CountIf(Sheet1.Columns(4), "Yes") = 0 Then Exit Sub
With Sheet1.[a1].CurrentRegion
ar = Filter(.Parent.Evaluate("transpose(if(" & .Columns(4).Address & _
"=""Yes"",row(1:" & .Rows.Count & "),char(2)))"), Chr(2), 0)
ar = Application.Index(.Value, Application.Transpose(ar), [{1,2,3,4}])
End With
Sheet2.[A11].Resize(UBound(ar, 1), 4).Value = ar
End Sub
要重复利用该过程,将Columns(4)中修改为判断条件所在的列。
选择要返回的列号,并将其放在花括号中,本示例中是{1,2,3,4}。
确保从工作表1(Sheet1)到工作表2(Sheet2)的工作表引用(工作表代码名称)与数据集一致。
注:本文学习整理自thesmallman.com,有兴趣的朋友可以到下载示例工作簿,或者到知识星球App完美Excel社群下载示例工作簿。