2013-11-14 39 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