Convert an entire range to uppercase without looping through all the cells
Is there a method I can use to convert the whole range in one line?
Yes you can convert without looping. Try this
Sub Sample()
[A1:A20] = [INDEX(UPPER(A1:A20),)]
End Sub
Alternatively, using a variable range, try this:
Sub Sample()
Dim rng As Range
Set rng = Range("A1:A20")
rng = Evaluate("index(upper(" & rng.Address & "),)")
End Sub
As per your example
W.Range("A1:A20") = [index(upper(A1:A20),)]
Explanation
There are two parts to [A1:A20] = [INDEX(UPPER(A1:A20),)]
PART 1
As shown above, [A1:A20]
is nothing but just a short way of writing Range("A1:A20")
PART 2
[INDEX(UPPER(A1:A20),)]
Index
and Upper
are worksheet functions. So you can use Application.Worksheetfunction.Index()
but since we don't have an equivalent of UPPER
like Application.Worksheetfunction.UPPER()
, we can only write it as [cell] = [UPPER(cell)]
Now with that line we are instructing VBA
to return an array and this is where INDEX
comes into play. (As we are aware, there are two forms of the INDEX
function: the array form and the reference form.) By not specifying a row or a column of the array, we are simply letting Excel know that we want the whole array. (Mentioned in VBA help as well) So basically what we are doing is converting each cell in [A1:A20]
into uppercase
You can't do it in one line like that, but you can do it for a given range like:
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
Which is rather simple and intuitive.