概要
・xlsxファイルを読み込みます。
・DDEを利用します。
・DDEはこの記事執筆時点でとても古い技術です(1980年代)。
・環境を選びます。
・infileステートメントを使います。
・注意事項は最下部で。
コード
* 読み込むExcelファイルを指定;
%let path = C:\Users\xxxx\Documents;
%let exfile = sample.xlsx;
%let tgtsheet = Sheet1;
* Excelファイルを開く;
%sysexec "&path.\&exfile.";
* エクセルの起動待ち(状況に応じて任意に変更する);
data _null_;
x = sleep(10);
run;
* ExcelシートをDDE経由で読み込み;
filename EXL_DDE dde "Excel|[&exfile.]&tgtsheet.!r1c1:r100c20";
data IN_020_EX;
length VAR1 - VAR20 $100;
infile EXL_DDE notab dlm = "09"x dsd missover lrecl = 30000 firstobs = 2;
input VAR1 - VAR20;
run;
* Excelを閉じる;
filename AAA dde "excel|system" ;
data _NULL_;
file AAA;
put "[close()]";
run;
* リソース解放;
filename EXL_DDE clear;
filename AAA clear;
ポイント
- %sysexec でExcelファイルを開き、
- filenameで、SASから起動中のExcelの指定シート・指定範囲へDDE接続し、
- infileでタブ区切り(dlm=”09″x)のテキストとして読み込む。
- Excel終了は excel|system にコマンドを送る。
背景事情
CSVファイルはinfileでシンプルに読み込めます。
では、同じようにExcel(.xlsx)をinfileで読めるのか?という疑問がよくあります。
結論から言えば、xlsxファイルそのものはinfileでは読めません。
なぜなら、xlsxは内部的にZIP圧縮されたXMLファイル群であり、テキストファイルではないからです。
拡張子を.zipに変えると解凍でき、中身はXMLのテキストですが、人間やSASが直接扱うには面倒な構造です。
しかし、例外的に DDE(Dynamic Data Exchange)を利用することで「Excelが展開したシート内容」をinfileで読み込むことは可能です。
この記事ではその方法の紹介をしています。
DDEは古いけど現場で残っている理由
安定しているから。
DDEはたしかに古い技術ですが、
・大きなファイルでも落ちにくい。
・数値と文字が混ざる列でも欠損化しない。
といった安定性があり、現場では今でも普通に使われています。
注意事項
- Windows限定(Excel必須、Linux/Unixでは不可)。
- SASとExcelのビット数一致が必要(64bit同士など)。
- Excelの状態に依存:保存確認ダイアログなどが出ると止まる。
- 文字コード問題:Unicode SAS環境では日本語が文字化けする場合あり。
- サーバー不可:SAS StudioやSAS Viyaでは使えない。

コメント