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í:
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.
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)
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.

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
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.
Comentarios recientes