Well, it's just the convention. It will work every time to see if the recordset is empty. It's what's provided to us by ADO to check for that very thing.
Let's say that for some strange reason, you have 200 records, but by some stroke (or more likely, a mis-stroke), you have moved the recordset to the last record...
Well, then your recordset would be at the .eof, BUT it's not empty.
Every time, no exceptions, the .eof and .bof will both be true if the recordset is empty.
True, for looping, you should use the while not rs.eof, but it's good programming practice to check for the other first, and then I usually even put in the following bit of code (especially in 'trusted components') before I do the while not .eof loop:
Code:
if not (rs.eof and rs.bof) then
rs.movefirst
end if
It will save you the trouble of an error message at some point in the future... guaranteed ;-)