Vba 将整个范围转换为小写,而不在单元格中循环

Vba 将整个范围转换为小写,而不在单元格中循环,vba,excel,range,lowercase,Vba,Excel,Range,Lowercase,我正在研究VBA代码,它接受整个范围的单元格并将它们转换为小写。我发现: [A1:A20] = [index(lower(A1:A20),)] 这在固定范围内可以正常工作(不完全理解语法,但发现以下帖子:) 我的问题是: 我希望能够设置动态范围,因为我正在处理不断变化的范围大小。但是,下面的方法不起作用,我似乎也不能在VBA中使用INDIRECT() Range("A1:A" & n) = [index(lower(Range("A1:A" & n)),)] 有没有办法让这

我正在研究VBA代码,它接受整个范围的单元格并将它们转换为小写。我发现:

[A1:A20] = [index(lower(A1:A20),)]
这在固定范围内可以正常工作(不完全理解语法,但发现以下帖子:)

我的问题是:

我希望能够设置动态范围,因为我正在处理不断变化的范围大小。但是,下面的方法不起作用,我似乎也不能在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电池上测试。

&
n
之间留一个空格,如下所示:
范围(“A1:a”&n)
VBA自动以正确的方式格式化它-我再次尝试使用空格以防万一,但问题相同。我的工作表中出现了#值错误。这是基于问题的正确答案-方括号是VBA中
Evaluate
的简写符号,但只取字符串文字,然而,
Evaluate
将接受一个连接的字符串。有很多关于和函数的玩笑,这些函数实际上与VBA的和函数并行。没有提到的是,VBA与工作表的本机函数没有等价物,这是一个很好的应用实例。