There are two ways to implement macro statements, in fact, there is no syntax problem in both methods, but why the first one works and the second does not complete.
/*there is macro code*/
%MACRO IMPORT(FILE,OUTFILE,SHEETFILE,DATANAME);
%LET FILE=%SYSFUNC(DEQUOTE(&FILE));
%LET OUTFILE=%SYSFUNC(DEQUOTE(&OUTFILE));
%LET SHEETFILE=%SYSFUNC(DEQUOTE(&SHEETFILE));
%LET DATANAME=%SYSFUNC(DEQUOTE(&DATANAME));
PROC IMPORT
DATAFILE="&FILE"
OUT=&OUTFILE DBMS=EXCEL REPLACE;
SHEET=&SHEETFILE;
GETNAMES=YES;
RUN;
PROC DS2;
DATA &DATANAME (OVERWRITE=YES);
DCL VARCHAR CITY HAVING LABEL '城市';
DCL DOUBLE _COL1 HAVING LABEL '人均GDP(元)';
DCL DOUBLE _COL2 HAVING LABEL '第二、三产业比重';
DCL DOUBLE _COL3 HAVING LABEL '城乡居民人均可支配收入(元)';
DCL DOUBLE _COL4 HAVING LABEL '税收收入';
DCL DOUBLE _COL5 HAVING LABEL '社会消费品零售总额(亿元)';
DCL DOUBLE _COL6 HAVING LABEL '城镇非私营单位人员年平均工资(元)';
DCL DOUBLE _COL7 HAVING LABEL '固定资产投资额(亿元)';
DCL DOUBLE _COL8 HAVING LABEL '电信业务总量(亿元)';
DCL DOUBLE _COL9 HAVING LABEL '旅游总消费(亿元)';
DCL DOUBLE _COL10 HAVING LABEL '工业总产值(亿元)';
DCL DOUBLE _COL11 HAVING LABEL '第二产业增加值(亿元)';
DCL DOUBLE _COL12 HAVING LABEL '第三产业增加值(亿元)';
METHOD RUN();
SET &OUTFILE ;
END;
ENDDATA;
RUN;
QUIT;
%MEND IMPORT;
/*This is the first way macro code is implemented*/
%IMPORT(C:\Users\Administrator\OneDrive\aaa.xlsx
,_&A,_&A,PCA_&A);
%IMPORT(C:\Users\Administrator\OneDrive\aaa.xlsx
,_&B,_&B,PCA_&B);
%IMPORT(C:\Users\Administrator\OneDrive\aaa.xlsx
,_&C,_&C,PCA_&C);
%IMPORT(C:\Users\Administrator\OneDrive\aaa.xlsx
,_&D,_&D,PCA_&D);
/*This is the second way macro code is implemented.But I want to implement macro statements differently*/
PROC FCMP OUTLIB=WORK.FUNCSS.MATH;
FUNCTION IMPORT_MACRO(OUTFILE $,SHEETFILE $,DATANAME $);
DATA=TRIM(LEFT('PCA'||DATANAME));
FILE='C:\Users\Administrator\OneDrive\aaa.xlsx';
RC=RUN_MACRO('IMPORT',FILE,OUTFILE,SHEETFILE,DATA);
RETURN(RC);
ENDSUB;
RUN;
QUIT;
OPTIONS CMPLIB=(WORK.FUNCSS);
DATA _NULL_;
DO I="_&A","_&B","_&C","_&D";
RC=IMPORT_MACRO(I,I,I);
END;
RUN;
Can anyone tell me what's wrong with the second way? How to modify?
... View more