The biggest "WTF" is not using parameters, since if txtNom has single quotes or anything funky it may screw up your SQL.
Other than that, it is a matter of preference on how to string together dynamic "AND" conditions. There seems to be 3 ways to do it:
1) always start your where clause with "1=1 " , and tack on " AND xx" conditions to that. No need to worry about preceeding ANDs causing an error.
2) conditionally add " AND " to all but the first item, as you are doing here. To me, this is not usually worth it, since there are easier ways.
3) start your WHERE clause with "", and tack on " AND xxx" conditions, and then do a quick MID() / SUBSTRING() at the end to remove the first "AND".
I usually go with option #3, for what it is worth.
One other option is that dynamic conditions don't need to generate dynamic SQL at all. For example, in your case, if NOM is never null, you could just exclude the condition completely and always execute the where clause and it will still work both ways (since a value of "" for txtNom generates LIKE "*", which matches everything anyway). This keeps things simple.
You can also use straight-up boolean logic to handle many conditional where clauses as well.
But please -- look into using parameters, whether or not you are using stored procedures (or, in the case of access, stored "queries"). Even Access fully supports parameterized commands.
- Jeff