FWIW, I disagree with some of the approaches/statements.
If rs.EOF Or rs.BOF is not correct. For a one record count recordset, both would be True. Also True if the pointer falls on either the first or last record of the set. Either way, the usual approach is to not execute more code for a recordset that contains no records. The correct approach would then be
If Not (rs.BOF And rs.EOF) Then........alternatively If rs.RecordCount > 0
Don't check for = 0 since (I've read) some sql type databases can return -1 when no records are in a set
RecordCount will be 1 when the rs is opened, not 0 - as long as the rs contains at least 1 record. If there are 100, the count will be 1 before MoveLast, not 0.
I always MoveFirst because there's no guarantee that after determining you have more than 0 records, that you will start at what you think is the beginning.
I prefer to base a recordset on a query when order is important, so as to control order via the query, thus pretty much ensure I'm on what I think is the beginning of the recordset.
If Not (rs.BOF And rs.EOF) Then should eliminate the need to MoveLast unless a count is needed
The more we hear silence, the more we begin to think about our value in this universe.
Paraphrase of Professor Brian Cox.