Accediendo a .Net Framework desde VBA

Estándar

Siempre estoy buscando nuevas maneras de ampliar las posibilidades con VBA, ya sea combinándolo con otros lenguajes o herramientas, y en mi búsqueda he dado con una maravilla que será de gran ayuda en lo que deseo y estoy seguro que para muchos otro también. Había visto desde crear dll’s en visual studio, complementos como ExcelDNA, entre otras, pero esta última se me hace más práctica y con mayores posibilidades:

¡Hola, chicos del scripting!

Ahí se muestra como poder acceder a las estructuras de datos que brinda el .Net Framework lo cual supone nuevas posibilidades en el desarrollo desde VBA, el único inconveniente a primera vista es que hay que contar con el .Net Framework instalado en el equipo. El mío ya lo tenía y funciono a la primera.

Tal como se menciona en el artículo, donde se ve un ejemplo del uso del Objeto ArrayList, el cual pudiéramos comparar a usar una matrix en VBA, pero con esteroides, más poderosa y fácil de usar:

¿Es útil ArrayList para los generadores de scripts? Digámoslo así: después de ver la utilidad de arraylist en .NET Framework, no estamos seguros de por qué quería usar una matriz VBScript integrada, al menos no para listas simples de elementos como las empleadas aquí.

Con las estructuras de datos de .Net Framework VBA vuelve a tomar nuevas y mas posibilidades en mi trabajo diario.

Creacion de un servidor COM desde Python

Estándar

Antes que nada… que es COM? COM es el acrónimo de Component Object Model (Modelo de Objeto Componente) con lo cual se pueden crear objetos desde un lenguaje y poder utilizarlos en otro distinto en que fueron creados.

Entonces, en este ejemplo se muestra como crear un objeto COM desde Python para poder utilizarlo desde VBA/Excel. Creamos un archivo llamado “miservidorcom.py” y escribimos en el:


import sys
import pythoncom

class interprete_python:
_public_methods_ = ["Evaluar"] #metodos a exportar por el servidor COM
_public_attrs_ = ["Version"] #atributos a exportar por el servidor COM
_readonly_attrs_ = _public_attrs_ #atributos de solo lectura
_reg_progid_ = "interprete_python" #nombre para crear el objeto COM

#asignamos el id de clase por medio de la funcion CreateGuid
_reg_clsid_ = pythoncom.CreateGuid()

#constructor, seteo de atributos
def __init__(self):
self.Version = sys.version

#evalua una expresion python y devuelve su resultado
def Evaluar(self, expresion):
return eval(expresion)

#Codigo para registrar el script en caso de ser ejecutado por linea de comando por python.exe
if __name__ == "__main__":
import win32com.server.register
print sys.argv
win32com.server.register.UseCommandLine(interprete_python)
raw_input("\nServidor COM instalado!")

Antes de poder utilizar el objeto COM en VBA/Excel, hay que registrarlo con la siguiente instruccion desde la linea de comando:


python miservidorcom.py --register

Después de haber registrado el servidor COM, ya podemos invocarlo desde VBA/Excel de la siguiente forma:


Option Explicit

Sub Main()
Dim Python As Object
Dim Version As String
Dim Expresion As String
Dim Resultado As String

' Creo el objeto Python exportado por el Servidor COM:
Set Python = CreateObject("interprete_python")

' Obtengo un atributo del objeto python:
Version = Python.Version
MsgBox Version, , "Versión de Python:"

Do
Expresion = InputBox("Ingrese una expresión python para ser evaluada", "Ejemplo COM", "1+2")
If Expresion = "" Then Exit Sub
' Llamo al método del objeto python:
Resultado = Python.Evaluar(Expresion)
MsgBox Resultado, , "Resultado:"
Loop
End Sub

Si todo sale bien, deberíamos haber visualizado la versión del intérprete de Python y el resultado de la expresión “1+2”

Este es un ejemplo facil y practico para ver como se implementa un servidor COM desde Python. ¿Qué para que nos puede servir esto? Para muchas cosas interesantes, hacer uso de los diccionarios, tuplas y listas de datos que son fáciles de usar y muy poderosas, desde VBA/Excel, al igual que hacer uso de los módulos de python, los cuales superan por mucho a lo que nos brinda VBA/Excel.

NOTA: Solo hay que registrar una vez el objeto COM y después de ahí se puede llamar cuantas veces sea necesario, ya que si se registra varias veces se duplica en el registro de Windows.
Lo malo de esto es que si se desarrolla una aplicación que hay que entregar al cliente, este debe contar con el interprete Python y debe registrar el objeto COM antes de ser usado por primera vez, para este tipo de inconvenientes, podemos utilizar Py2Exe para generar una DLL o EXE y asi poder distribuir el objeto COM sin necesidad de tener instalado Python. Otra ventaja adicional es que nadie podra ver el codigo desarrollado en Python, ya que este no residira en los modulos de VBA/Excel.

Para más información al respecto, pueden revisar la fuente original: Servidor Interfase COM