将整个范围转换为大写,而不循环遍历所有单元格

dws*_*ein 6 excel vba range excel-vba uppercase

现在我正在使用以下代码将股票代码列表从小写字母转换为大写字母:

Dim Tickers As String
Dim n As Integer
For n = 2 To Last
    Tickers = UCase(W.Cells(n, 1).Value)
    W.Cells(n, 1).Value = Tickers
Next n
Run Code Online (Sandbox Code Playgroud)

有没有一种方法可以用来将整个范围转换成一行?就像是:

Range("A1:A20").convertouppercasesomehow
Run Code Online (Sandbox Code Playgroud)

Sid*_*out 31

有没有一种方法可以用来将整个范围转换成一行?

是的,你可以转换而不循环.试试这个

Sub Sample()
    [A1:A20] = [INDEX(UPPER(A1:A20),)]
End Sub
Run Code Online (Sandbox Code Playgroud)

按照你的例子

Sub Sample()
    dim rng as Range
    dim sAddr as string

    set rng = Range("A1:A20")
    sAddr = rng.Address

    rng = Evaluate("index(upper(" & sAddr & "),)")

End Sub
Run Code Online (Sandbox Code Playgroud)

说明

有两个部分 [A1:A20] = [INDEX(UPPER(A1:A20),)]

第1部分

如上所示,[A1:A20]只是一种简短的写作方式Range("A1:A20")

第2部分

[INDEX(UPPER(A1:A20),)]

Index并且Upper是工作表函数.所以你可以使用,Application.Worksheetfunction.Index()但由于我们没有相同的UPPER东西Application.Worksheetfunction.UPPER(),我们只能把它写成[cell] = [UPPER(cell)]

现在有了这一行,我们正在指示VBA返回一个数组,这就是INDEX发挥作用的地方.(我们知道,INDEX函数有两种形式:数组形式和引用形式.)通过不指定数组的行或列,我们只是让Excel知道我们想要整个数组.(在VBA帮助中也提到过)所以基本上我们正在做的是将每个单元[A1:A20]转换成大写

  • +1,很好.我打赌你无法解释它是如何工作的:). (3认同)
  • 如果你这样做,我会尝试再次提出你的答案. (3认同)

Net*_*loh 5

你不能像这样在一行中完成它,但你可以在给定范围内完成它,例如:

Sub Test()
    Dim Rng As Range
    Dim c As Range

    Set Rng = ActiveSheet.Range("A1:A20")
    For Each c In Rng
        c.Value = UCase(c.Value)
    Next c
End Sub
Run Code Online (Sandbox Code Playgroud)

这是相当简单和直观的。