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

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);

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

  1. 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.

  2. 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

  3. 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.

  4. 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.

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

  6. 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.

  7. 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

  8. Disculpen por tanta ignorancia, me podrian decir paso por paso como puedo utilizar estos codigos y donde los escribo. Ya yo necesito unir varios excel en uno pero no tengo ni idea muchas gracias..!!

  9. Las preguntas que planteáis no son sencillas de resolver. Este truco está orientado a una macro de SAS, es necesario trabajar sobre el código para que funcione en Excel. Voy a crear una entrada para este problema. Saludos.

  10. Para mi el método más fácil de hacer esto es usando la sentencia libname. Por ejemplo, si tengo tres ficheros en la librería remota rsasuser llamadas dataset1, dataset2 y dataset3, para exportarlos a un libro de excel con tres hojas del mismo nombre usaría el siguiente código:

    libname libro ‘c:\libro.xls’;

    data libro.dataset1;
    set rsasuser.dataset1;
    run;

    data libro.dataset2;
    set rsasuser.dataset2;
    run;

    data libro.dataset3;
    set rsasuser.dataset3;
    run;

    libname libro clear;

    El código solo funciona desde una sesión local.

    Saludos

  11. Como hago para que cada hoja que copie la macro, ponga el nombre del archivo o los primeros 10 caracteres del nombre del archivo??
    Gracias.

  12. Hola!!

    Estoy con SAS e intento este código y me salta el error de:
    ERROR: Shell escape is not valid in this SAS session.

    ¿Qué significa esto? ¿Qué hago mal? ¿Echenique = Estifen Joukins?

    Es que se me crea un archivo .vbs que la verdad, no sé lo que es y prefiero no abrirlo por si me estalla la computadora

    Saludos

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *

[bws_google_captcha]