如何使用Evaluate替代For Each循环实现单元格批量赋值?
如何使用Evaluate替代For Each循环实现单元格批量赋值?
嘿,我来帮你搞定这个问题!你想用Evaluate替代For Each循环给A1:D5区域批量填充序号对吧?其实Evaluate可以通过数组式计算直接完成这类批量操作,相比循环不仅代码更简洁,处理大区域时效率也会高很多。
先回顾下你的原代码,它是通过循环逐个给单元格赋值1到20的序号:
Sub Loop_Range_2() Dim cel As Range, counter As Long For Each cel In Range("A1:D5") counter = counter + 1 cel = counter Next End Sub
下面给你两种用Evaluate实现的方案,适配不同的Excel版本:
方案一:兼容所有Excel版本的通用写法
Sub Evaluate_Range() Dim totalCells As Long totalCells = Range("A1:D5").Cells.Count Range("A1:D5") = Evaluate("TRANSPOSE(ROW(1:" & totalCells & "))") End Sub
我给你拆解下这段代码的逻辑:
- 先通过
Range("A1:D5").Cells.Count算出目标区域的总单元格数(这里是20) ROW(1:20)会生成一个包含1到20的纵向数组TRANSPOSE把纵向数组转成一维数组,这样赋值时会按行的顺序填充到A1:D5区域里- 最后直接把Evaluate计算出的数组批量赋值给整个区域,一步完成所有单元格的填充,完全不需要循环
方案二:Excel 365/2021+ 专属简洁写法
如果你的Excel版本支持SEQUENCE函数(这是365及以后版本新增的函数),可以用更直观的写法:
Sub Evaluate_Sequence() Range("A1:D5") = Evaluate("SEQUENCE(5,4)") End Sub
这里SEQUENCE(5,4)会直接生成一个5行4列的序号数组,和A1:D5的区域大小完全匹配,直接赋值就能得到和原循环一样的结果,连转置操作都省了。
总的来说,Evaluate的核心是把字符串当作Excel公式计算,返回对应的数组后批量赋值给单元格区域,避免了逐个单元格循环的性能开销,非常适合这类批量赋值场景。
备注:内容来源于stack exchange,提问作者Peace
相关产品推荐
相关产品推荐

