将整个范围转换为小写而不循环遍历单元格间接

Convert entire range to lowercase without looping through cells Indirect

我正在查看 VBA 代码,该代码采用整个单元格范围并将它们转换为小写。我发现了以下内容:

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

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

Post detailing code above

我的问题是:

我希望能够在处理不断变化的范围大小时动态设置范围。但是,以下内容不起作用,我似乎无法在 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 秒内对 50K 电池进行测试,在 6.78 秒内对 1M 电池进行测试。