前のページ|次のページ

マクロ関数

マクロ関数の使用

各マクロ言語関数は、1つ以上の引数を処理することで結果を生成します。すべてのマクロ関数を、マクロ定義とオープンコードの両方で使用できます。マクロ関数には、文字関数、評価関数、クォーティング関数などがあります。マクロ言語関数を次の表に示します。
マクロ関数
機能
説明
%BQUOTE、%NRBQUOTE
マクロの実行時に、置換された値に含まれている特殊文字やニーモニック演算子をマスクします。
%EVAL
整数演算を使用して、算術演算式や論理式を評価します。
%INDEX
文字列の先頭文字の位置を返します。
%LENGTH
文字列の長さを返します。
%QUOTE、%NRQUOTE
マクロの実行時に、置換された値に含まれている特殊文字やニーモニック演算子をマスクします。一致しない引用符(“ ”)とかっこ( () )には、文字の前に%を挿入してマークを付ける必要があります。
%SCAN、%QSCAN
番号で指定されたワードを検索します。%QSCANは、結果に含まれる特殊文字とニーモニック演算子をマスクします。
%STR、%NRSTR
マクロのコンパイル時に、定数テキストに含まれている特殊文字やニーモニック演算子をマスクします。一致しない引用符(“ ”)とかっこ( () )には、文字の前に%を挿入してマークを付ける必要があります。
%SUBSTR、%QSUBSTR
文字列の部分文字列を生成します。QSUBSTRは、結果に含まれる特殊文字とニーモニック演算子をマスクします。
%SUPERQ
マクロの実行時に、すべての特殊文字とニーモニック演算子をマスクして、値の置換が行われないようにします。
%SYMEXIST
指定されたマクロ変数が存在するかどうかを示す値を返します。
%SYMGLOBL
指定されたマクロ変数のスコープがグローバルかどうかを示す値を返します。
%SYMLOCAL
指定されたマクロ変数のスコープがローカルかどうかを示す値を返します。
%SYSEVALF
浮動小数点演算を使用して、算術演算式や論理式を評価します。
%SYSFUNC、%QSYSFUNC
SAS関数またはユーザー作成の関数を実行します。QSYSFUNCは、結果に含まれる特殊文字とニーモニック演算子をマスクします。
%SYSGET
指定されたホスト環境変数の値を返します。
%SYSMACEXEC
マクロが現在実行中かどうかを示します。
%SYSMACEXIST
WORK.SASMACRカタログにマクロ定義があるかどうかを示します。
%SYSMEXECDEPTH
呼び出し点からのネストの深さを返します。
%SYSMEXECNAME
ネストレベルで実行しているマクロの名前を返します。
%SYSPROD
SASソフトウェアプロダクトがサイトでライセンスされているかどうかをレポートします。
%UNQUOTE
値に含まれるすべての特殊文字とニーモニック演算子のマスクを解除します。
%UPCASE、%QUPCASE
文字列を大文字に変換します。%QUPCASEは、結果に含まれる特殊文字とニーモニック演算子をマスクします。

マクロ文字関数

文字関数は、文字列を変更したり、文字列に関する情報を提供したりします。マクロ文字関数を次の表に示します。
マクロ文字関数
機能
説明
%INDEX
文字列の先頭文字の位置を返します。
%LENGTH
文字列の長さを返します。
%SCAN、%QSCAN
番号で指定されたワードを検索します。%QSCANは、結果に含まれる特殊文字とニーモニック演算子をマスクします。
%SUBSTR、%QSUBSTR
文字列の部分文字列を生成します。QSUBSTRは、結果に含まれる特殊文字とニーモニック演算子をマスクします。
%UPCASE、%QUPCASE
文字列を大文字に変換します。%QUPCASEは、結果に含まれる特殊文字とニーモニック演算子をマスクします。
名前がQで始まる場合と始まらない場合の2つがあるマクロ文字関数(たとえば、%QSCANと%SCAN)の場合、Qで始まる関数が結果に含まれる特殊文字とニーモニック演算子をマスクするということ以外、それら2つの関数は同じ動作をします。引数がマクロクォーティング関数を使用してすでにマスクされている場合、またはマスクされた結果が必要な場合(たとえば、一致しない引用符やかっこが結果に含まれる可能性がある場合)、名前がQで始まる関数を使用します。詳細については、マクロクォーティングを参照してください。
多くのマクロ文字関数の名前はSAS文字関数に対応しており(たとえば、%SUBSTRとSUBSTR)、それらは同じようなタスクを実行します。ただし、マクロ関数は、DATAステップが実行される前に動作します。次のDATAステップについて考えてみます。
data out.%substr(&sysday,1,3);     /* macro function */
   set in.weekly (keep=name code sales);
   length location $4;
   location=substr(code,1,4);         /* SAS function */
run;
このプログラムを月曜に実行すると、次のように、OUT.MONというデータセット名が作成されます。
data out.MON;                      /* macro function */
   set in.weekly (keep=name code sales);
   length location $4;
   location=substr(code,1,4);         /* SAS function */
run;
IN.WEEKLYの変数CODEに、cary18593およびapex19624という値が含まれているとします。SAS関数SUBSTRは、DATAステップの実行時に動作して、 caryおよびapexという値を変数LOCATIONに割り当てます。

マクロ評価関数

評価関数は、算術演算式と論理式を評価します。これらの関数は、引数に含まれるオペランドを一時的に数値に変換します。次に、これらの関数は、オペランドによって指定された演算を実行し、その結果を文字値に変換します。マクロプロセッサは、評価関数を使用して、次のことを実行します。
  • 文字の比較
  • 論理(ブール)式の評価
  • 数値プロパティ(関数の引数に含まれる整数など)のトークンへの割り当て
詳細については、マクロ式を参照してください。次の表に、マクロ評価関数を示します。
マクロ評価関数
機能
説明
%EVAL
整数演算を使用して、算術演算式や論理式を評価します。
%SYSEVALF
浮動小数点演算を使用して、算術演算式や論理式を評価します。
%EVALは、次の関数の評価を実行するステートメントで、マクロプロセッサによって自動的に呼び出され、引数に含まれる式を評価します。
  • %QSCAN(argument, n<, delimiters>)
  • %QSUBSTR(argument, position<, length>)
  • %SCAN(argument, n<, delimiters>)
  • %SUBSTR(argument, position<, length>)

マクロクォーティング関数

マクロクォーティング関数は、マクロプロセッサが特殊文字とニーモニック演算子をマクロ言語の要素としてではなくテキストとして解釈できるようにするために、それらの文字をマスクします。
次の表では、マクロクォーティング関数を示し、それらがマスクする特殊文字と、それらが動作するタイミングについて説明します(%QSCAN、%QSUBSTR、および%QUPCASEは、結果に含まれる特殊文字とニーモニック演算子をマスクしますが、これらの関数はクォーティング関数とは見なされません。これは、これらの関数の目的が文字値を処理することにあり、単に値をクォーティングすることではないためです)。詳細については、マクロクォーティングを参照してください。
マクロクォーティング関数
機能
説明
%BQUOTE、%NRBQUOTE
マクロの実行時に、置換された値に含まれている特殊文字やニーモニック演算子をマスクします。BQUOTEと%NRBQUOTEは、一致しない引用符(“ ”)とかっこ( () )にマークを付ける必要がないため、実行時に値をマスクする最も強力な関数です。
%QUOTE、%NRQUOTE
マクロの実行時に、置換された値に含まれている特殊文字やニーモニック演算子をマスクします。一致しない引用符(“ ”)とかっこ( () )には、文字の前に%を挿入してマークを付ける必要があります。
%STR、%NRSTR
マクロのコンパイル時に、定数テキストに含まれている特殊文字やニーモニック演算子をマスクします。一致しない引用符(“ ”)とかっこ( () )には、文字の前に%を挿入してマークを付ける必要があります。
%SUPERQ
マクロの実行時に、すべての特殊文字とニーモニック演算子をマスクして、値の置換が行われないようにします。
%UNQUOTE
値に含まれるすべての特殊文字とニーモニック演算子のマスクを解除します。

コンパイルクォーティング関数

%STRと%NRSTRは、マクロ定義またはオープンコード内のマクロ言語ステートメントのコンパイル時に、値に含まれる特殊文字とニーモニック演算子をマスクします。たとえば、次の%STR関数は、%LETステートメントが誤って終了しないようにしています。この関数は、PROC PRINTステートメントに含まれるセミコロンが、%LETステートメントのセミコロンとして解釈されないようにしています。
%let printit=%str(proc print; run;);

マクロクォーティング関数の実行

%BQUOTE、%NRBQUOTE、%QUOTE、%NRQUOTE、および%SUPERQは、マクロまたはオープンコード内のマクロ言語ステートメントの実行時に、値に含まれる特殊文字とニーモニック演算子をマスクします。%SUPERQを除くこれらの関数は、マクロ式を可能な限り置換するようにマクロプロセッサに指示し、その結果をマスクします。他のクォーティング関数は、置換できなかったマクロ変数参照またはマクロ呼び出しに対して、警告メッセージを発行します。%SUPERQは、それ以上置換が行われないように、マクロ変数の値を保護します。
実行時に値を置換するクォーティング関数のうち、%BQUOTEと%NRBQUOTEが最も柔軟性を持ちます。たとえば、次の%BQUOTE関数は、マクロ変数STATEがOR(Oregonの略称)に置換された場合に、%IFステートメントでエラーが発生しないようにしています。%BQUOTEを使用しないと、マクロプロセッサは、Oregonの略称を論理演算子ORとして解釈します。
%if %bquote(&state)=nc %then %put North Carolina Dept. of
Revenue;
%SUPERQは、マクロシンボルテーブルからマクロ変数の値を取得して、それを即座にマスクし、置換されたその値のどの部分もマクロプロセッサによって置換されないようにします。たとえば、次の%LETステートメントでは、%SUPERQを使用して、このステートメントがアンパサンドを含む値(Smith&Jonesなど)に置換された場合にエラーが発生しないようにしています。%SUPERQを使用しないと、マクロプロセッサは&Jonesを置換しようとします。
%let testvar=%superq(corpname);
     /* No ampersand in argument to %superq. */
(%SUPERQは、引数として、アンパサンドを含まないマクロ変数名、またはマクロ変数名を生成するテキスト式のいずれかを受け取ります。)

一致しない引用符とかっこ

%STR、%NRSTR、%QUOTE、および%NRQUOTEの引数に、一致しない引用符またはかっこが含まれる場合、構文エラーが発生します。これらのエラーを回避するには、一致しない引用符とかっこの前にパーセント記号を挿入してマークを付けます。たとえば、値345)をマクロ変数Bに格納するには、次のように記述します。
%let b=%str(345%));
%STR、%NRSTR、%QUOTE、または%NRQUOTEの引数に、前にパーセント記号の付いた引用符またはかっこを含める場合は、引数のパーセント記号が引用符またはかっこのためのマークではないことを指定するために、2つのパーセント記号(%%)を使用します。たとえば、値TITLE "20%";をマクロ変数Pに格納するには、次のように記述します。
%let p=%str(TITLE "20%%";);
これらの関数のいずれかの引数に、コメントシンボル(/*および-->)を含む文字列を格納する場合、各文字に対して%STR関数を使用します。たとえば、次のステートメントを考えます。
%let instruct=Comments can start with %str(/)%str(*).;
%put &instruct;
これによって、次の行がSASログに書き込まれます。
Comments can start with /*
注: クォーティング関数を使用してコメントシンボルをクォーティングしなかった場合、予期しない結果が生じる恐れがあります。
マクロクォーティングの詳細については、マクロクォーティングを参照してください。

DBCS (ダブルバイト文字セット)用のマクロ関数

東アジア言語には数千の文字があるため、各文字を表現するには、ダブル(2)バイトの情報が必要です。各東アジア言語には、通常、複数のDBCSエンコード体系があります。SASは、主要な東アジア言語に固有のDBCSエンコード情報を処理します。DBCSをサポートするマクロ関数を、次の表で定義します。
DBCS用のマクロ関数
関数
説明
%KCMPRES
複数の空白を圧縮し、先頭と末尾の空白を削除します。
%KINDEX
文字列の先頭文字の位置を返します。
%KLEFTおよび%QKLEFT
先頭の空白を削除することによって、引数を左に揃えます。
%KLENGTH
文字列の長さを返します。
%KSCANおよび%QKSCAN
位置で指定されたワードを文字列から検索します。
%KSUBSTRおよび%QKSUBSTR
%KSUBSTRと%QKSUBSTRは、文字列の部分文字列を生成します。
%KUPCASEおよび%QKUPCASE
値を大文字に変換します。
詳細については、SAS各国語サポート(NLS):リファレンスガイドの“Macro Functions for NLS”を参照してください。

その他のマクロ関数

その他の7つのマクロ関数は、これまで述べたカテゴリには当てはまりませんが、重要な情報を提供します。それらの関数を、次の表に示します。
その他のマクロ関数
機能
説明
%SYMEXIST
指定されたマクロ変数が存在するかどうかを示す値を返します。
%SYMGLOBL
指定されたマクロ変数のスコープがグローバルかどうかを示す値を返します。
%SYMLOCAL
指定されたマクロ変数のスコープがローカルかどうかを示す値を返します。
%SYSFUNC、%QSYSFUNC
SAS言語関数またはユーザー作成の関数をマクロ機能内で実行します。
%SYSGET
指定されたホスト環境変数の値を返します。詳細については、使用している動作環境に対応するSASドキュメントを参照してください。
%SYSPROD
SASソフトウェアプロダクトがサイトでライセンスされているかどうかをレポートします。
%SYSFUNCと%QSYSFUNC関数により、次が有効になります。
  • Base SASソフトウェアのほとんどの関数
  • SAS/TOOLKITソフトウェアで作成された関数
  • FCMPプロシジャを使用して作成した関数が、マクロ機能で利用可能
次に例を示します。
• /* in a DATA step or SCL program */
     dsid=open("Sasuser.Houses","i");
• /* in the macro facility */
     %let dsid = %sysfunc(open(Sasuser.Houses,i));
詳細については、%SYSFUNC関数と%QSYSFUNC関数を参照してください。
前のページ|次のページ|ページの先頭へ