目次
1.サンプルデータ
サンプルとして、Excelシートの指定した範囲をSASデータセット化するで作成した以下のSASデータセット「todofuken」を使用してみます。
2.展開例
1.略記法を使用しないパターン
引数varに出力対象変数を指定する基本的なパターンです。
%dde_out(
indata =todofuken,
var =code name population,
file =都道府県.xlsx,
sheet =都道府県,
top =4,
left =6
);
以下のように、データセットの変数値が開始行4、開始列6の位置を起点に出力されています。
数値にカンマや前ゼロを付与したい場合は、事前に、Excelシート側で書式設定をしておく必要があります。
2.略記法を使用するパターン
以下は数値変数を表す「_numeric_」を指定する展開例です。
%dde_out(
indata =todofuken,
var =_numeric_,
file =都道府県.xlsx,
sheet =都道府県,
top =4,
left =6
);
先ほどとは違い、数値変数のpopulationのみが出力されています。
この他にも、
_all_
_character_
char1-char2
code--population
char:
などの略記法も使用できます。
3.参考プログラム
以下は、参考プログラムになります。
右上のコピーボタンを押せば、プログラム全体をコピーできます。
%macro dde_out(indata=, var=, file=, sheet=, top=, left=);
%put --------------------------------------------------;
%put dde_out; /*SASデータセットの変数値をExcelシートに出力する*/
%put &=indata; /*出力対象データセットを指定(データセットオプションの指定可)*/
%put &=var; /*出力対象変数を指定(略記法で指定可)*/
%put &=file; /*出力先のエクセルファイル名を指定(拡張子必須)*/
%put &=sheet; /*出力先のシート名を指定*/
%put &=top; /*出力範囲の上端を指定*/
%put &=left; /*出力範囲の左端を指定*/
%put --------------------------------------------------;
/*データの読込*/
data _dde_out_data;
%if %length(&var.)>0 %then %do;
format &var.;
keep &var.;
%end;
set &indata.;
run;
/*変数情報の取得*/
proc contents data=_dde_out_data
out =_dde_out_cont(keep=name nobs varnum)
noprint
;
run;
/*入力データセットに保存されている変数順にソート*/
proc sort data=_dde_out_cont;
by varnum;
run;
/*出力範囲の下端と右端をローカルマクロ変数へ格納*/
data _null_;
set _dde_out_cont end=eof;
length otvar $32767.;
retain otvar;
otvar=catx(" ",otvar,name);
if eof;
call symputx("otvar",otvar);
call symputx("bottom",put(&top.+nobs-1,best.-l));
call symputx("right",put(&left.+_n_-1,best.-l));
run;
%if &top.<=&bottom. %then %do;
/*出力*/
filename xls dde "excel|\\[&file.]&sheet.!r&top.c&left.:r&bottom.c&right.";
data _null_;
set _dde_out_data;
file xls dde dsd dlm="09"x notab lrecl=1000000;
put &otvar.;
run;
filename xls clear;
/*セル位置をA1に戻す*/
filename xlssys dde "excel|system";
data _null_;
file xlssys;
put '[select("r1c1")]';
run;
filename xlssys clear;
%end;
/*不要データの削除*/
proc datasets lib=work noprint;
delete _dde_out:;
quit;
%mend dde_out;