Truco SAS. Unir todos los Excel en uno sólo

Abril 23rd, 2008 | por svalle |

Este programa SAS une todos los excel que queramos en un único libro.
Cuando estamos haciendo análisis de variables y exportamos los resultados
con ods o con otro método a excel, resulta un poco pesado ir abriendo
cada libro para ver los resultados, a mi me resulta más facil unirmelas todas y tener toda la información contenida en un único Excel.

Espero que os resulte útil!


ods noresults;
ods listing close;
ods html body="c:\temp\retail.xls";
proc print data=sashelp.retail;
run;
ods html close;
ods html body="c:\temp\shoes.xls";
proc print data=sashelp.shoes ;
run;
ods html close;
%macro UNE_EXCEL(in=,out=);
options noxwait;
x erase "&&out";
options xwait;
data _null_;
file "c:\temp\class.vbs";
put 'Set XL = CreateObject("Excel.Application")' /
'XL.Visible=True';
%let n=1;
%let from=%scan(&&in,&&n," ");
%do %while("&&from" ne "");
%let fromwb=%scan(&&from,1,"!");
%let fromws=%scan(&&from,2,"!");
put "XL.Workbooks.Open ""&&fromwb""";
%if &&n=1 %then
put "XL.ActiveWorkbook.SaveAs ""&&out"", -4143"%str(;);
%else %do;
put "XL.Workbooks(""%scan(&&fromwb,-1,'\')"").Sheets(""&&fromws"").Copy ,XL.Workbooks(""%scan(&&out,-1,'\')"").Sheets(%eval(&&n-1))";
put "XL.Workbooks(""%scan(&&fromwb,-1,'\')"").Close";
%end;
%let n=%eval(&&n+1);
%let from=%scan(&&in,&&n, " ");
%end;
put "XL.Workbooks(""%scan(&&out,-1,'\')"").sheets(1).activate";
put "XL.Workbooks(""%scan(&out,-1,'\')"").Save";
put "XL.Quit";
run;

x 'c:\temp\class.vbs';
%mend;
%UNE_EXCEL(in= c:\temp\shoes.xls!shoes c:\temp\retail.xls!retail,
out=c:\temp\TodasJuntas.xls);

  1. 10 Respuestas en “Truco SAS. Unir todos los Excel en uno sólo”

  2. Por rvaquerizo, Abr 23, 2008 | Responder

    Funciona de PM, genera automaticamente este script:

    Set XL = CreateObject(”Excel.Application”)
    XL.Visible=True
    XL.Workbooks.Open “c:\temp\shoes.xls”
    XL.ActiveWorkbook.SaveAs “c:\temp\TodasJuntas.xls”, -4143
    XL.Workbooks.Open “c:\temp\retail.xls”
    XL.Workbooks(”retail.xls”).Sheets(”retail”).Copy ,XL.Workbooks(”TodasJuntas.xls”).Sheets(1)
    XL.Workbooks(”retail.xls”).Close
    XL.Workbooks(”TodasJuntas.xls”).sheets(1).activate
    XL.Workbooks(”TodasJuntas.xls”).Save
    XL.Quit

    Funciona sin tocar nada. Muy práctico.

  3. Por svalle, Abr 23, 2008 | Responder

    La encontré buceando por google en un blog de sas, está muy bien además creando tus propias scripts se pueden hacer muchas más cosas

  4. Por rvaquerizo, Abr 23, 2008 | Responder

    El tema es que arreglando este código puedes crear siempre scripts de para Excel. Incluso crear la macro directamente en Excel y parametrizarla en SAS.

    Este código es muy práctico.

  5. Por ffernandez, Oct 8, 2008 | Responder

    No es que sea práctico. A mí esta semana me ha sido NECESARIO. Precisaba generar un informe en excel con varias pestañas que procedían de varios informes HTML, con el problema de que los informes se generan en un entorno UNIX. Con esta macro listo: Se generan las “pestañas” en el servidor y se descargan a local donde el script se encarga de crear el excel con todas juntas.

  6. Por rvaquerizo, Oct 14, 2008 | Responder

    Es el mensaje más leído del sitio en dura lucha con el que trata de la importación de texto a SAS. Por algo será…

  7. Por ffernandez, Oct 20, 2008 | Responder

    Ups, acabo de encontrarle un fallo, el script no se comporta bien cuando la ruta del fichero contiene espacios en blanco. Alguna sugerencia?

  8. Por rvaquerizo, Oct 21, 2008 | Responder

    El problema lo tendrás en esta línea del script (imagino):

    XL.Workbooks(”retail.xls”).Sheets(”retail”).Copy , XL.Workbooks(”TodasJuntas.xls”).Sheets(1)

    Si haces que tu macro ponga:

    XL.Workbooks(”retail.xls”).Sheets(1).Copy , XL.Workbooks(”TodasJuntas.xls”).Sheets(1)

    Si sólo tienes una hoja cogerá la primera, si tienes más procura pasárle como parámetro su posición. No tengo tiempo de probarlo.

  9. Por ffernandez, Oct 21, 2008 | Responder

    Gracias!!

  10. Por svalle, Oct 21, 2008 | Responder

    Yo creo que el problema está en el comando x:
    x ‘c:\temp\class.vbs’;
    no funciona bien cuando la ruta tiene espacios en blanco:
    x ‘c:\temp prueba\class.vbs’;
    no abre el script, yo te recomendaría crear el script en una dirección que no tenga espacios, a ver si tengo tiempo y encuentro una solución

  11. Por kike, Nov 6, 2008 | Responder

    Simplemente espectacular!!!!

Publica un Comentario