%macro name_modal();
/*Create macro variables which contain the modalities of variables*/
%do i=1 %to &num_Var;
data _null_;
set &lib..Table_variable_modal_&i.;
call symputx('num_Mod'||compress(put(&i,4.)),_N_,"G");
call symputx('table'||compress(put(&i,4.))||'modal'||compress(put(_N_,4.)),compress(&&name_Var&i.),"G");
run;
%end;
/*Display modalities by variable*/
%do i=1 %to &num_Var;
%put &&name_Var&i. has &&num_Mod&i. modalities ;
%do j=1 %to &&num_Mod&i.;
%put %nrstr(&&tableb&i.modal&j.);
%end;
%end;
%mend name_modal;
%name_modal();
I hope the code is self-documenting.
I’ll explain the problems here.
Everything is working fine until I pass to the second of the program which serves to display the modalities by variables.
For example when the name of modalities being stocked in the macro variables are like
$100% BLO,
100% COLOR,
AVON & RAGOBERT,
BALLANTINE’S,
L’OREAL,
AT&T,
U-V-A
etc
I fail to use %put properly.
I’ve tried using %bquote and %nrstr, but the problem persists.
So far, the only solution I can see is to modify the name of the modalities but since the names come from a client, I don’t have the possibility to make amendment on the data.
Thank you
After trying a few times, I find
%superqcould solve this problem. Handling special characters in macro is troublesome. This page provides some useful tips on macro quoting.I simplified your code here to the following
UPDATE: make it double-loop case.
The result will display correctly.
Note that it is
%superq(tableb&i.modal&j)not%superq(&&tableb&i.modal&j)assuperqaccepts macro variable name without extra ampersand.