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

时间:2016-02-16 18:10:36

标签: excel vba excel-vba range lowercase

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

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

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

Post detailing code above

我的问题是:

我希望能够动态设置范围,因为我正在处理不断变化的范围大小。但是,以下操作无效,我似乎无法在VBA中使用INDIRECT()。

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

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

2 个答案:

答案 0 :(得分:10)

试试这个:

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

答案 1 :(得分: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

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