Nupur
Nupur

Reputation: 357

"Save As" and "Close file" without using macro

I usually have a sas macro code which automatically run macros "Save As" and "Close file" in the excel spreadsheet on running the sas code and after populating the data into the excel file.

The problem I have is that the excel file I have right now has certain macros which I cant edit becuase they are password protected and neither can I add any "Save As" and "Close file" macro in it. Is there a way to directly "Save As" and "Close file" with the help of sas and without using the macro.

Upvotes: 3

Views: 4268

Answers (1)

Robert Penridge
Robert Penridge

Reputation: 8513

Sure can. You can use DDE to achieve that. Below are 3 macros that should do exactly what you ask. Add them to your SAS autocall macro library:

/******************************************************************************
** 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;*/

Upvotes: 4

Related Questions