楼主: emilycly
1342 3

[问答] 关于宏的一个小问题 [推广有奖]

  • 0关注
  • 0粉丝

VIP1+

大专生

35%

还不是VIP/贵宾

-

威望
0
论坛币
2063 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
115 点
帖子
8
精华
0
在线时间
102 小时
注册时间
2013-1-3
最后登录
2018-12-4

10论坛币
我这个宏是关于看t年表A是否出现在t+1年至t+5年的表B里,运行时候出现的问题是:“在需要数值操作数的%EVAL函数或%IF条件中发现字符操作数。条件是%J”
我截取了前一部分程序,我知道问题出在了标黄的地方但是我不知道怎么改,请大家帮忙谢谢。
  • %MACRO TEST_MACRO();
  • %LET YEAR=2004;
  •             %DO I=0 %TO 9;
  •             %LET YEAR1=%EVAL(&YEAR.+&I.);
  •                                     PROC SORT DATA=WORK.A&YEAR1.;BY ID;RUN;
  •                         %DO J=1 %TO 5;
  •             %LET YEAR%EVAL(&J.)=%EVAL(&YEAR.+&I.+&J.);
  •                         %LET T_YEAR=&&YEAR&J..;
  •                         PROC SORT DATA=WORK.B&T_YEAR.;BY ID;RUN;
  •                         %END;

最佳答案

舍身卫道 查看完整内容

楼主不要意思 前2天我没看论坛,这是我测试之后的代码 测试没问题,你试下,我追到这回答你的问题,也是没谁了
关键词:小问题 Macro year eval Data
沙发
舍身卫道 发表于 2018-1-13 10:40:17 |只看作者 |坛友微信交流群
  1. data a2001;
  2. input id;
  3. cards;
  4. 1
  5. 2
  6. 3
  7. 4
  8. 5
  9. ;
  10. run;

  11. data b2002 b2003 b2004 b2005 b2006;
  12. input id;
  13. cards;
  14. 2
  15. 3
  16. 4
  17. 5
  18. 6
  19. ;
  20. run;

  21. %MACRO TEST_MACRO();
  22. %LET YEAR=2001;
  23. *比如暂定数据的起始年份为2001年,数据总共到2017年;
  24.         %DO I=0 %TO 0;
  25.             %LET YEAR0=%EVAL(&YEAR.+&I.);
  26.                                     PROC SORT DATA=WORK.A&YEAR0.;BY ID;RUN;
  27.                         %DO J=1 %TO 5;
  28.             %LET YEAR%EVAL(&J.)=%EVAL(&YEAR.+&I.+&J.);
  29.                         %LET T_YEAR=&&YEAR&J..;
  30.                         PROC SORT DATA=WORK.B&T_YEAR.;BY ID;RUN;
  31.                         %END;
  32.          
  33.                         DATA RSLT_&YEAR0.;
  34.                         MERGE WORK.A&YEAR0.(IN=IN0)
  35.                               WORK.B&YEAR1.(IN=IN1)
  36.                               WORK.B&YEAR2.(IN=IN2)
  37.                               WORK.B&YEAR3.(IN=IN3)
  38.                               WORK.B&YEAR4.(IN=IN4)
  39.                               WORK.B&YEAR5.(IN=IN5)
  40.                                   ;
  41.                         BY ID;
  42.                         IF IN0;
  43.                         IF IN0 AND IN1 THEN FLAG1=1;ELSE FLAG1=0;
  44.                         IF IN0 AND IN2 THEN FLAG2=1;ELSE FLAG2=0;
  45.                         IF IN0 AND IN3 THEN FLAG3=1;ELSE FLAG3=0;
  46.                         IF IN0 AND IN4 THEN FLAG4=1;ELSE FLAG4=0;
  47.                         IF IN0 AND IN5 THEN FLAG5=1;ELSE FLAG5=0;
  48.                         RUN;
  49.     %END;
  50. %MEND;
  51. %TEST_MACRO();
复制代码


楼主不要意思 前2天我没看论坛,这是我测试之后的代码 测试没问题,你试下,我追到这回答你的问题,也是没谁了

使用道具

藤椅
yuchengdong521 学生认证  发表于 2018-1-13 21:41:05 |只看作者 |坛友微信交流群
%MACRO TEST_MACRO();
%LET YEAR=2004;
            %DO I=0 %TO 9;
            %LET YEAR1=%EVAL(&YEAR.+&I.);
                                    PROC SORT DATA=WORK.A&YEAR1.;BY ID;RUN;
                        %DO J=1 %TO 5;
            %LET YEAR&i.&J.=%EVAL(&YEAR.+&I.+&J.);
                        %LET T_YEAR=&&YEAR&J..;
                        PROC SORT DATA=WORK.B&T_YEAR.;BY ID;RUN;
                        %END;

你可以把%eval去掉试试看。

使用道具

板凳
流水不朽 发表于 2018-1-14 10:44:58 |只看作者 |坛友微信交流群
在宏里面,宏变量所代表的值,都是字符串来的,除了两个特殊的宏函数:%eval  %sysevalf ,是在宏环境中
把数字 转换成数值类型来使用,你这里定义宏变量,宏变量本身是字符串的内容,所以无需使用 %eval 来处理。

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-26 15:02