【SAS】Excelの文字切れ対策

Excel文字切れ対策のめも SASバージョン
VBAでの文字切れ対策記事(2020年11月)のあと直ぐ書きたかったが、3年以上寝かせていた。

基本的な考え方はVBAでの文字切れ対策記事を参照。
cochineal19.hatenablog.com

%let WB=ファイル名.xlsx;
%let WS=シート名;
%let FONTJ=MS ゴシック; /* 日本語フォント */
%let FONTE=Times New Roman; /* 英語フォント */
%let FONTSIZE=10; /* フォントサイズ */
%let STROW=;  /* 開始行 */
%let STCOL=;  /* 開始列 */
%let ENROW=;  /* 終了行 */
%let ENCOL=;  /* 終了列 */
   
*-- フォントサイズを1pt大きくして高さを自動調整する ;
filename exe dde "excel|system";
data _null_;
  file exe;
  put %unquote(%bquote('[workbook.activate("[&WB.]&WS.")]'));
  put %unquote(%bquote('[select("r&STROW.c&STCOL.:r&ENROW.c&ENCOL.")]'));
  put %unquote(%bquote('[font.properties("&FONTJ.",,%eval(&FONTSIZE. + 1))]'));
  put %unquote(%bquote('[font.properties("&FONTE.",,%eval(&FONTSIZE. + 1))]'));
  put %unquote(%bquote('[row.height(,"r&STROW.c&STCOL.:r&ENROW.c&ENCOL.",,3)]')); 
  put '[select("r1c1")]';
  put '[a1.r1c1(false)]';
run;
 
*-- get.cell(17)で行の高さを算出する ;
filename exe dde "excel|system";
data _null_;
  file exe;
  put '[workbook.next()]';
  put '[workbook.insert(3)]';
  put '[workbook.name(,"macro")]';
run;
 
filename xmacro1 dde "excel|macro!c1" notab;
data _null_;
  length CMD $2000.;
  file xmacro1 ;
  do i = 1 to &ENROW.;
    CMD = cats("=formula(get.cell(17,'&WS.", "'!rc), rc[1])");
    put CMD;
  end;
  put '=halt(true)';
  put '!dde_flush';
  file exe;
  put '[run("macro!r1c1:r1c1")]';
run;
 
*-- 行の高さを取り込む;
filename xmacro2 dde "excel|macro!r1c2:r%eval(&ENROW.+10)c2" notab;
data _HEIGHT1;
  infile xmacro2 ;
  length ROWC $20;
  ROW  = _n_;
  ROWC = cats("r",vvalue(ROW),"c1");
  input HEIGHT;
  HEIGHT2 = ceil(HEIGHT/15) * 15;
  if HEIGHT2 > 405 then HEIGHT2 = 405;

  if ROW >= &STROW.;
run;
 
*-- コード生成(DDE);
proc sort data=_HEIGHT1; by HEIGHT2 ROW; run;
data _HEIGHT1;
  set _HEIGHT1;
  by _HEIGHT2 ROW;
  if first.HEIGHT2 then ID=0; else ID+1;
  GRP = int(ID/10);
run;

proc transpose data=_HEIGHT1 out=_HEIGHT2;
  by HEIGHT2 GRP;
  var ROWC;
run;

data _HEIGHT3;
  set _HEIGHT2;
  length RNG1 DDE1 $20000;
  RNG1 = catx(",", of COL:);
  DDE1 = cats("put '[select(""", strip(RNG1), """)][row.height(", vvalue(HEIGHT2), ")]';");
run;

*-- DDE実行(高さ調整);
proc sql noprint;
  select DDE1 into :DDE1 separated by ";" from _HEIGHT3;
quit;

filename exe dde "excel|system";
data _null_;
  file exe;
  put %unquote(%bquote('[workbook.activate("[&WB.]&WS.")]'));
  &DDE1.;
  put %unquote(%bquote('[select("r&STROW.c&STCOL.:r&ENROW.c&ENCOL.")]'));
  put %unquote(%bquote('[font.properties("&FONTJ.",,%eval(&FONTSIZE.))]'));
  put %unquote(%bquote('[font.properties("&FONTE.",,%eval(&FONTSIZE.))]'));
  put '[select("r1c1")]';

  %let ERR=ERR;
  put %unquote(%bquote('[&ERR.OR(false)]'));
  put %unquote(%bquote('[workbook.delete("macro")]'));
  put %unquote(%bquote('[&ERR.OR(true)]'));
run;
本ブログは個人メモです。 本ブログの内容によって生じた損害等の一切の責任を負いかねますのでご了承ください。