I only use VBA occasionally, and every time I come back to it I get caught out by some variation of the following:
I have a Range object, currentCell, that I use to keep track of what cell I’m working with in the spreadsheet. When I update this to point to a different cell, I write:
currentCell = currentCell.Offset(ColumnOffset:=1)
The problem is that I’ve forgotten the Set keyword, so what the above line actually does is use the default property of the Range objects:
currentCell.Value = currentCell.Offset(ColumnOffset:=1).Value
So the contents of the current cell are overwritten by what’s in the new cell, and my currentCell variable hasn’t changed to point to a new cell, and I get filled with rage as I realize I’ve made the same mistake for the hundredth time.
There probably isn’t a better answer than to put a post-it on my monitor saying “Have you remembered to use Set today?”, but if anyone has any suggestions to help me, I’d appreciate hearing them. In particular:
- Is there any way to turn on warnings when you implicitly use default properties? I have never used them like this on purpose, I’d always call
Range.Valueif that’s what I meant. - Is there any good practice for marking variables as “this should only be used to read from the spreadsheet”? In most code I write, almost all my variables are for gathering data, and it would be handy to get a warning if something starts inadvertently editing cells like this.
No.
Well, you could make your own variable naming convention, à la Making Wrong Code Look Wrong, but you’ll still have to check your own code visually and the compiler won’t help you do that. So I wouldn’t rely on this too much.
A better option is to circumvent the need for repeatedly redifining
currentCellusing.Offsetaltogether.Instead, read the entire range of interest to a Variant array, do your work on that array, and then slap it back onto the sheet when you’re done modifying it.
Voilà. No use of default properties or anything that could be confused as such. As a bonus, this will speed up your code execution.