Excel操作 SASマクロ

【SAS】Excelシートをコピー(複製)する(DDE)

1.サンプルファイル

サンプルとして、Excelファイルを開くで開いた以下ファイルのシート「都道府県」をコピーしてみます。
open_excel

 

2.展開例

1.コピー元を残すパターン

引数fileは省略可能ですが、その場合はアクティブファイルが対象となり、そのファイル内に引数baseで指定するシート名が存在しないとエラーになります。

%dde_copy_sheet(
	file=都道府県.xlsx,
	base=都道府県, 
	copy=都道府県2, 
	del=
);

以下のように、コピー元の「都道府県」を残したまま、「都道府県2」がコピーされています。
dde_sheet_copy

 

2.コピー元を削除するパターン

先ほどと違って、コピー元を削除する展開例です。
引数delで「Y」を指定して下さい。

%dde_copy_sheet(
	file=都道府県.xlsx,
	base=都道府県, 
	copy=都道府県2, 
	del=Y
);

以下のように、コピー元の「都道府県」は削除され、「都道府県2」のみになっています。
dde_sheet_copy_del
 

3.参考プログラム

以下は、参考プログラムになります。
右上のコピーボタンを押せば、プログラム全体をコピーできます。

%macro dde_copy_sheet(file=, base=, copy=, del=);
%put --------------------------------------------------;
%put dde_copy_sheet;/*Excelシートをコピー(複製)する*/
%put &=file;		/*対象ファイルを指定(省略した場合はアクティブファイルが対象となる)*/
%put &=base;		/*コピー元のシート名を指定*/
%put &=copy;		/*コピー後のシート名を指定*/
%put &=del;			/*コピー元のシートを削除する場合はYを指定*/
%put --------------------------------------------------;

	/*シート「macro1(ファイルを閉じずに実行するとmacro2、macro3...とカウントアップしていく)」を挿入し、「macro」にリネーム*/
	filename xlssys dde "excel|system";
	data _null_;
		file xlssys;
		%if %length(&file.)>0 %then %do;
			put "[activate(""&file."")]";
		%end;
		put '[workbook.insert(3)]';
		put '[workbook.name(,"macro")]';
	run;

	/*シート「macro」へのコマンド入力*/
	filename xlsmacro dde "excel|macro!r1c1:r100c1";
	data _null_;
		file xlsmacro lrecl=3000 dde notab dsd dlm="09"x;
		length cmd $1024.;
		cmd='=workbook.copy("'||trim("&base")||'",get.document(88),get.workbook(4,get.document(88))+1)';
		put cmd;
		cmd='=workbook.name("'||trim("&base")||' (2)","'||trim("&copy")||'")';
		put cmd;
		put "=return()";
		put '!dde_flush';
	run;
	filename xlsmacro clear;

	/*実行及び不要シートの削除*/
	data _null_;
		file xlssys;
		
		put '[run("macro!r1c1")]';
		put '[error(false)]';
		put '[workbook.delete("macro")]';

		%if %upcase(&del.)=Y %then %do;
			length cmd $1024.;
			cmd='[workbook.delete("'||trim("&base")||'")]';
			put cmd;
		%end;
	run;
	filename xlssys clear;

%mend dde_copy_sheet;