If you find that you frequently need to macro quote the arguments to your macro you might find it easier to pass the values with actual quotes. Especially if you are passing the values with SAS code where you could use the QUOTE() function to add the quotes.
Just make your macro smart enough to remove the quotes. Assuming you actually need to remove them, since most values that would require elaborate quoting to be used a macro call are probably going to be used by the macro to generate SAS code where you would just have to add the quotes back anyway.
Here is an example where the macro can pull off the quotes (if there) and then add them back when needed.
%macro mymacro(parm1,parm2);
%local q1 q2 ;
%let parm1=%qsysfunc(dequote(&parm1));
%let parm2=%qsysfunc(dequote(&parm2));
%let q1=%sysfunc(quote(&parm1,%str(%')));
%let q2=%sysfunc(quote(&parm2,%str(%')));
%put &=parm1 &=parm2;
%put &=q1 &=q2;
data _null_;
put 'parm1=' &q1 ;
put 'parm2=' &q2 ;
put "Both = &parm1 &parm2" ;
run;
%mend mymacro;
Example calls:
73 options mprint;
74 %mymacro(parm1=Hi there,parm2='Has a,comma');
PARM1=Hi there PARM2=Has a,comma
Q1='Hi there' Q2='Has a,comma'
MPRINT(MYMACRO): data _null_;
MPRINT(MYMACRO): put 'parm1=' 'Hi there' ;
MPRINT(MYMACRO): put 'parm2=' 'Has a,comma' ;
MPRINT(MYMACRO): put "Both = Hi there Has a,comma" ;
MPRINT(MYMACRO): run;
parm1=Hi there
parm2=Has a,comma
Both = Hi there Has a,comma
NOTE: DATA statement used (Total process time):
real time 0.00 seconds
cpu time 0.00 seconds
75 %mymacro(parm1='Hi there',parm2=%bquote(Has a,comma));
PARM1=Hi there PARM2=Has a,comma
Q1='Hi there' Q2='Has a,comma'
MPRINT(MYMACRO): data _null_;
MPRINT(MYMACRO): put 'parm1=' 'Hi there' ;
MPRINT(MYMACRO): put 'parm2=' 'Has a,comma' ;
MPRINT(MYMACRO): put "Both = Hi there Has a,comma" ;
MPRINT(MYMACRO): run;
parm1=Hi there
parm2=Has a,comma
Both = Hi there Has a,comma
NOTE: DATA statement used (Total process time):
real time 0.00 seconds
cpu time 0.00 seconds
76 %mymacro(parm1="Hi there",parm2=%bquote(Hasn't a comma));
PARM1=Hi there PARM2=Hasn't a comma
Q1='Hi there' Q2='Hasn''t a comma'
MPRINT(MYMACRO): data _null_;
MPRINT(MYMACRO): put 'parm1=' 'Hi there' ;
MPRINT(MYMACRO): put 'parm2=' 'Hasn''t a comma' ;
MPRINT(MYMACRO): put "Both = Hi there Hasn't a comma" ;
MPRINT(MYMACRO): run;
parm1=Hi there
parm2=Hasn't a comma
Both = Hi there Hasn't a comma
NOTE: DATA statement used (Total process time):
real time 0.00 seconds
cpu time 0.00 seconds
... View more