マクロ変数は、特にマクロを実装する際に活用されるものであり、(データセットの列名でなく)他のプログラミング言語で意味付いている「変数」のイメージです。
ただ、他のプログラミング言語と比べて、マクロ変数の扱い方は(個人的に)少し独特な感じです。
今回はマクロ変数の扱い方について、(私がよく使う方法を)説明していきます。
※(マクロ変数でなく)マクロについては下記記事を参照ください。

1.マクロ変数の定義方法

1-1. %letを使う

一番シンプルな定義方法だと思います。
「%let [変数名] = [値];」という形で変数が定義されます。
※尚、「%put _USER_;」は、ユーザ定義のマクロ変数一覧をログに表示するコマンドです。

/* マクロ変数var_nameの定義(文字列でも""で囲む必要無し) */
%let var_name = test;

/* ユーザ定義のマクロ変数一覧をログに表示 */
%put _USER_;
%put _USER_; でログに表示されたマクロ変数情報(今回の対象を抜粋)

1-2. call symput(), call symputx() を使う

call symput() と call symputx() はどちらもdataステップで使うものであり、「入力データセットの内容をマクロ変数にする」ための関数です。
両関数はどちらも引数を2つ設定するものであり、第一引数はマクロ変数名、第二引数は値を設定します。
上記2つ(接尾辞に「x」があるか無いか)の違いですが、後者(call symputx)の方は「第二引数(値)について、引数に指定した値そのものでなく、その前後にある空白を削除(trim)した状態をマクロ変数に設定する」形になります。

data in_data;
	name = "var_name";
	value = "     test     ";
run;

/* call symput */
data _null_;
	set in_data;
	call symput(name, value);
run;
%put _USER_;


/* call symputx */
data _null_;
	set in_data;
	call symputx(name, value);
run;
%put _USER_;
in_data
call symput の場合
call symputx の場合(前後の空白が削除される)

2.マクロ変数の呼び出し方法

2-1. [前提] 呼び出しは「&[マクロ変数名]」

前提として、マクロ変数名の頭に「&」を付ければ変数値を呼び出せます。
※これ自体はシンプルで特に独特と感じないかもしれません。
本記事の始めに独特と記載したのは、「より柔軟にマクロ変数を扱う際、その方法が独特な感じ」という意味であり、具体的には後続の2-2.以降の話になります。
(上記でも使いましたが)「%put xxx;」は、「ログにxxxを表示する」というコマンドであり、これを用いて、変数呼び出しが「頭に&を付ける」で可能なことを試してみます。

%let var_name = test;
%put &var_name;
ログ(赤丸の通り、マクロ変数値が呼び出せました)

2-2. 特定のマクロ変数を”他のマクロ変数の値を使う”事で呼び出す

何を言ってるか分かりづらいかもしれませんが、実際に下記コードを見ていただければと思います。
書き方の要点としては、下記の通りです。
 ・頭に「&&」をつける。(1つでなく2つです)
 ・(マクロ変数名に使う)他のマクロ変数呼び出しは普通に「&」を頭につける

/* 呼び出したいマクロ変数 */
%let var_name = test;
/* 上記変数の呼び出しに使いたいマクロ変数 */
%let other = name;

/* 下記で「&var_name」を指定した形になる */
%put &&var_&other;
ログ

2-3. マクロ変数値と文字列を連結させる

下記コードのように、「&xxx」の後に「.」(ピリオド)を付けて、その続きに連結対象を記載すれば、マクロ変数値とその文字列を繋げた形を表現できます。

%let var_name = test;

/* 下記で「test_string」となる */
%put &var_name._string;
ログ

2-4. 上記2-2.を使って2-3.を実現する

本件も上記2-2.と2-3.それぞれの通りで原則は変わりません。
その原則を踏まえて下記のように実装すれば良いです。

/* 呼び出したいマクロ変数 */
%let var_name_1 = test;
/* 上記変数の呼び出しに使いたいマクロ変数 */
%let other_one = name;
%let other_two = 1;

/* 下記で「test_string」となる */
%put &&var_&other_one._&other_two.._string;
ログ

By clear

データエンジニア・機械学習・分析等を主とし、Webアプリ開発も行っているフリーランスです。