2013-11-14 10 views
6

jetzt in Großbuchstaben Ich verwende den folgenden Code, um eine Liste der Ticker-Symbole von Klein- in Großbuchstaben zu konvertieren:eine ganze Reihe umwandeln, ohne Schleife durch alle Zellen

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 

Gibt es eine Methode, die ich Kann ich den gesamten Bereich in einer Zeile umwandeln? so etwas wie:

Range("A1:A20").convertouppercasesomehow 
+1

Warum Sie nicht über jede Zelle Schleife wollen? – Jack

Antwort

27

Gibt es eine Methode, die ich verwenden kann Konvertieren Sie den gesamten Bereich in einer Zeile?

Ja, Sie können ohne Schleifen konvertieren. Versuchen Sie, diese

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

Wie pro Ihr Beispiel

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

Erklärung

Es gibt zwei Teile zu [A1:A20] = [INDEX(UPPER(A1:A20),)]

TEIL 1

Wie oben gezeigt, ist [A1:A20] nichts anderes als nur ein kurzer Weg des Schreibens Range("A1:A20")

TEIL 2

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

Index und Upper sind Tabellenfunktionen. So können Sie Application.Worksheetfunction.Index() verwenden, aber da wir nicht ein Äquivalent UPPER wie Application.Worksheetfunction.UPPER() haben, können wir nur schreiben es als [cell] = [UPPER(cell)]

Jetzt mit dieser Zeile wir VBA beauftragen ein Array zurück und das ist, wo INDEX ins Spiel kommt . (Wie wir wissen, gibt es zwei Formen der INDEX-Funktion: die Array-Form und die Referenzform.) Indem wir keine Zeile oder Spalte des Arrays angeben, lassen wir einfach Excel wissen, dass wir das gesamte Array wollen . (in VBA-Hilfe erwähnt auch) Also im Grunde, was wir tun, ist jede Zelle in [A1:A20] in Groß Umwandlung

+1

+1, Nizza. Ich wette, Sie können nicht erklären, wie es in einer Zeile funktioniert :). –

+0

@DougGlancy: Was ist die Wette? : P –

+1

Wenn Sie das tun, werde ich versuchen, Ihre Antwort noch einmal zu verbessern. –

2

Sie können es nicht in einer Zeile wie das, aber man kann es für einen bestimmten Bereich tun:

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 Für eine einfach zu verstehende Lösung :) –

+0

Ist das nicht immer noch eine Schleife? – Davesexcel

+0

Ja ist es. Diese Lösung ist einfach zu verstehen, aber nicht annähernd so beeindruckend wie @ SiddharthRouts Lösung. –

1

Hier ist eine andere „Motto Hack“:

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

Dies setzt voraus, dass keine Ihrer Zellen enthalten das VbBack-Zeichen (ASCII-Code 8).

+0

+ 1 Für den "One-Liner-Hack": P Schön gemacht! –

0

In Bezug auf die elegante Antwort von Peter Albert, hat die WorksheetFunction 's Funktion einige altmodische Grenzen; speziell gibt es eine Obergrenze von 65.535 (max. unsigned integer -1) Elementen, die umgedreht werden können.Das Massenladen eines Variantenarrays, das Verarbeiten von "In-Memory" und das anschließende Zurückgeben der geänderten Werte an das Arbeitsblatt kann dieses Limit überwinden.

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 

Dies verarbeitet sehr schnell. 100K Zellen von Daten benötigen typischerweise weniger als eine halbe Sekunde und 1M Zellen können in 4-6 Sekunden konvertiert werden.


Dies ist die Art von Sub-Prozedur, die von der Arbeit an Zellen in der Application.Selection Eigenschaft profitieren kann. Siehe this answer für den Textbaustein framwork, um Zellen innerhalb der Auswahl zu verarbeiten.

0

von dem, was ich aus verschiedenen Quellen gesammelt:

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