2013-11-14 36 views
6

循环,现在我用下面的代码股票符号列表从小写转换为大写字母:转换的整个范围为大写,而无需通过所有细胞

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 
+1

你为什么不想要遍历每个单元格? – Jack

回答

27

有没有我可以使用的方法将整个范围转换成一行?

是的,你可以转换没有循环。试试这个

Sub Sample() 
    [A1:A20] = [INDEX(UPPER(A1:A20),)] 
End Sub 

按照您的例子

W.Range("A1:A20") = [index(upper(A1:A20),)] 

说明

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

PART 1

如上图所示,[A1:A20]无非是写Range("A1:A20")

PART 2

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

IndexUpper是工作表函数的只是一小段路。所以,你可以使用Application.Worksheetfunction.Index()但由于我们没有的UPPER等效像Application.Worksheetfunction.UPPER(),我们只能把它写成[cell] = [UPPER(cell)]

与该行我们指示 VBA返回数组

现在,而这正是INDEX进场。 ()正如我们所知,INDEX函数有两种形式:数组形式和参考形式。)通过不指定数组的行或列,我们只是让Excel知道我们想要整个数组。 (文中提到的VBA帮助以及)所以基本上我们所做的是每个单元转换在[A1:A20]为大写

+1

+1,很好。我敢打赌,你不能解释它是如何工作在一行:)。 –

+0

@DougGlancy:什么是赌注? :P –

+1

如果你这样做,我会尝试再次提出你的答案。 –

2

你不能做到这一点在这样的一条线,但可以针对给定的范围内像这样做:

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 
+0

+ 1为简单易懂的解决方案:) –

+0

这不是一个循环吗? – Davesexcel

+0

是的。这个解决方案很容易理解,但并不像@ SiddharthRout的解决方案那样令人印象深刻。 –

1

这里的另一个“一个班轮黑客”:

Sub UCaseRange(rng As Range) 
    rng = WorksheetFunction.Transpose(Split(UCase(Join(_ 
     WorksheetFunction.Transpose(rng), vbBack)), vbBack)) 
End Sub 

这是假设,那关你单元格包含vbBack字符(ASCII码8)。

+0

+ 1对于“单线黑客”:P很好! –

0

对于Peter Albert提出的优雅答案,WorksheetFunctionTranspose函数有一些老式的限制;特别是可以翻转的最大值为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的数据通常不到半秒,1M的单元可以在4-6秒内转换。


这是可以从Application.Selection属性对细胞工作受益子过程的类型。请参阅this answer了解样本框架以处理选区内的单元格。

0

从我从各种渠道收集:

Function UcaseRangeAsArray(TargetRng As Range) As Variant() 
Dim Arr()  
Arr = Evaluate("INDEX(UPPER(" & TargetRng.Address(External:=True) & "),)")  
UcaseRangeAsArray = Arr 
Erase Arr 
End Function