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

15 Responses to “Truco SAS. Unir todos los Excel en uno sólo”

  1. rvaquerizo dice:

    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. svalle dice:

    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. rvaquerizo dice:

    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. ffernandez dice:

    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. rvaquerizo dice:

    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á…

  6. ffernandez dice:

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

  7. rvaquerizo dice:

    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.

  8. ffernandez dice:

    Gracias!!

  9. svalle dice:

    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

  10. kike dice:

    Simplemente espectacular!!!!

  11. Evelin dice:

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

  12. Chago dice:

    Tengo la misma pregunta: Donde se pega y cómo se llama al programa??
    Me sería muy útil saber.
    Saludos y gracias!

  13. rvaquerizo dice:

    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.

  14. José Antonio Gil Martín dice:

    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

  15. Fernando dice:

    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.

Deja un comentario