...but the textval: expression returns them all as 2, so they are not sorted.
Looking back over the posts, I think you're missing a function call in the query. txtVal shoulld be:
Mid([House/FlatNumber],IIf(Val([House/FlatNumber])=0,1,Nz(Len(Val([House/FlatNumber]))+1,1)))
and not:
IIf(Val([House/FlatNumber])=0,1,Nz(Len(Val([House/FlatNumber]))+1,1))
That's why txtval is returning a 2. Without the Mid function, the Iif is going to return a number.
But I can see no reason to have this complicated (although exquisite) Where clause in the query. As far as I can tell,
SELECT qselCustomerAreaSearch.Title, qselCustomerAreaSearch.[FirstName/Initial], qselCustomerAreaSearch.Surname, qselCustomerAreaSearch.[House/FlatNumber], qselCustomerAreaSearch.Street, qselCustomerAreaSearch.Area, qselCustomerAreaSearch.Area2, qselCustomerAreaSearch.[Town/City], qselCustomerAreaSearch.County, qselCustomerAreaSearch.PostCode, qselCustomerAreaSearch.HomePhoneNumber, qselCustomerAreaSearch.Mobile_WorkNumber, qselCustomerPurchases.DateOfPurchase, qselCustomerPurchases.Season, qselCustomerPurchases.TotalCost, tblCustomerPurchasedItems.Product, tblCustomerPurchasedItems.Quantity, qselCustomerAreaSearch.CustomerNumber, qselCustomerPurchases.PurchaseNumber
FROM (qselCustomerAreaSearch INNER JOIN qselCustomerPurchases ON qselCustomerAreaSearch.CustomerNumber = qselCustomerPurchases.CustomerNumber) INNER JOIN tblCustomerPurchasedItems ON qselCustomerPurchases.PurchaseNumber = tblCustomerPurchasedItems.PurchaseNumber
ORDER BY Val([House/FlatNumber]), Mid([House/FlatNumber],IIf(Val([House/FlatNumber])=0,1,Nz(Len(Val([House/FlatNumber]))+1,1)));
produces the exact same ordered record set as:
SELECT qselCustomerAreaSearch.Title, qselCustomerAreaSearch.[FirstName/Initial], qselCustomerAreaSearch.Surname, qselCustomerAreaSearch.[House/FlatNumber], qselCustomerAreaSearch.Street, qselCustomerAreaSearch.Area, qselCustomerAreaSearch.Area2, qselCustomerAreaSearch.[Town/City], qselCustomerAreaSearch.County, qselCustomerAreaSearch.PostCode, qselCustomerAreaSearch.HomePhoneNumber, qselCustomerAreaSearch.Mobile_WorkNumber, qselCustomerPurchases.DateOfPurchase, qselCustomerPurchases.Season, qselCustomerPurchases.TotalCost, tblCustomerPurchasedItems.Product, tblCustomerPurchasedItems.Quantity, qselCustomerAreaSearch.CustomerNumber, qselCustomerPurchases.PurchaseNumber
FROM (qselCustomerAreaSearch INNER JOIN qselCustomerPurchases ON qselCustomerAreaSearch.CustomerNumber = qselCustomerPurchases.CustomerNumber) INNER JOIN tblCustomerPurchasedItems ON qselCustomerPurchases.PurchaseNumber = tblCustomerPurchasedItems.PurchaseNumber
ORDER BY Val([House/FlatNumber]), qselCustomerAreaSearch.[House/FlatNumber];
Make two new querys, one for each sql, and compare them side by side.
hth,