• 在编写宏程序的时候遇到一个问题,即一个宏变量与其它字母、数字按一定的规则组合成为另一个宏变量,比如
    %let mvar = group;
    %let &mvar.1 = A;

    即上面这条语句定义了一个新的宏变量:group1,值是A,那么这个宏变量如何在程序中调用呢?

    在SAS的网站上检索到一篇文献(地址:http://www2.sas.com/proceedings/sugi22/CODERS/PAPER77.PDF),其中有一段:“The macro variable &DSN&N resolves to CLINICS5, &DSN5 resolves to FRED.  The &&DSN&N combination first resolves to a macro variable (&DSN5) which then resolves to a value (FRED) in a second pass. ” 按照这篇文献,上面的问题很简单:引用宏变量group1写成&&mvar.1即可,但在SAS9中,实践证明这样的写法无法解析成为&group1。

    后来在人大经济论坛里找到了这个问题的答案:&&&mvar.1。

  • /*
    SAS宏程序名称:helloWord
    主要功能:用SAS启动windows系统中的winword程序,打开一个已经存在的word文件或创建新文件
    主要参数:dir:给定的目录;docName:word文件名
    使用方法:%helloWord(d:\test\a,hello);   **目录可任意给定,不用加引号;文件名可以不加.doc的后缀,当然加了也no problem;
    说明:这个宏在XP/SAS9.13/Office2007下运行正常,在类似的环境下估计也无问题(比如XP/SAS8/Office2003),热心的朋友请帮忙测试,有问题的话希望能反馈给我;
              另外还有一点,这个宏中引用了另一宏(mkdir,功能是建立文件夹),在helloWord运行过程中,如果给出的目录不存在就用mkdir创建这个目录。
    联系我:medleaf@gmail.com
    我的主页:http://www.eyaoo.net/weblog/
    *********************************************************/

    %macro helloWord(dir,docName);
    options noxwait noxsync xmin;
    %let rc=%sysfunc(system(start winword));
    filename cmds DDE 'Winword|System';
    data _null_;
      x=sleep(1);
    data _null_;
      file cmds;
      %mkdir(&dir);
      put '[FileClose 2]';
      if fileexist("&dir\&docName") then
        do;
          put '[FileOpen.Name = "'"&dir\&docName" '"]';
        end;
      else
        do;
          put '[FileNew]';
          put '[FileSaveAs.Name="'"&dir\&docName"'",.Format=0]';
        end;
      put '[AppMinimize]';
      %global currentDoc;
      %let currentDoc = "&dir\&docName";
    run;
    %mend helloWord;


    /*
    记:
    在sas2word中,这个是比较基础的宏程序,原来在我的文章里也介绍过,这次改写了很多,精简了代码,增加了容错(自动建立目录等)功能。

    注意:   x=sleep(1);这一句中,建议在使用时将sleep的时间调的长些,如6或8秒,即x=sleep(8);否则,如果系统启动word的速度比较慢的话,可能会出现找不到文件的错误。

  • 前几年利用SAS的DDE技术编写了几个用于统计报告报表的宏程序,将统计表直接写到WORD中,对于工作效率而言,确实提高了不少,不过这些宏程序编写的很乱,也不够完善,写统计报告的时候,还需要做些Ctrl+C后Ctrl+V的工作,所以决定重新编写这些宏程序,主要是精炼程序代码,增加功能,目标只有一个,即一键生成 Report(理想化,别当真,laugh face)。

    目前编写工作正在进行中,对于其中一些基础的宏,我将陆续放在这里,希望能和大家一起探讨,以便使这些SAS宏程序更加高效和通用。

  • 在临床试验中,使用sas计算受试者的年龄,大体上有三种思路:

    一种是计算当前日期(应该是受试者签署知情同意书的那一天)与受试者生日相差有多少天,然后除以365.25即为年龄值(我把它叫做计算法),另一 种思路是,根据当前的月、日进行判断,当前月份比出生月份大的,或月份相同但当前日等于或大于出生日的情况,年龄即为当前年份与出生年份之差,否则,年龄 是上述差-1,这种方法计算的是整数周岁(我称之为判断法,呵呵),而第一种方法如果不对结果取整的话,年龄是带有小数位的。

    第三种方法也是计算周岁,实现方法更为简单,结果与第二种方法是一致的。具体的代码见文后的补充。