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

  12. Por Evelin, Jun 9, 2011 | Responder

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

  13. Por Chago, Jun 30, 2011 | Responder

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

  14. Por rvaquerizo, Jun 30, 2011 | Responder

    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.

  15. Por José Antonio Gil Martín, Jul 3, 2011 | Responder

    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

  16. Por Fernando, Nov 8, 2011 | Responder

    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.

Publica un Comentario