You are on page 1of 2

Power Excel vba secret, avoid using select

I see it all the time, code that selects one thing, then another, then selects something else in order to
navigate and write data in an Excel spreadsheet.
Instead understand that the Microsoft Excel object model and your vba code will be more professional,
robust and mantainable if you dont select anything but instead interact with the Excel objects directly.
Basically you will be able to do more cool stuff because you are now programming the application rather
than just emulating user keystrokes.
Example 1
Sub NotGood()
Dim i As Integer
ActiveWorkbook.Worksheets(2).Select
Range("A5").Select
Selection.Value = "Enter Numbers"
For i = 1 To 15
ActiveCell.Cells(2).Select
Selection.Value = i
Next
End Sub
Example 2
' Least amount of code but no variables
'(variables are better as they give you more flexibility in larger programs)
Sub MinimumAmountOfCode()
With ActiveWorkbook.Worksheets(2).Range("C5")
.Value = "Enter Numbers"
.Offset(1).Value = "1"
.Offset(1).Resize(15).DataSeries Step:=1
End With
End Sub
Example 3
Sub Better()
Dim wbk As Workbook
Dim rngCell As Range, rngNumbers As Range
Dim i As Integer

' Set up two references
Set wbk = ActiveWorkbook
Set rngCell = wbk.Worksheets(2).Range("E5")

rngCell.Value = "Enter Numbers"

' Populate 1 to 15
For i = 1 To 15
rngCell.Offset(i).Value = i
Next
' Done

'=========================================================
' Following is for extra credit ! :-)
'=========================================================

' Get reference to numbers range
Set rngNumbers = rngCell.CurrentRegion
Set rngNumbers = rngNumbers.Resize(rngNumbers.Rows.Count - 1).Offset(1)

MsgBox "Numbers entered click OK to try a different way", vbExclamation
rngNumbers.Clear

MsgBox "Range Cleared, now lets populate it a different way", vbExclamation
' Enter numbers without needing to loop
rngNumbers.Resize(1, 1).Value = 1
rngNumbers.Resize(15).DataSeries Step:=1

' Now put those numbers somewhere else
rngNumbers.Offset(, 4).Value = rngNumbers.Value
End Sub
Which of the above examples are best? Well it depends
Example 1 is the worst as it is just a macro (copying keystrokes) and thus has the least options for building
a strong application with options for future extendibility. We need to choose then between Example 2 and
Example 3.
Example 2 does not use any variables, this is good if you need code to run really really fast (unless it is in a
huge loop you aint gonna notice the difference.) but not so good from a readability point of view (especially
when you get into hundreds of lines of code.)
Example 3 uses variables Dim wbk As Workbook etc so instead of writing..
wbk.Worksheets(2).Range("E5").value="Enter Numbers"
you can instead just use
rngCell.value="Enter Numbers"
(very useful if you are writing to that cell in different parts of the code) this is also faster for the processor as
it does not have to navigate across each dot.
Example 3 gets my vote, because as your programs do more things (and therefore get more complex) this
coding style will be the easiest to maintain and help you to continue thinking like a human rather than a
machine spewing 001001001110101101111001