将整个范围转换为大写,而不循环遍历所有单元格
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将整个范围转换为大写,而不循环遍历所有单元格相关的知识,希望对你有一定的参考价值。
现在我正在使用以下代码将股票代码列表从小写字母转换为大写字母:
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
有没有一种方法可以用来将整个范围转换成一行?就像是:
Range("A1:A20").convertouppercasesomehow
有没有一种方法可以用来将整个范围转换成一行?
是的,你可以转换而不循环。试试这个
Sub Sample()
[A1:A20] = [INDEX(UPPER(A1:A20),)]
End Sub
按照你的例子
W.Range("A1:A20") = [index(upper(A1:A20),)]
说明
[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]
中的每个单元格转换为大写
你不能在这样的一行中做到这一点,但是 您可以在给定范围内执行此操作,例如:
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
这是相当简单和直观的。
这是另一个“一线黑客”:
Sub UCaseRange(rng As Range)
rng = WorksheetFunction.Transpose(Split(UCase(Join( _
WorksheetFunction.Transpose(rng), vbBack)), vbBack))
End Sub
这假定您的单元格都不包含vbBack字符(ASCII代码8)。
从我从各种来源收集到的:
Function UcaseRangeAsArray(TargetRng As Range) As Variant()
Dim Arr()
Arr = Evaluate("INDEX(UPPER(" & TargetRng.Address(External:=True) & "),)")
UcaseRangeAsArray = Arr
Erase Arr
End Function
关于Peter Albert提出的优雅答案,WorksheetFunction的Transpose功能有一些老式的限制;特别是有一个可以翻转的65,535(最大无符号整数-1)元素的上限。批量加载变量数组,处理“内存中”并随后将修改后的值返回到工作表可以克服该限制。
Sub test()
With Worksheets("Sheet1")
makeUpper .Range("A2:A1000000")
End With
End Sub
Sub makeUpper(rng As Range)
Dim v As Long, vUPRs As Variant
With rng
vUPRs = .Value2
For v = LBound(vUPRs, 1) To UBound(vUPRs, 1)
vUPRs(v, 1) = UCase(vUPRs(v, 1))
Next v
.Cells = vUPRs
End With
End Sub
这个过程非常快。 100K单元的数据通常需要不到半秒钟,并且可以在4-6秒内转换1M单元。
这是可以从qazxsw poi属性中的单元格处理中受益的子过程的类型。请参阅qazxsw poi获取样板框架以处理Selection中的单元格。
以上是关于将整个范围转换为大写,而不循环遍历所有单元格的主要内容,如果未能解决你的问题,请参考以下文章
循环遍历范围,如果单元格包含值,则复制到列中的下一个空单元格