Truco SAS. SAS y DDE, otra forma de exportar a Excel

Otro elemento con el que contamos para crear archivos Excel desde SAS es el DDE, una tecnología que nos permite comunicar Windows con SAS. Mediante esta comunicación podemos leer un fichero SAS y escribir en una tabla de Excel. Con el siguiente artículo os voy a introducir a otra metodología que no sólo sirve para crear ficheros Excel desde SAS si no que además nos permitirá ejecutar macros, crear gráficos,…

Estudiemos el ejemplo más sencillo que parte siempre de un fichero Excel existente:

options noxwait noxsync;x '"C:\temp\ej_dde.xls"'; 
/*ESPERAMOS PARA QUE NO HAYA UN CONFLICTO*/ 
data _null_;   x=sleep(2); 
run;   

/*ASIGNAMOS UN FILENAME AL RANGO AL QUE VAMOS ESCRIBIR   

  ESTE FILENAME SERA DINAMICO */   

filename ejemplo dde 'excel|Hoja2!f1c1:f20c3';   

/*MEDIANTE UN PASO DATA PONEMOS EN EL LUGAR DEL FILENAME   

  LOS DATOS*/   

data _null_;   
   file ejemplo;   
   do i=1 to 20;   
      x=ranuni(i); 
      y=x+10;   
      z=x/2;   
      put x y z;   
   end;   
run;

Este ejemplo genera un dataset temporal de 20 observaciones y 3 variables que escribimos en un archivo excel C:\temp\ej_dde.xls que existe. La secuencia para su creación es:  abrimos, esperamos unos segundos, asignamos una referencia y escribimos. Hemos creado:

DDE SAS paso 1

Es evidente que los datos no han quedado muy bien debido a la notación americana así pues deberíamos jugar con los formatos de las variables o bien con la configuración regional de Excel. En este caso vamos a trabajar con macros de Excel que modifiquen las configuraciones regionales en el momento de escribir los datos desde SAS. Además estas macros van a ser llamadas por nuestro programa SAS ya que el DDE nos permite ejecutar macros de Excel. En Visual Basic si deseamos modificar la configuración regional haremos lo siguiente:

Sub formato_americano()'' formato_americano Macro'
With Application
.DecimalSeparator = "."
.ThousandsSeparator = ","
.UseSystemSeparators = False
End With
End Sub

Del mismo modo para el formato europeo creamos otra macro:

Sub formato_europeo()
' formato_americano Macro
'
  With Application
  .UseSystemSeparators = True
  End With
End Sub

Estas macros estarán guardadas en el archivo Excel con el que trabajemos y serán llamadas desde SAS y pegaremos nuestros datos con formato europeo sin necesitad de trabajar el fichero SAS:


/*ASIGNAMOS UN FILENAME AL RANGO AL QUE VAMOS ESCRIBIR 
  ESTE FILENAME SERA DINAMICO */ 
filename ejemplo 
   dde 'excel|Hoja2!f1c1:f20c3';   

/*FILEMANE PARA REFERENCIAR AL SISTEMA Y EMPLEAR CODIGO DDE*/ 
filename sis dde 'EXCEL|SYSTEM';   

/*ABRIMOS EL FICHERO EXCEL*/ 
data _null_; 
file sis; 
put "[open(""C:\temp\ej_dde.xls"")]"; 
run; 
/*EJECUTAMOS LA MACRO QUE PONE FORMATO AMERICANO*/ 
data _null_; 
file sis; 
put '[RUN("formato_americano")]'; 
run; 
/*ESCRIBIMOS EL FICHERO EXCEL*/ 
data _null_; 
   file ejemplo; 
   do i=1 to 20; 
      x=ranuni(i); 
      y=x+10; 
      z=x/2; 
      put x y z; 
   end; 
run; 
/*VOLVEMOS AL FORMATO EUROPEO*/ 
data _null_; 
file sis; 
put '[RUN("formato_europeo")]'; 
run; 
/*CERRAMOS Y GUARDAMOS EL FICHERO EXCEL*/ 
data _null_; 
file sis; 
put "[save()]"; 
put "[File.Close()]"; 
run;

Nuestra tabla Excel ha mejorado mucho su aspecto. Un buen programa para comenzar a usar DDE con SAS. Podemos sofisticarlo todo lo que queramos y crear informes directamente con SAS.

Saludos.

4 comentarios en “Truco SAS. SAS y DDE, otra forma de exportar a Excel

  1. Es una de las pegas de Enterprise Guide, es más complejo pero el Guide se conecta a “un servidor local” de SAS por lo que no podemos usar DDE:

    http://support.sas.com/resources/papers/sgf2008/eguide.pdf

    A ver si podemos realizar una revisión del tema porque es interesante. Por cierto, con Guide el truco de unir los Excel en uno no funciona tampoco.

    Como solución de contingencia tienes que generar los Excel como pasos del proyecto de Guide y luego una macro de Excel que los una.

  2. Me esta ayudando mucho tu blog. Muchas gracias.

    Sin embargo, como podria exportar datos desde SAS a una tabla aue tiene filtros?

    la cosa es que la tabla destino ya tiene asignadas las celdas donde tienen que alojarse esos datos.

    Es posible aplicar la funcion IF a dde?

    gracias!

Deja un comentario

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