Step by Stepで学ぶSASマクロ

2K Views

April 15, 25

スライド概要

[第11回大阪sas勉強会]

profile-image

SAS言語を中心として,解析業務担当者・プログラマなのコミュニティを活性化したいです

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

2025年4月16日 Step by Stepで学ぶSASマクロ イーピーエス株式会社 角 春佳

2.

目次 目次 1. 本発表の目的 2. 本発表で用いる検証プログラムの紹介 3. 振り返り: プログラムの処理ステップ 4. マクロを含むプログラムの処理ステップ 5. まとめ 6. 参考資料 Copyright©EPS All rights reserved. 2

3.

1. 本発表の目的 • 自己紹介 • 2024年4月イーピーエス株式会社入社 • SAS歴1年 • 本発表の目的 • SAS歴1年の私にはSASマクロの挙動が理解できなかった • SASマクロの解決(resolve), ソースコードの実行(execute)について 挙動を調べたので報告する Copyright©EPS All rights reserved. 3

4.

2. 本発表で用いる検証プログラムの紹介 検証プログラム その1 ①, ②でマクロ変数val はどう変化するか? ① ② Copyright©EPS All rights reserved. 私の予想 ①: val = 100 ②: val = 100 理由 条件が常に成立しないため、 doブロック内のコードは処理 されないと考えたから。 実行結果 ①: val = 100 ②: val = 0 4

5.

2. 本発表で用いる検証プログラムの紹介 検証プログラム その2 左のプログラムは正常に動作するか? 私の予想 正常に動作する 理由 マクロ内で数値演算を行うには %sysevalfが必要と考えたから。 実行結果 正常に動作せずエラーとなる %sysevalf: テキストを演算式として評価するマクロ関数 Copyright©EPS All rights reserved. 5

6.

3. 振り返り: プログラムの処理ステップ ソース コード Input Stack ソースコードのコンパイル, 実行(Execute) マクロのコードの解決(Resolve) 解決(Resolve) 実行(Execute) Compiler Word Scanner Macro Processor Symbol Table Macro Catalog 実行 ※SASはproprietaryな製品のため内部構造は非公開です。 公式ドキュメントや検証プログラムに基づき上記の処理フローと推測しています。 Copyright©EPS All rights reserved. 6

7.

3. 振り返り: プログラムの処理ステップ ソースコード wk01 number val 1 1 10 2 2 0 Input Stack data wk02; set wk01; if val = 0 then delete; run; data wk02; set wk01; if val = 0 then delete; run; Macro Processor Compiler data Copyright©EPS All rights reserved. Word Scanner Symbol Table Macro Catalog data 7

8.

3. 振り返り: プログラムの処理ステップ ソースコード wk01 number val 1 1 10 2 2 0 Input Stack data wk02; set wk01; if val = 0 then delete; run; data wk02 wk02; set wk01; if val = 0 then delete; run; Macro Processor Compiler data wk02 Copyright©EPS All rights reserved. Word Scanner Symbol Table Macro Catalog wk02 8

9.

3. 振り返り: プログラムの処理ステップ ソースコード wk01 number data wk02; set wk01; if val = 0 then delete; run; val 1 1 10 2 2 0 Input Stack data wk02; set wk01; if val = 0 then delete; run; Macro Processor Compiler Compiler Word Scanner Symbol Table Macro Catalog data wk02; data wk02 set wk01; if val = 0 then delete; run; 実行(execute) wk02 number 1 1 Copyright©EPS All rights reserved. val 10 9

10.

再掲 ソース コード Input Stack ソースコードのコンパイル, 実行(Execute) マクロのコードの解決(Resolve) 解決(Resolve) 実行(Execute) Compiler Word Scanner Macro Processor Symbol Table Macro Catalog 実行 ※SASはproprietaryな製品のため内部構造は非公開です。 公式ドキュメントや検証プログラムに基づき上記の処理フローと推測しています。 Copyright©EPS All rights reserved. 10

11.

再掲 検証プログラム その1 ①, ②でマクロ変数val はどう変化するか? ① ② Copyright©EPS All rights reserved. 私の予想 ①: val = 100 ②: val = 100 理由 条件が常に偽(0)であるため、 doブロック内のコードは処理 されないと考えたから。 実行結果 ①: val = 100 ②: val = 0 11

12.

4. マクロを含むプログラムの処理ステップ 検証その1 ソースコード Input Stack %let val = 100; data _null_; %put &=val.; if 0 then do; %let val = 0; end; %put &=val.; run; %let %let val = 100; data _null_; %put &=val.; if 0 then do; %let val = 0; end; %put &=val.; run; Compiler Word Scanner % Copyright©EPS All rights reserved. Macro Processor Processor Macro Symbol Table val Macro Catalog 100 12

13.

4. マクロを含むプログラムの処理ステップ 検証その1 ソースコード Input Stack %let val = 100; data _null_; %put &=val.; if 0 then do; %let val = 0; end; %put &=val.; run; %let val = 100; data _null_; %put &=val.; if 0 then do; %let val = 0; end; %put &=val.; run; Compiler data Copyright©EPS All rights reserved. Word Scanner data Macro Processor Symbol Table val Macro Catalog 100 13

14.

4. マクロを含むプログラムの処理ステップ 検証その1 ソースコード Input Stack %let val = 100; data _null_; %put &=val.; if 0 then do; %let val = 0; end; %put &=val.; run; %let val = 100; data _null_; %put &=val.; if 0 then do; %let val = 0; end; %put &=val.; run; Compiler data _null_ Copyright©EPS All rights reserved. Word Scanner _null_ Macro Processor Symbol Table val Macro Catalog 100 14

15.

4. マクロを含むプログラムの処理ステップ 検証その1 ソースコード Input Stack %let val = 100; data _null_; %put &=val.; if 0 then do; %let val = 0; end; %put &=val.; run; %let val = 100; data _null_;; %put &=val.; if 0 then do; %let val = 0; end; %put &=val.; run; Compiler data _null_; Copyright©EPS All rights reserved. Word Scanner ; Macro Processor Symbol Table val Macro Catalog 100 15

16.

4. マクロを含むプログラムの処理ステップ 検証その1 ソースコード Input Stack %let val = 100; data _null_; %put &=val.; if 0 then do; %let val = 0; end; %put &=val.; run; %let val = 100; data _null_; %put %put &=val.; if 0 then do; %let val = 0; end; %put &=val.; run; Compiler data _null_; Copyright©EPS All rights reserved. Word Scanner % Macro Macro Processor Processor Symbol Table val Macro Catalog 100 16

17.

4. マクロを含むプログラムの処理ステップ 検証その1 ソースコード Input Stack %let val = 100; data _null_; %put &=val.; if 0 then do; %let val = 0; end; %put &=val.; run; %let val = 100; data _null_; %put &=val.; if 0 then do; %let val = 0; end; %put &=val.; run; Compiler data _null_; Word Scanner % Macro Macro Processor Processor Symbol Table val Macro Catalog 100 Log val=100 Copyright©EPS All rights reserved. 17

18.

4. マクロを含むプログラムの処理ステップ 検証その1 ソースコード Input Stack %let val = 100; data _null_; %put &=val.; if 0 then do; %let val = 0; end; %put &=val.; run; %let val = 100; data _null_; %put &=val.; if 0 then do; %let val = 0; end; %put &=val.; run; Compiler data _null_; if 0 then do; Word Scanner Macro Processor Symbol Table val Macro Catalog 100 Log val=100 Copyright©EPS All rights reserved. 18

19.

4. マクロを含むプログラムの処理ステップ 検証その1 ソースコード Input Stack %let val = 100; data _null_; %put &=val.; if 0 then do; %let val = 0; end; %put &=val.; run; %let val = 100; data _null_; %put &=val.; if 0 then do; %let val = 0; end; %put &=val.; run; Compiler data _null_; if 0 then do; Word Scanner % Macro Macro Processor Processor Symbol Table val Macro Catalog 100 Log val=100 Copyright©EPS All rights reserved. 19

20.

4. マクロを含むプログラムの処理ステップ 検証その1 ソースコード Input Stack %let val = 100; data _null_; %put &=val.; if 0 then do; %let val = 0; end; %put &=val.; run; %let val = 100; data _null_; %put &=val.; if 0 then do; %let val = 0; end; %put &=val.; run; Compiler data _null_; if 0 then do; Word Scanner % Macro Macro Processor Processor Symbol Table val Macro Catalog 100 0 Log val=100 Copyright©EPS All rights reserved. 20

21.

4. マクロを含むプログラムの処理ステップ 検証その1 ソースコード Input Stack %let val = 100; data _null_; %put &=val.; if 0 then do; %let val = 0; end; %put &=val.; run; %let val = 100; data _null_; %put &=val.; if 0 then do; %let val = 0; end; %put &=val.; run; Compiler data _null_; if 0 then do; end; Word Scanner Macro Processor Symbol Table val Macro Catalog 0 Log val=100 Copyright©EPS All rights reserved. 21

22.

4. マクロを含むプログラムの処理ステップ 検証その1 ソースコード Input Stack %let val = 100; data _null_; %put &=val.; if 0 then do; %let val = 0; end; %put &=val.; run; %let val = 100; data _null_; %put &=val.; if 0 then do; %let val = 0; end; %put &=val.; run; Compiler data _null_; if 0 then do; end; Word Scanner Macro Macro Processor Processor Symbol Table val Macro Catalog 0 % Log Copyright©EPS All rights reserved. val=100 val=0 22

23.

4. マクロを含むプログラムの処理ステップ 検証その1 ソースコード Input Stack %let val = 100; data _null_; %put &=val.; if 0 then do; %let val = 0; end; %put &=val.; run; %let val = 100; data _null_; %put &=val.; if 0 then do; %let val = 0; end; %put &=val.; run; Compiler data _null_; if 0 then do; end; run; Word Scanner Macro Processor Symbol Table val Macro Catalog 0 Log Copyright©EPS All rights reserved. val=100 val=0 23

24.

4. マクロを含むプログラムの処理ステップ 検証その1 ソースコード Input Stack %let val = 100; data _null_; %put &=val.; if 0 then do; %let val = 0; end; %put &=val.; run; %let val = 100; data _null_; %put &=val.; if 0 then do; %let val = 0; end; %put &=val.; run; Compiler data _null_; if 0 then do; end; run; 実行(execute) 出力なし Copyright©EPS All rights reserved. Word Scanner Macro Processor Symbol Table val Macro Catalog 0 Log val=100 val=0 24

25.

再掲 検証プログラム その2 左のプログラムは正常に動作するか? 私の予想 正常に動作する 理由 マクロ内で数値演算を行うには %sysevalfが必要と考えたから。 実行結果 正常に動作せずエラーとなる %sysevalf: テキストを演算式として評価するマクロ関数 Copyright©EPS All rights reserved. 25

26.

4. マクロを含むプログラムの処理ステップ 検証その2 Input Stack ソースコード %let pi = 3.1415; %macro circle(r); %let area = %sysevalf(&r*&r*&pi); &area; %mend circle; %let pi = 3.1415; %macro circle(r); %let area = %sysevalf(&r*&r*&pi); &area; %mend circle; data _null_; length x area 8.; do x = 0 to 5; area = %circle(x); put area; end; run; data _null_; length x area 8.; do x = 0 to 5; area = %circle(x); put area; end; run; Macro Processor Compiler Copyright©EPS All rights reserved. Word Scanner Symbol Table Macro Catalog 26

27.

4. マクロを含むプログラムの処理ステップ 検証その2 Input Stack data _null_; length x area 8.; do x = 0 to 5; area = %circle(x); put area; end; run; % let pi = 3.1415; %let %macro circle(r); %let area = %sysevalf(&r*&r*&pi); &area; %mend circle; Macro Macro Processor Processor Compiler Word Scanner % Copyright©EPS All rights reserved. Symbol Table pi Macro Catalog 3.1415 27

28.

4. マクロを含むプログラムの処理ステップ 検証その2 Input Stack data _null_; length x area 8.; do x = 0 to 5; area = %circle(x); put area; end; run; %let pi = 3.1415; %macro % circle(r); %let area = %sysevalf(&r*&r*&pi); &area; %mend circle; Macro Macro Processor Processor Compiler Word Scanner % Copyright©EPS All rights reserved. Symbol Table pi 3.1415 Macro Catalog Macro Catalog %macro circle(r); %let area = %sysevalf(&r*&r*&pi); &area; %mend circle; 28

29.

4. マクロを含むプログラムの処理ステップ 検証その2 Input Stack data _null_; length x area 8.; do x = 0 to 5; area = %circle(x); put area; end; run; %let pi = 3.1415; %macro circle(r); %let area = %sysevalf(&r*&r*&pi); &area; %mend circle; Macro Processor Compiler data Copyright©EPS All rights reserved. Word Scanner data Symbol Table pi 3.1415 Macro Catalog %macro circle(r); %let area = %sysevalf(&r*&r*&pi); &area; %mend circle; 29

30.

4. マクロを含むプログラムの処理ステップ 検証その2 Input Stack data _null_; length x area 8.; do x = 0 to 5; area = %circle(x); put area; end; run; %let pi = 3.1415; %macro circle(r); %let area = %sysevalf(&r*&r*&pi); &area; %mend circle; Macro Processor Compiler data _null_; length x area 8.; do x = 0 to 5; area = Copyright©EPS All rights reserved. Word Scanner Symbol Table pi 3.1415 Macro Catalog %macro circle(r); %let area = %sysevalf(&r*&r*&pi); &area; %mend circle; 30

31.

4. マクロを含むプログラムの処理ステップ 検証その2 Input Stack data _null_; length x area 8.; do x = 0 to 5; %circle(x); area = %circle(x); put area; end; run; %let pi = 3.1415; %macro circle(r); %let area = %sysevalf(&r*&r*&pi); &area; %mend circle; Macro Macro Processor Processor Compiler data _null_; length x area 8.; do x = 0 to 5; area = Copyright©EPS All rights reserved. Word Scanner % Symbol Table pi 3.1415 Macro Catalog %macro circle(r); %let area = %sysevalf(&r*&r*&pi); &area; %mend circle; 31

32.

4. マクロを含むプログラムの処理ステップ 検証その2 Input Stack data _null_; length x area 8.; do x = 0 to 5; area = %circle(x); put area; end; run; %let pi = 3.1415; %macro circle(r); %let area = %sysevalf(&r*&r*&pi); &area; %mend circle; Macro Macro Processor Processor Compiler data _null_; length x area 8.; do x = 0 to 5; area = Word Scanner % Symbol Table pi 3.1415 Macro Catalog %macro circle(r); %let area = %sysevalf(&r*&r*&pi); &area; %mend circle; Circle Symbol Table r Copyright©EPS All rights reserved. x 32

33.

4. マクロを含むプログラムの処理ステップ 検証その2 Input Stack data _null_; length x area 8.; do x = 0 to 5; area = % let area = %sysevalf %let %sysevalf(&r*&r*&pi); &area;; put area; end; run; %let pi = 3.1415; %macro circle(r); %let area = %sysevalf(&r*&r*&pi); &area; %mend circle; Macro Macro Processor Processor Compiler data _null_; length x area 8.; do x = 0 to 5; area = Word Scanner % Symbol Table pi 3.1415 備考:Resolveの過程を説明するためMacro Catalog内のmacro定義が そのままInput Stackにコピーされると書いています。 正確にはResolveされた結果がInput Stackに入ります。実行結果における差異はありません。 Copyright©EPS All rights reserved. Macro Catalog Macro Catalog %macro circle(r); %let area = %sysevalf(&r*&r*&pi); &area; %mend circle; Circle Symbol Table r x 33

34.

4. マクロを含むプログラムの処理ステップ 検証その2 Input Stack data _null_; length x area 8.; do x = 0 to 5; area = %let area = %sysevalf(&r*&r*&pi); &r &area;; put area; end; run; %let pi = 3.1415; %macro circle(r); %let area = %sysevalf(&r*&r*&pi); &area; %mend circle; Macro Macro Processor Processor Compiler data _null_; length x area 8.; do x = 0 to 5; area = Word Scanner % Symbol Table pi 3.1415 Macro Catalog Macro Catalog %macro circle(r); %let area = %sysevalf(&r*&r*&pi); &area; %mend circle; Circle Symbol Table r Copyright©EPS All rights reserved. x 34

35.

4. マクロを含むプログラムの処理ステップ 検証その2 Input Stack data _null_; length x area 8.; do x = 0 to 5; area = %let area = %sysevalf(x*&r*&pi); &r &area;; put area; end; run; %let pi = 3.1415; %macro circle(r); %let area = %sysevalf(&r*&r*&pi); &area; %mend circle; Macro Macro Processor Processor Compiler data _null_; length x area 8.; do x = 0 to 5; area = Word Scanner % Symbol Table pi 3.1415 Macro Catalog Macro Catalog %macro circle(r); %let area = %sysevalf(&r*&r*&pi); &area; %mend circle; Circle Symbol Table r Copyright©EPS All rights reserved. x 35

36.

4. マクロを含むプログラムの処理ステップ 検証その2 Input Stack data _null_; length x area 8.; do x = 0 to 5; area = %let area = %sysevalf(x*x*&pi); &pi &area;; put area; end; run; %let pi = 3.1415; %macro circle(r); %let area = %sysevalf(&r*&r*&pi); &area; %mend circle; Macro Macro Processor Processor Compiler data _null_; length x area 8.; do x = 0 to 5; area = Word Scanner % Symbol Table pi 3.1415 Macro Catalog Macro Catalog %macro circle(r); %let area = %sysevalf(&r*&r*&pi); &area; %mend circle; Circle Symbol Table r Copyright©EPS All rights reserved. x 36

37.

4. マクロを含むプログラムの処理ステップ 検証その2 Input Stack data _null_; length x area 8.; do x = 0 to 5; area = %let area = %sysevalf(x*x* 3.1415); &area;; put area; end; run; %let pi = 3.1415; %macro circle(r); %let area = %sysevalf(&r*&r*&pi); &area; %mend circle; Macro Macro Processor Processor Compiler data _null_; length x area 8.; do x = 0 to 5; area = Word Scanner % Symbol Table pi 3.1415 ERROR: 数値演算項が必要とされる%EVAL関数に文字演算項が見つかりました エラーが出る理由: マクロの解決(Resolve)の段階でマクロ変数rには 文字値xが与えられており数値演算ができないため Copyright©EPS All rights reserved. Macro Catalog Macro Catalog %macro circle(r); %let area = %sysevalf(&r*&r*&pi); &area; %mend circle; Circle Symbol Table r x 37

38.

4. マクロを含むプログラムの処理ステップ 検証その2 正常に動かすには %sysevalfを消す Input Stack data _null_; length x area 8.; do x = 0 to 5; area = %let area = %sysevalf( %sysevalf(x*x* 3.1415); ) &area;; put area; end; run; %let pi = 3.1415; %macro circle(r); %let area = %sysevalf(&r*&r*&pi); &area; %mend circle; Macro Macro Processor Processor Compiler data _null_; length x area 8.; do x = 0 to 5; area = Word Scanner % Symbol Table pi 3.1415 Macro Catalog Macro Catalog %macro circle(r); %let area = %sysevalf( %sysevalf(&r*&r*&pi); ) &area; %mend circle; Circle Symbol Table Copyright©EPS All rights reserved. r area x x*x*3.1415 38

39.

4. マクロを含むプログラムの処理ステップ 検証その2 正常に動かすには %sysevalfを消す Input Stack data _null_; length x area 8.; do x = 0 to 5; area = %let area = %sysevalf(x*x* 3.1415); &area;; &area; put area; end; run; %let pi = 3.1415; %macro circle(r); %let area = %sysevalf(&r*&r*&pi); &area; %mend circle; Macro Macro Processor Processor Compiler data _null_; length x area 8.; do x = 0 to 5; area = Word Scanner & Symbol Table pi 3.1415 Macro Catalog Macro Catalog %macro circle(r); %let area = %sysevalf(&r*&r*&pi); &area; %mend circle; Circle Symbol Table Copyright©EPS All rights reserved. r area x x*x*3.1415 39

40.

4. マクロを含むプログラムの処理ステップ 検証その2 正常に動かすには %sysevalfを消す Input Stack data _null_; length x area 8.; do x = 0 to 5; area = %let area = %sysevalf(x*x* 3.1415); x*x*3.1415; put area; end; run; %let pi = 3.1415; %macro circle(r); %let area = %sysevalf(&r*&r*&pi); &area; %mend circle; Macro Macro Processor Processor Compiler data _null_; length x area 8.; do x = 0 to 5; area = Word Scanner x*x*3.1415 Symbol Table pi 3.1415 Macro Catalog %macro circle(r); %let area = %sysevalf(&r*&r*&pi); &area; %mend circle; Circle Symbol Table Copyright©EPS All rights reserved. r area x x*x*3.1415 40

41.

4. マクロを含むプログラムの処理ステップ 検証その2 正常に動かすには %sysevalfを消す Input Stack data _null_; length x area 8.; do x = 0 to 5; area = %let area = %sysevalf(x*x* 3.1415); x*x*3.1415; put area; end; run; %let pi = 3.1415; %macro circle(r); %let area = %sysevalf(&r*&r*&pi); &area; %mend circle; Macro Processor Compiler data _null_; length x area 8.; do x = 0 to 5; area = x*x*3.1415 Word Scanner Symbol Table pi 3.1415 Macro Catalog Macro Catalog %macro circle(r); %let area = %sysevalf(&r*&r*&pi); &area; %mend circle; Circle Symbol Table Copyright©EPS All rights reserved. r area x x*x*3.1415 41

42.

4. マクロを含むプログラムの処理ステップ 検証その2 正常に動かすには %sysevalfを消す Input Stack data _null_; length x area 8.; do x = 0 to 5; area = %let area = %sysevalf(x*x* 3.1415); x*x*3.1415;; put area; end; run; %let pi = 3.1415; %macro circle(r); %let area = %sysevalf(&r*&r*&pi); &area; %mend circle; Macro Processor Compiler data _null_; length x area 8.; do x = 0 to 5; area = x*x*3.1415 ; Word Scanner ; Symbol Table pi 3.1415 Macro Catalog Macro Catalog %macro circle(r); %let area = %sysevalf(&r*&r*&pi); &area; %mend circle; Circle Symbol Table Copyright©EPS All rights reserved. r area x x*x*3.1415 42

43.

4. マクロを含むプログラムの処理ステップ 検証その2 正常に動かすには %sysevalfを消す Input Stack data _null_; length x area 8.; do x = 0 to 5; area = %let area = %sysevalf(x*x* 3.1415); x*x*3.1415; put area; end; run; %let pi = 3.1415; %macro circle(r); %let area = %sysevalf(&r*&r*&pi); &area; %mend circle; Macro Processor Compiler data _null_; length x area 8.; do x = 0 to 5; area = x*x*3.1415 ; put area; end; run; Copyright©EPS All rights reserved. Word Scanner Symbol Table pi データセット 出力なし ログ 3.1415 Macro Catalog Macro Catalog %macro circle(r); %let area = %sysevalf(&r*&r*&pi); &area; %mend circle; Circle Symbol Table r area x x*x*3.1415 43

44.

5. まとめ • ソースコードの実行(Execute)とマクロのコードの解決(Resolve)は別の処理である • データステップ中にマクロのコードがある場合,最初にマクロのコードが解決(Resolve)される • 解決(Resolve)されたコードに対してコンパイル,実行(Execute)が行われる ソース コード ソースコードのコンパイル, 実行(Execute) Input Stack マクロのコードの解決(Resolve) 解決(Resolve) 実行(Execute) Compiler Word Scanner Macro Processor Symbol Table Macro Catalog 実行 ※SASはproprietaryな製品のため内部構造は非公開です。公式ドキュメントや検証プログラムに基づき上記の処理フローと推測しています。 Copyright©EPS All rights reserved. 44

45.

6. 参考文献 • Michele M. Burlew. (2017) SAS Macro Programming Made Easy Second Edition SAS Press Series. • SAS Institute Inc. (2025) SAS マクロ言語: リファレンス [online]https://documentation.sas.com/api/collections/pgmsascdc /v_057/docsets/mcrolref/content/mcrolref.pdf?locale=ja#namedd est=titlepage Copyright©EPS All rights reserved. 45

46.

経営理念 Copyright©EPS All rights reserved. 46