将整个范围转换为小写,而不通过单元格间接循环

我正在寻找VBA代码,它将整个单元格范围并将其转换为小写字母。 我发现以下内容:

[A1:A20] = [index(lower(A1:A20),)] 

这对一个固定的范围工作正常(不完全理解语法,但发现以下post:)

详细介绍上面的代码

我的问题是这样的:

我希望能够dynamic设置范围,因为我正在处理更改范围大小。 但是,以下不起作用,我似乎无法在VBA中使用INDIRECT()。

 Range("A1:A" & n) = [index(lower(Range("A1:A" & n)),)] 

有没有办法做到这一点? 我真的想避免使用for循环,因为我怀疑这应该是更快..

尝试这个:

 Range("A1:A" & n) = Application.Evaluate("index(lower(A1:A" & n & "),)") 

通过工作表的单元格循环会减慢速度。 抓取所有单元格数据,在内存中处理它,然后将结果转储回工作表。

 Sub makeLower() Dim v As Long, vLWRs As Variant With Worksheets("Sheet1") With .Range(.Cells(1, 1), .Cells(Rows.Count, 1).End(xlUp)) vLWRs = .Value2 For v = LBound(vLWRs, 1) To UBound(vLWRs, 1) vLWRs(v, 1) = LCase(vLWRs(v, 1)) Next v .Cells = vLWRs End With End With End Sub 

在0.3秒内testing50K细胞,在6.78秒内testing1M个细胞。