Salut,
Ce sont les arguments qui suivent ton con.Execute qui sont mauvais (tu confonds avec ceux d'un RecordSet

). Je te rappelle comment est formé le conn.Execute :
Connexion.Execute ([commande], [nb], [options])
commande : La chaine SQL
nb : (Optionnel) le nombre de ligne sur
lesquels effectuer le traitements (et/ou le nb de ligne à être renvoyé
dans le cas de la création d'un recordset associé), en gros : ne sert à
rien

.
options : (Optionnel) Utilisé pour
spécifier les options des énumérations ExecuteOptions et CommandType,
en gros, ne sert à rien car c'est beaucoup trop rare et trop compliqué
pour être utilisé souvent.
PS : les parenthèses sont optionnelles (c'est mieux de les mettre, mais théoriquement ça marche sans

)
Donc dans ton cas :
con.Execute "update main set cityid=" & rec("id") & " where main.city='" & rec("town") & "'"
Dernière précision : pas besoin de tripler les
" pour le main.city, en SQL, tu peux (et même doit, je crois) utiliser les
' . (uniquement pour les chaines de caractères, pour le reste, nombres, dates, tu ne mets rien.)
A+++

Nurgle Il est plus aisé d'être sage pour les autres que pour soi-même !