The best way I can think of explaining the approach when writing sql in vba is, any time there is a variable or object name (such as a control or field) that part needs to be a) properly delimited and b) not contained within the quotes that are used to define the sql you're passing to your sql variable. That variable assignment starts and ends with your double quotes. The delimiters are usually date (#) and string ('). Since double quotes denote the end or start of any string, you don't want to wrap your delimited part with double quotes as it improperly terminates and starts a new string section. Doubles can be used, but it's very messy to do so.
It looks like WHERE ((Year([Last_Payment])) should work as a sql statement passed to Access, but not in vba, because year last payment is being read as some thing named "Year([Last_Payment]" not as a function expression Year([Last_Payment]. This is because it is part of the main string being passed to your sql variable. Parts like this need to be outside of the quoted parts being assigned to your sql variable. You do this for every variable or object name or function part, and string them together with the concatenation symbol (&). So your WHERE part needs to be "SELECT ... #" & Year([Last_Payment] & "# ..."
Sometimes dates are passed as strings.
The more we hear silence, the more we begin to think about our value in this universe.
Paraphrase of Professor Brian Cox.