Interoperabilidad entre VSTO y VBA

Muchas veces cuando trabajamos con código VBA para los objetos de Office nos topamos con algunos problemas, tal vez porque no existen funciones con las que estamos acostumbrados a trabajar en .NET como un CType, un CAST o algo parecido. Además de que resulta un tedioso revisar todos los objetos o CommandBars para los objetos de Office 2007.

Es aquí en donde hacemos uso de una de las nuevas características de Visual Studio 2008 y la  ultima versión de Visual Studio Tools for Office que nos permite expandir nuestro código de VBA o en su caso crear un Add para un documento  con funciones previas de unas macros o lo que se les ocurra hacer, bueno les digo como hacer esto de manera sencilla.

1.- Creamos un Documento de Excel y creamos una tabla con “X” datos, que se ve más y creamos un Gráfico de estos datos para que quede más  o menos así:

image

Luego nos vamos a la parte de Visual Basic en la parte de programación y escribimos una función que nos diga que tipo de Gráfico es, que es más o menos así

Public Function NombreGrafico() As String
    Dim graf As Chart
    Set graf = ThisWorkbook.ActiveSheet.Shapes(1).Chart
    NombreGrafico = CSng(graf.ChartType)
End Function

Si ejecutamos esta función nos regresa solo un numero que corresponde al tipo de Grafico que elegimos.

image image

Y es aquí en donde vamos a ver que es lo que podemos hacer con esta Interoperabilidad entre VSTO y VBA. La interoperabilidad entre estas dos tecnologías consiste básicamente en la comunicación y utilización del código que generamos. Se puede comunicar una función de VBA en VSTO y viceversa, es decir; existen 2 maneras de comunicarnos entre si, vamos a ver de que se trata.

La Primera Llamar una función de VBA desde el Visual Studio 2008 (VSTO)

Para realizar esto tenemos que trabajar con una copia de un documento en este caso el que acabamos de hacer con la función de NombreGrafico. Para poder hacer uso de este documento es necesario que lo guardemos como un archivo de Excel habilitado para macros. Mi archivo lo llame ExcelDemo. Ahora lo voy a abrir desde el VS 2008, para esto creo un proyecto de tipo Libro de Excel 2007 pero selecciono la opción Copiar un documento existente y busco el que guarde (recuerden cerrar el archivo con el que vamos a trabajar)

imagen4

Damos clic en Aceptar y nos realiza una copia del documento en la raíz de nuestro proyecto. Ahora podemos comenzar a trabajar con este. Podemos llamar al método que creamos en VBA desde Visual Studio, para esto solo cuando inicie mandaremos el mensaje con el nombre del grafico, entonces escribimos el siguiente código:

Private Sub ThisWorkbook_Startup(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Startup
        MessageBox.Show(Me.Application.Run("NombreGrafico").ToString())
    End Sub

Lo que nos manda un mensaje en pantalla con el numero 93, que corresponde al grafico si. Esta es la primera manera de llamar código entre uno y otro, lo cual trae desventajas porque como se pueden dar cuenta lo corremos como un texto y no tenemos ayuda del intellisense lo que ocasiona muchos errores sino se toman las medidas necesarias.

La segunda y la más importante es la de llamar código de VSTO desde VBA

Bien para esto, necesitamos habilitar una propiedad de nuestro documento en Visual Studio que se llama: EnableVbaCallers la cual especifica si los miembros públicos de la case serán visibles desde VBA al mismo tiempo de habilitar esta propiedad se habilita otra llamada ReferenceAssemblyFromVbaProject que especifica si se debe agregar una referencia a la bilbioteca de tipos del ensamblado al proyecto de VBA en el documento. Al habilitar estas propiedades el VS nos manda un mensaje con las siguientes indicaciones.

image

Lo que nos dice aquí, es que no se guardar el código en el documento ya que recuerden que estamos trabajando sobre una copia del documento original si queremos hacer esto tendremos que copiar el código que generamos y copiarlo en el documento original. Bueno ahora vamos a realizar un método que podamos llamar desde VBA, el código es el siguiente:

    Public Function TipoGrafico() As Excel.Chart
        Return Me.ActiveSheet.Shapes.Item(1).Chart
    End Function

Y ejecutamos nuestro proyecto y cuando abre nuestro archivo de Excel presionamos Alt+F11 para abrir la ficha de programación y si abrimos el código de Thisworkbook.vb podemos observar que genera el siguiente código

Property Get CallVSTOAssembly() As DemoExcel.ThisWorkbook

    Set CallVSTOAssembly = GetManagedClass(Me)

End Property

y para ver que funciona hacemos un método que use este código, y nos queda así:

Public Function TypoGrafico() As String

    Dim graf As Chart

    Set graf = ThisWorkbook.CallVSTOAssembly.TipoGrafico

    TypoGrafico = CSng(graf.ChartType)

End Function

Como se pueden dar cuenta es hace lo mismo que el anterior, pero nos podemos dar cuenta de que si funciona ya que tiene el nombre del método que creamos en VS

image

Espero que les sea de ayuda este post, es sencillo pero ilustrativo, ya estaré platicándoles más acerca de esto, ya que me encuentro trabajando en un proyecto sobre este tema.

Saludos.

Etiquetas de Technorati: ,,,
  1. Fco. Campos
    octubre 26, 2009 a las 4:22 pm

    Oye una duda. Quiero insertar una grafica en excel desde visual studio utilizando variables tipo objeto para poder manipular al excel.
    Grabe un macro al insertar un grafico en la hoja de excel para luego poder ver el codigo.
    Quise usar este codigo en Visual Studio pero me marca error de interoperabilidad.. (Entiendo que Visual Studio no entiende el codigo de VBA) intente hacer lo que dices arriba pero no me sirvio.. que puedo hacer?

  1. No trackbacks yet.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: