Excel操作 SASマクロ

【SAS】SASデータセットの変数値をExcelシートに出力する(DDE)

1.サンプルデータ

サンプルとして、Excelシートの指定した範囲をSASデータセット化するで作成した以下のSASデータセット「todofuken」を使用してみます。
dde_in_informat

 

2.展開例

1.略記法を使用しないパターン

引数varに出力対象変数を指定する基本的なパターンです。

%dde_out(
	indata	=todofuken, 
	var		=code name population,
	file	=都道府県.xlsx,
	sheet	=都道府県, 
	top		=4, 
	left	=6
);

以下のように、データセットの変数値が開始行4、開始列6の位置を起点に出力されています。
dde_out
数値にカンマや前ゼロを付与したい場合は、事前に、Excelシート側で書式設定をしておく必要があります。
 

2.略記法を使用するパターン

以下は数値変数を表す「_numeric_」を指定する展開例です。

%dde_out(
	indata	=todofuken, 
	var		=_numeric_,
	file	=都道府県.xlsx,
	sheet	=都道府県, 
	top		=4, 
	left	=6
);

先ほどとは違い、数値変数のpopulationのみが出力されています。
dde_out_ryakukihou
この他にも、
_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;