You need to explain this more. Is Q1 a single variable in your dictionary with value set a, b, c, d or do you have four separate questions q1a, q1b, q1c, q1d? What is the desired behavior when you say you want "Q1. a = 3"? Is this what the user is entering or are you setting the value from logic?
You could make a value set that only contains 1 and notappl (in CSPro notappl is how you refer to blank). CSPro will not let you enter values outside the value set.
You could also use logic to verify that only blank or 1 is entered:
postproc
ifnot $ in1, notapplthen errmsg("Must be 1 or blank"); endif;
Note that in either case to allow entry of blank you will need to use the setproperty function to set "CanEnterNotAppl" to "NoConfirm" for your field as CSPro generally does not allow entry of blank. See help on setproperty for more details. Normally in CSPro you use blank to indicate a question has been skipped and you use a different value for non-response (often code 9).
See the help for the function setproperty (http://www.csprousers.org/help/CSPro/se ... ction.html). You can call setproperty anywhere in your logic BEFORE the field that you want to allow blanks for including the preproc of the field itself.
Setproperty function is new command introduced and works with CSpro 7.1 which is yet to be leased soon. If you are comfortable with the 7.1 beta then you can use it for your setup.