2012-11-27 151 views
0

嗨我有一個程序使用一個宏來調用另一個宏。我有兩個月(jun12和jul12),每個月有兩個部分(1 & 2),我想做一個循環,我構建了一個名爲「循環」的宏,在它內部,我構建了一個數組,並且使用評論做一個宏「嘗試」。sas宏調用宏

似乎它不起作用。有人可以幫我嗎?謝謝!

LIBNAME EC100006 "G:\sample"; 
%MACRO try(month=,part=); 
     ...FROM EC100006.monthitsum&month.lag&part AS t1 
%MEND try; 

%Macro test; 
    ARRAY Mon(2) jun12 jul12; 
    %Do i=1 %to 2; 
     %Do j=1 %to 2 
      %try(month=Mon(i),part=j) 
     %End 
    %End 
%Mend test; 

%test 
+0

你'ARRAY'在這裏,但沒有相關的數據集?你是否試圖從其他數據集中檢索值(jun12 jul12)?當你指的是宏變量時,它也是'%try(month = Mon(&i),part =&j)'。 –

回答

0

你不能有宏變量數組。

使用參數列表重複調用宏的最簡單方法是使用這些參數創建數據集,並使用CALL EXECUTE或使用PROC SQL從數據集調用它,以創建宏調用的宏列表。

data call; 
input month $ part; 
datalines; 
jun12 1 
jul12 2 
;;;; 
run; 

proc sql; 
select cats('%try(month=',month,',part=',part,')') into :mcalllist 
    separated by ' ' 
    from call; 
quit; 

&mcalllist; 

,只有當你有少於20,000個字符值得來電或使作品 - 如果它比你需要嘗試不同的選項以上(%包含文件或調用execute)。

+0

謝謝!我用我的try宏使用你的代碼,好像它不能讀取輸入文件。日誌錯誤如下所示注:由宏變量「PART」生成的行。 1 EC100002 .._ al_1_part_1_lag - 錯誤22-322:期待一個名字。 錯誤200-322:該符號未被識別並將被忽略。 – user1652926

+0

除了在我的示例數據集中更正輸入語句以包含月後$以外,示例代碼按預期工作。您發佈的錯誤經常表明您的代碼中還有其他內容缺失,因爲這意味着它正在觸發數據步驟代碼或其他數據內容以外的其他內容 - 您可能需要將&mcalllist調用放入PROC或數據步驟中? – Joe

+0

謝謝!該程序現在正常工作! – user1652926

0

所以現在它是這樣的

LIBNAME EC100006 "G:\sample"; 
%MACRO try(month=,part=); 
    ...FROM EC100006.monthitsum&month.lag&part AS t1 
%MEND try; 

Data Array 
ARRAY Mon{2} jun12 jul12; 
RUN; 
%Macro test; 
    %Do i=1 %to 2; 
    %Do j=1 %to 2 
     %try(month=Mon(i),part=j) 
    %End 
%End 
%Mend test; 

%test