«Сохранить как» и «Закрыть файл» без использования макроса - PullRequest
3 голосов
/ 19 ноября 2011

У меня обычно есть код макроса sas, который автоматически запускает макросы «Сохранить как» и «Закрыть файл» в таблице Excel при запуске кода sas и после заполнения данных в файл Excel.

ПроблемаУ меня есть файл Excel, в котором у меня сейчас есть определенные макросы, которые я не могу редактировать, потому что они защищены паролем, и я не могу добавить в них макрос «Сохранить как» и «Закрыть файл».Есть ли способ напрямую «Сохранить как» и «Закрыть файл» с помощью sas и без использования макроса.

1 Ответ

4 голосов
/ 19 ноября 2011

Конечно, можно. Вы можете использовать DDE для достижения этой цели. Ниже приведены 3 макроса, которые должны делать именно то, что вы просите. Добавьте их в свою библиотеку макросов автоматического вызова SAS:

/******************************************************************************
** PROGRAM:  MACRO.DDE_SAVE_AND_CLOSE.SAS
**
** DESCRIPTION: SAVES THE CURRENT EXCEL FILE AND THEN CLOSES IT.  IF THE FILE
**              ALREADY EXISTS IT WILL BE OVERWRITTEN.
**
** PARAMETERS: iSAVEAS: THE DESTINATION FILENAME TO SAVE TO.
**             iType  : (OPTIONAL. DEFAULT=BLANK). 
**                      BLANK = XL DEFAULT SAVE TYPE
**                          1 = XLS DOC - OLD SCHOOL! PRE OFFICE 2007?
**                         44 = HTML - PRETTY COOL! CHECK IT OUT... 
**                         51 = XLSX DOC - OFFICE 2007 ONWARDS COMPATIBLE?
**                         57 = PDF
** 
** NOTES:  IF YOU ARE GETTING A DDE ERROR WHEN RUNNING THIS MACRO THEN DOUBLE
**         CHECK YOU HAVE PERMISSIONS TO SAVE WHERE YOU ARE TRYING TO SAVE THE
**         FILE.
** 
*******************************************************************************
** VERSION:
** 1.0 ON: 01APR10 BY: RP
**     CREATED.  
** 1.1 ON: 19MAY10 BY: RP
**     ADDED ITYPE OPTION.
** 1.2 ON: 20JUL10 BY: RP
**     DELAYED TURNING ERROR BACK ON AS WAS GETTING UNNECESSARY ERRORS IN 
**     OFFICE07
** 1.3 ON: 17AUG10 BY: RP
**     CHANGED TO FILE. CLOSE AS IT WOULD CLOSE TWO WORKBOOKS BEFORE.
** 1.4 ON: 21JUL11 BY: RP
**     STOPPED E-R-R-O-R LITERAL FROM SHOWING IN LOG
******************************************************************************/

%macro dde_save_and_close(iSaveAs=,iType=);
  %local iDocTypeClause;

  %let iDocTypeClause=;
  %if "&iType" ne "" %then %do;
    %let iDocTypeClause=,&iType;
  %end;

  filename cmdexcel dde 'excel|system';
  data _null_;
    length str_line $200;
    file cmdexcel;

    put '[error(false)]';
    put "%str([save.as(%"&iSaveAs%"&iDocTypeClause)])";
    put '[file.close(0)]';

    str_line = cats("[e","rror(true)]");
    put str_line;
  run;
  filename cmdexcel clear;

%mend;
/*%dde_save_and_close(iSaveAs=d:\rrobxltest, iType=44);*/


/******************************************************************************
** PROGRAM:  MACRO.DDE_SAVE_AS.SAS
**
** DESCRIPTION: SAVES THE CURRENT EXCEL FILE.  IF THE FILE
**              ALREADY EXISTS IT WILL BE OVERWRITTEN.
**
** PARAMETERS: iSAVEAS: THE DESTINATION FILENAME TO SAVE TO.
**             iType  : (OPTIONAL. DEFAULT=BLANK). 
**                      BLANK = XL DEFAULT SAVE TYPE
**                          1 = XLS DOC - OLD SCHOOL! PRE OFFICE 2007?
**                         44 = HTML - PRETTY COOL! CHECK IT OUT... 
**                         51 = XLSX DOC - OFFICE 2007 ONWARDS COMPATIBLE?
**                         57 = PDF
** 
** NOTES:  IF YOU ARE GETTING A DDE ERROR WHEN RUNNING THIS MACRO THEN DOUBLE
**         CHECK YOU HAVE PERMISSIONS TO SAVE WHERE YOU ARE TRYING TO SAVE THE
**         FILE.
** 
*******************************************************************************
** VERSION:
** 1.0 ON: 01APR10 BY: RP
**     CREATED.  
******************************************************************************/

%macro dde_save_as(iSaveAs=,iType=);
  %local iDocTypeClause;

  %let iDocTypeClause=;
  %if "&iType" ne "" %then %do;
    %let iDocTypeClause=,&iType;
  %end;

  filename cmdexcel dde 'excel|system';
  data _null_;
    length str_line $200;
    file cmdexcel;
    put '[error(false)]';
    put "%str([save.as(%"&iSaveAs%"&iDocTypeClause)])";
    str_line = cats("[e","rror(true)]");
    put str_line;
  run;
  filename cmdexcel clear;

%mend;
/*%dde_save_as(iSaveAs=d:\rrobxltest, iType=44);*/

/******************************************************************************
** PROGRAM:  MACRO.DDE_CLOSE_WITHOUT_SAVE.SAS
**
** DESCRIPTION: CLOSES EXCEL WITHOUT SAVING THE FILE
**
** PARAMETERS: NONE
** 
*******************************************************************************
** VERSION:
** 1.0 ON: 18MAY10 BY: RP
**     CREATED.  
******************************************************************************/

%macro dde_close_without_save();
  filename cmdexcel dde 'excel|system';
  data _null_;
    file cmdexcel;
    put '[close(0)]';
  run;
  filename cmdexcel clear;
%mend;
/*%dde_close_without_save;*/
...