我目前无法使用递增数据范围输出一个表,该表使用填充了已使用VBA重命名的JobOffers的电子邮件的表 - 这对我自己的学习来说比其他任何东西更多。
我希望代码循环遍历我可以在宏命令中设置的日子
%EmailDump('01Jan2015'd,'02Jan2015')
它将在下面的代码中运行宏,并允许我从该时段内撤回所有电子邮件并将其导出(我知道我每次都在写表 - 但是这将被导出(每次导出应该是不同,因为它内有EmailStart的宏)
因此,一些虚拟数据看起来像
主题EmailStartDate
工作机会12/01/2015
工作机会25/01/2015
招聘信息12/05/2015
使用的代码如下
%Macro EmailDump(begindate,endindate);
%do
EmailStart = &begindate.
%to &endindate.
%by 1;
%end;
PROC SQL;
CREATE TABLE WORK.EMAILDUMP AS
SELECT * FROM WORK.EMAILS
WHERE TOPIC = 'JobOffer'
and EmailStartDate = &EmailStart
;QUIT;
proc export data=work.EMAILDUMP
dbms=XLSX
outfile="/p01/Output File &EmailStart " replace;
run;
%Mend EmailDump;
%EmailDump('01Jan2015'd,'02Jan2015'd);
错误消息如下所示
错误:在%EVAL函数或%IF条件中找到了一个字符操作数,其中需要一个数字操作数。条件是: &安培; BEGINDATE。 错误:%DO EmailStart循环的%FROM值无效。 错误:在%EVAL函数或%IF条件中找到了一个字符操作数,其中需要一个数字操作数。条件是: &安培; endindate。 错误:%DO EmailStart循环的%TO值无效。 错误:宏EmailDump将停止执行
不确定是否有人可以帮我这个?非常感谢任何帮助!
答案 0 :(得分:3)
以下是您的代码简化,以包含重现问题所需的内容:
%macro emaildump(begindate,endindate);
%do emailstart = &begindate %to &endindate;
%put &emailstart;
%end;
%mend emaildump;
如果我们用文字称呼它,我们会得到你描述的信息:
%emaildump('01jan2015'd,'02jan2015'd);
给出:
ERROR: A character operand was found in the %EVAL function or %IF condition where a numeric
operand is required. The condition was: &begindate
ERROR: The %FROM value of the %DO EMAILSTART loop is invalid.
ERROR: A character operand was found in the %EVAL function or %IF condition where a numeric
operand is required. The condition was: &endindate
ERROR: The %TO value of the %DO EMAILSTART loop is invalid.
ERROR: The macro EMAILDUMP will stop executing.
但是,如果我们传入原始日期值(它们只是表示为整数),它可以正常工作。我们可以使用mdy()
函数计算原始日期值。因为我们是用宏语言进行的,所以我们需要用mdy()
包裹%sysfunc()
:
%let start = %sysfunc(mdy(1,1,2015));
%let end = %sysfunc(mdy(1,2,2015));
%emaildump(&start,&end);
提供所需的输出:
20089
20090
或者,您也可以使用%sysevalf()
来评估文字并将其转换为如下数字:
%let start = %sysevalf('01Jan2015'd);
%let end = %sysevalf('02Jan2015'd);
%emaildump(&start,&end);
正如昆汀在下面的评论中指出的......发生这种情况的原因是:
这是
%DO
语句隐式调用%EVAL
而%EVAL
无法调用的事实的限制 处理日期文字。