You are right, Jet gets very confused when trying to optimise this query. In fact, it's not the field "dispatch_date" that causes the problem, but the rank.
If you change your first query to a make-table query, you can then base the cross-tab on the temporary table. If needed, you can also add indexes to the temporary table:
CREATE INDEX ndxDate ON TempTable (dispatch_date);
While I'm at it, your query runs about 20 times faster with an index on dispatch_date (on the main table DISPATCHLOG that is).
Other solutions would be to get the 'rank' field back into the main table (one more query), or to create the ranks through a Visual Basic loop -- it would be just as fast.
(°v°)