LoginSignup
1
0

More than 3 years have passed since last update.

【SAS】ods excel でエクセルのシート間区切り位置を設定する。

Last updated at Posted at 2019-04-07

SAS のアウトプットウインドウに表示される内容をエクセルに吐き出したい状況は割とよくある。

DDEや proc exportでデータセットの出力をすることができるが、先述のアウトプットウインドウに近い出力は期待できない。

ではどうするか。

ods excel を使う。

2019/3月時点ではベスト。

ただしods excelを使う時の壁があり、それはシートをどこで区切るかを明示しなければならないことだ。

ods excel file='パス\アウトプット先エクセル.xlsx'    
    options(
        sheet_interval = 'proc'
    );

proc print data=sashelp.class(obs=5);
run;

ods excel close;

上記のsheet_intervalの設定だと、proc printでデータセットをエクセルに吐き出した直後でシートが切り替わる。

また、
(SHEET_INTERVAL= 'BYGROUP' | 'PAGE' | 'PROC' | 'NONE' | 'NOW' | TABLE’)が選択できる。

しかし、これだと毎回シート切り替えポジションを考慮しなくてはならず、マクロでシート毎に異なるアウトプットをしたい時に対応できない。

ダミーテーブルでシート切り替えを行う。

妥協案を探して見た結果がこれ。

アウトプットウインドウに表示されないテーブルを置く。
トリック臭い感は否めないがもっとも楽な対応だと思う。

詳細はこちら(英語)→ ODS excel & multiple sheets

ods excel options(sheet_interval="none");
 ・
 ・
 ・

/* Add dummy table start */
ods excel options(sheet_interval="table");
ods exclude all;
data _null_;
file print;
put _all_;
run;
ods select all;
/* Add dummy table end */

ods excel options(sheet_interval="none");
  ・
  ・
  ・
  1. sheet_interval='table'でシート切り替えポジションをテーブルに指定。
  2. ods exclude all; でアウトプットウインドウへ表示をオフ。
  3. data _null_; から run; は実際には表示されなくなる。内容はぶっちゃけなんでもいい。
  4. テーブル自体は作成されるので、テーブル直後で次のシートに切り替えが有効になっている。
  5. ods select all; で再度アウトプットウインドウへの表示をオン。

これでダミーテーブル前後のods excelsheet_intervalの設定がなんであろうと、ダミーテーブルがシート間を分けるポジションとなる。

終わりに

このダミーテーブルをマクロ化して置くと便利。
これで晴れてマクロ化ができたのでめでたしめでたし、、な訳あるかい。

ods excelは現状ベストだけど、まだまだ十分な機能が揃っているとは思えない。

あと公式ドキュメントももう少し図やコード増やしてわかりやすくして欲しい、、。

SASェ、、、。

質問、間違いなどがあればコメントください。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0