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

Mar*_*ndR 8 excel vba range lowercase excel-vba

我正在查看VBA代码,它接受整个范围的单元格并将它们转换为小写.我找到了以下内容:

[A1:A20] = [index(lower(A1:A20),)]
Run Code Online (Sandbox Code Playgroud)

这适用于固定范围(不完全理解语法,但发现以下帖子:)

发布上面的详细代码

我的问题是:

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

Range("A1:A" & n) = [index(lower(Range("A1:A" & n)),)]
Run Code Online (Sandbox Code Playgroud)

有没有办法让这项工作?我真的想避免使用for循环,因为我怀疑这应该快得多..

Sco*_*ner 10

试试这个:

Range("A1:A" & n) = Application.Evaluate("index(lower(A1:A" & n & "),)")
Run Code Online (Sandbox Code Playgroud)

  • 这是基于问题的正确答案 - 方括号是VBA中"Evaluate"的简写符号,但只接受字符串文字,而"Evaluate"将接受连接字符串. (4认同)
  • 关于[LOWER](https://goo.gl/GMzwTs)和[UPPER](https://goo.gl/WXHHZ4)功能的喋喋不休,实际上是与VBA的[LCase](https)进行了对比://msdn.microsoft.com/en-us/library/office/gg264497.aspx)和[UCase](https://msdn.microsoft.com/en-us/library/office/gg264252.aspx)函数.没有提到的是VBA与工作表的原生[PROPER](https://goo.gl/9F1oDG)功能没有相同之处,这是一个很好的选择. (3认同)

小智 7

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

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
Run Code Online (Sandbox Code Playgroud)

在0.3秒内在50K细胞上测试,在6.78秒内测试1M细胞.