I just solved a problem I was having putting the “Set” keyword in a definition line but what I would like to know is “why” ?
Basically, I am doing this:
Dim startCell, iCell as Range
For Each iCell in Range(whatever)
If iCell.value <>"" Then
Set startCell = Cells(iCell.Row + 1, iCell.Column)
End If
Next iCell
If I omit the “Set” keyword the code still compiles fine, but in the local variables window I see that its type changes to “String” instead of “Variant/Object/Range”. Why would that happen ?
This is why. When you say this:
you think you’ve done this:
but what you’ve really done is this:
This is a classic VBA mistake. Most VBA programmers have made it, and that’s why most VBA programmers fall back on declaring only one variable per
Dimstatement (i.e. one per line). Otherwise it’s way too easy to make that mistake, and difficult to spot it afterwards.So with
Dim startCellyou’ve implicitly declared your variable as Variant type (equivalent toDim startCell As Variant).When you then say this:
the Variant acquires the type of the thing on the right hand side of the reference assignment (Range). However, when you say this:
without the
Setkeyword, you’re not assigning a reference, but a value to the variablestartCell, which now acquires the type of the value on the right hand side. What is that type? Well, the default property of a Range object isValue, so you’re going to get the type ofCells(iCell.Row + 1, iCell.Column).Value. If that cell contains a string, then you’ll get a string.