マクロの背後にあるロジックが間違っています。
そのマクロをデータステップ内で呼び出しているため、マクロにはデータステップ内で解決できる何か (ステートメント) が含まれている必要があります。
If-else はマクロ言語ではなく、通常のデータステップ言語で記述します。
%macro set_istituzionale(set=, varout=);
if &set/100 = 1 then &varout = 'AP';
%mend set_istituzionale;
呼び出しを使用すると、データステップが次のように解決されます。
data soff2;
set soff;
%set_istituzionale(set=setcon,varout=set);
run;
は次のようになります:
data soff2;
set soff;
if setcon/100 = 1 then set = 'AP';
run;
あなたのコードでは、マクロコードを使用していたので、ステップはマクロブールステートメントに内部的に解決されました %if &set/100 解決されたのは %if setcon/100 で、setcon は文字列でした (ここでは、条件付きでマクロ言語を使用して、変数はデータステップから完全に独立しているため、変数の値をキャッチしません)。
マクロ言語は、コードを書き留めることができるものだけを考えるべきです。たとえば、最初の試行のようなものを使用して、次のようなマクロ変数の値に条件付きでステートメントを挿入できます。
data try;
set want;
%if ¯ovar=A %then %do;
if var1=1 and var2='B' then var3='C';
%end;
%if ¯ovar=B %then %do
if var1=2 and var2='A' then var3='D';
%end;
run;
when the macro variable macrovar will be = A the step will be:
data try;
set want;
if var1=1 and var2='B' then var3='C';
run;
if the macro variable macrovar will be = B the step will be:
data try;
set want;
if var1=2 and var2='A' then var3='D';
run;
ただし、マクロ変数の値に対して条件付きでデータステップなどを実行するなど、データステップの外部でもマクロ コードを使用できます。
%if ¯ovar=A %then %do;
data try; set tr;
some code;
run;
%end;
%else %if ¯ovar=B %then %do;
proc sort data=tr out=try nodupkey; by var1; run;
%end;