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);
10 Respuestas en “Truco SAS. Unir todos los Excel en uno sólo”
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.
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
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.
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.
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á…
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?
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.
Por ffernandez, Oct 21, 2008 | Responder
Gracias!!
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
Por kike, Nov 6, 2008 | Responder
Simplemente espectacular!!!!