Достался макрос, который помечает строки заказов с нулевым количеством, и он пометил заодно все пустые строки. Проверка была If ws.Cells(r, 4).Value = 0 Then. Пустая ячейка отдаёт Variant со значением Empty, а Empty равно 0 (и "" тоже, если написать проверку наоборот, так что и этим путём не выиграть). Никто, разумеется, ничего не объявлял, так что весь макрос работал на Variant, и сравнение сделало ровно то, что делают Variant.
Быстрое решение - IsEmpty перед сравнением. Ладно. Но это заставило посчитать, сколькими способами значение в VBA может означать «здесь ничего нет». Empty из пустой ячейки, Null из поля Access, Nothing у объектной переменной, "", 0 и значение ошибки, если в ячейке видно #N/A. Шесть вариантов записи, и для каждого своя проверка.
Как вы моделируете «нет значения» в VBA? Переводите на входе в типизированные переменные с флагом или оставляете Variant и везде проверяете через VarType?