2017-01-19 8 views
0

特定の条件の下で別のプロシージャ表が実行されるコードを記述したいと思います。問題はマクロ内のどこかにあります。変更がなければ、すべてうまくいった。 コードのアイデアはかなりシンプルですが、私がこれまでに作成したことは初めてです。データの値xに応じてmakro異なるマクロが実行されます。マクロ内で変数をどのように定義するかはわかりません。マクロがプロシージャ表にある

data makro; 
set number; 
if number < 20 then x=1; 
else x=2; 
run; 

    proc format; 
value temp 70- HIGH='red'; 
run; 

PROC SQL; 
    CREATE TABLE Stat_for_&cel AS 
    SELECT distinct t1.&zmienna, 
      t1.&cel, 
t2.number, 
       (COUNT(t1.cid)) AS ILE 
     FROM zrodlo.abt_app t1 left join ile_zmiennych t2 on t1.&zmienna=t2.&zmienna where t1.&zmienna not is missing 
     GROUP BY t1.&zmienna, 
       t1.&cel 
     ORDER BY t1.&zmienna DESC; 
QUIT; 

%macro tabelka1(Statystyka_dla_cel,&ILE,&cel,&zmienna); 

proc format; 
value temp 70- HIGH='red'; 
run; 

PROC TABULATE 
DATA= &&Stat_for_&cel format=commax10.2 ; 

    VAR &&ILE; 

    CLASS &&zmienna/ MISSING; 
    CLASS &&cel/ MISSING; 

    TABLE 

    /* Row Dimension */ 
&&cel, 
/* Column Dimension */ 
&&ILE* ColPctSum* &&zmienna*[style=[background=temp.]]; 

RUN; 
%mend tabelka1; 

data makro_2; 
set makro; 
if x=1 then call execute ('%tabelka1'); 
run; 

EDIT:答えではないので「回答」から情報を追加しました。

コードはそのように動作するはずです。 & Celと& zmiennaは、私がproc tabulate手続きで使いたい変数であり、コードの始めに手動で定義されています。私は 'number'が<であるときにマクロを1回だけ実行したいと思います。次のいくつかのステップでは、proc形式のデータを準備し、後でプロシージャ表のデータとして使用するテーブル 'Stat_for_ & cel'を作成します。

主な問題は%macro tabelka1の内部です。マクロ内で変数&セルと& zmiennaをどのように実装するべきかわかりません。

+0

残念ながら、あなたの質問は、正確にあなたが助けを求めていることを理解するのに十分ではありません。 – Reeza

+1

サンプルの入出力データが役立ちます。 MAKROにX = 1の条件を満たす複数の観測結果がある場合、マクロを複数回実行しますか?あるいは、X = 1の観測値があれば、1回だけ実行しますか?あるいは、すべての観測値がX = 1である場合に限りますか? – Tom

+0

マクロを書く方法の例を次に示します。コードの最後にマクロを実行するサンプルコードがあります。コメントと使用方法のパラメータリストに注意してください。 – Reeza

答えて

0

私はあなたがマクロの定義と実際の使用法のパラメータを混在させていると思います。マクロを間違って定義しました。むしろより:

%macro tabelka1(Statystyka_dla_cel,&ILE,&cel,&zmienna); 

それは次のようになります。

%macro tabelka1(Statystyka_dla_cel,ILE,cel,zmienna); 

そして、あなたがマクロを呼び出すか、それを試してみて、使用するときに、マクロ変数を渡すことができます。

%tabelka1(Statystyka_dla_cel,&ILE,&cel,&zmienna); 

個人的には、使用されているパラメータ名と値の違いを強調するのに役立つ=記号があります。ここでは簡単な例です:

%macro print_vars(dsin= , vars=); 

proc print data=&dsin; 
var &vars; 
run; 

%mend; 

次に、あなたのようにマクロを呼び出すことができます。

%print_vars(dsin=sashelp.class, vars= name age); 
0

それは様々な用語の意味を明確に理解を持っていることは本当に重要です。マクロ変数は名前と値を持つデータ格納場所です。マクロ変数名は 'ile'、 'cel'などですが、マクロ変数の名前にはアンパサンドが含まれていません。マクロ変数の値にアクセスするには、さまざまな方法がありますが、そのすべてに名前を使用する必要があります。最も一般的な方法は&<macro variable name>ですが、(データステップで)x = symget('<macro variable name>')などを使用することもできます(例:アンパサンドはありません)。

-1

パラメータを指定せずにマクロを定義しても問題ありません。マクロコード内のマクロ変数を参照して、マクロのユーザーに任せて、マクロを呼び出す前にマクロ変数が定義されていることを確認することができます。

%macro tabelka1; 
proc format; 
value temp 70- HIGH='red'; 
run; 

PROC TABULATE DATA=Stat_for_&cel format=commax10.2 ; 
    VAR &ILE; 
    CLASS &zmienna/ MISSING; 
    CLASS &cel/ MISSING; 
    TABLE &cel,&ILE*ColPctSum*&zmienna*[style=[background=temp.]]; 
RUN; 
%mend tabelka1; 

条件付きでマクロを呼び出すには、データステップを使用できます。

data _null_; 
    set makro; 
    if x=1; 
    call execute('%nrstr(%tabelka1);'); 
    stop; 
run; 
関連する問題