viernes, 30 de septiembre de 2011

Creación de soluciones para Excel usando Visual Studio

Buenas en esta nueva entrada me voy a centrar en cómo integrar Visual Studio con Office. Para ello voy a crear primero un proyecto libro de Excel 2010 al cual añadiré un panel de acciones y luego voy a crear un proyecto complemento para Excel todo ello con VB.NET como lenguaje de programación. Esto mismo que voy a crear con Excel también se podría crear con otra aplicación de Office como Word o Outlook sin problemas, pero me voy a centrar en Excel ya que es la aplicación que con más alegría se usa en entornos empresariales. Como verás Visual Studio 2010 integra este conjunto de herramientas y plantillas para la creación y personalización de soluciones para Office, que para los que no lo recuerden hace no mucho tiempo toda esta funcionalidad estaba en una descarga aparte llamada ‘Visual Studio Tools for Office’.

La principal diferencia entre crear un nuevo proyecto seleccionado la plantilla ‘Libro de Excel 2010’ o seleccionado la plantilla ‘Complemento de Excel 2010’ es que usando la primera todo el código que escribamos y toda la funcionalidad que añadamos sólo estará disponible para el libro de Excel que vamos a crear. Si abrimos otro libro pues esa funcionalidad no estará disponible. Cuando por el contrario creamos un complemento el código es independiente de cualquier documento y siempre estará disponible en Excel a menos que desinstalemos el complemento a través de la ficha de ‘Programador’ de Excel 2010 del menú y el botón ‘Complementos COM’. Este último proyecto es ideal por ejemplo si queremos crear un complemento que nos añada a la cinta principal del Excel (el antiguo menú principal) alguna funcionalidad, por ejemplo un botón para que cuando el usuario pulse se ejecute cierto código que nos muestre en una celda de Excel la hora actual y que este botón esté disponible sea cual sea el libro de Excel que abra. Es un ejemplo muy simple lógicamente.

Pero aquí alguien me podría decir que todo esto está muy bien que es lo que ganamos frente a usar VBA en Excel. Podría decir que es más simple, que usamos Visual Basic 6 (pocas líneas de código), que podemos grabar macros fácilmente que nos ayudan a la hora de escribir código. Si todo esto está muy bien pero aquí lo interesante es poder usar los controles y la potencialidad de Visual Studio y VB.NET para trabajar con Excel. Por ejemplo que pasa si queremos conectarnos a una base de datos SQL y ejecutar un procedimiento almacenado que nos devuelva cierta información que luego se muestre en Excel, si queremos controles más complejos que los que podemos agregar a un formulario usando VBA (por ejemplo un DataGridView) o si por ejemplo queremos manejar las Excepciones de una manera más profesional que usando ‘On Error Resume Next’ y por no hablar de depurar nuestro código como podríamos depurar cualquier otro proyecto que diseñemos en Visual Studio.

Voy a poner 2 ejemplos. El primero, más sencillo, en el que crearé un proyecto ‘Libro de Excel 2010’ al cual le voy a añadir un control Calendar al panel de acciones como se ve en la siguiente imagen:














El segundo será un proyecto ‘Complemento de Excel 2010’ que nos permitirá seleccionar un precio máximo de un producto y que al pulsar a un botón del menú se ejecutará un método que primero se conectará a la base de datos Northwind, ejecutará un procedimiento almacenado y devolverá una lista de productos cuyo precio sea menor o igual al precio pasado como parámetro y dicha lista se mostrará en el libro Excel. Voy a usar LINQToSQL pero también se podría hacer los mismo abriendo una conexión y usando un SQLCommand (si trabajamos con un ambiente conectado). Cuando creemos un complemento para Excel veremos que no se nos crea un libro de Excel y no podrems añadir un elemento ActionPaneControl, sino que para que este complemento esté disponible siempre que habramos el Excel voy a añadirle un elementol Cinta (diseñador visual) como se ve en la imagen:











Y el vídeo es el siguiente:

Bueno en siguientes entradas me centraré en otra aplicación que estoy diseñando como la aplicación ‘Norma34Creator’ pero esta vez para temas fiscales y más tarde es posible que según si tengo tiempo cuelgue alguna aplicación desarrollada en Java usando el conocido IDE Netbeans, que aún está en betatesteo. Como digo, es bueno a parte de .NET conocer otras tecnologías y lenguajes para más que otra cosa no casarse con una única plataforma.

30 comentarios:

  1. Fantástico Raul, ya estoy esperando el siguiente post sobre VBA Excel.

    Gracias por compartir tus conocimientos....

    ResponderEliminar
  2. hola muy buena informacio ahora tengo un problema necesito agregar un complemento a la cinta robbin dentro del complemento poner texbox que me lea los valores que yo ponga y ponga esos valore en una celda para que me calcule en una formula. muchas gracias por tu ayuda

    ResponderEliminar
  3. Hola al crear un libro de Excel puedes añadir en la cinta (que también has agregado a tu proyecto) un EditTexbox. Tienes el evento TextChanged, o si lo prefieres puedes añadir un botón y aprovechar el evento click, para luego con el siguiente código en la celda (1, 1), por ejemplo, te aparezca el contenido de ese EditTextbox:
    Globals.Hoja1.Cells(1, 1).value = Me.EditBox1.Text
    Luego puedes añadir a la hoja Excel las fórmulas que quieras para que ese dato se vaya traspasando y forme parte de otros cálculos.

    ResponderEliminar
  4. Hola buenas tardes, disculpa tengo una duda, se puede crear una macro en la opción de crear un libro?
    en el ejemplo que tu proporcionas añades un calendario, se podría agregar una macro para que solo afecte a ese documento?, de antemano muchisimas gracias espero me puedas aclarar esta duda.

    ResponderEliminar
  5. Hola si te refieres a VBA no se puede en Visual Studio porque la ficha de programador no aparece en la cinta. Pero de todas maneras puedes crear lo mismo en .NET que harías con VBA pero en lugar de Visual Basic 6 usarías C# o VB.NET. Se podría crear un documento al que le añades unos controles, código y puedes manejar eventos y sólo al compartir ese documento podrás ejecutar lo que has programado, es decir, que no estará disponible cuando abras el Excel o Word (si estaría si creas un complemento).

    Saludos,

    ResponderEliminar
  6. Hola yo quisiera saber como se puede abrir un archivo excel de cualquier ruta, leer las hojas y si es la hoja 1 mandarla a la funcion1, la hoja 2 a la funcion 2, cada hoja tiene su nombre no es por default, para abrir el explorador y elegir el archvio he utlizado un OpenFileDialog, pero no se como guardar el archivo escogido para leerlo si tuvieran una idea porfavor ayudenme

    ResponderEliminar
  7. Hola el openfiledialog te permite seleccionar donde esta el.archivo. Luego puedes trabajar con el objecto Excel.Application trabajando con cada hoja del libro seleccionado y modificar los datos.y una vez acabado solicitas guardar datos . Un libro tiene hojas y sin importar su nombre con un for puedes recorrer cada hoja hasta i = worksheets.count y para cada i.iteracion llamas a una funcion diferente poniendo en el codigo del bucle for un select case. No se si te sirve de ayuda pq el codigo para hacer lo que buscas no es complicado y te puedo pasar unos enlaces si me concretas más.

    ResponderEliminar
  8. hola..... estoy desarrollando un complemento para word, en el cual necesito capturar una información que el usuario proporciona y almacenarlo en una bd junto con el documento.... como podría hacer para por ejemplo, el usuario abre un archivo de word, lo redacta y luego q' de click en un boton en donde me pide el nombre de la persona q' redacto el documento, luego ese nombre lo almaceno en una bd y el documento de word lo envio a una carpeta

    ResponderEliminar
  9. Hola. Hay muchas maneras de hacer esto desde guardar los datos en una base de datos en un servidor, en una base de datos local o en un archivo xml por ejemplo. Si los deseas guardar en un servidor y tu base de datos en MySQL pues sólo crear conexión al servidor y hacer el insert para agregar los datos a la base de datos. Para guardar el documento word es el típico código vb de guardar en un ruta determinada. ¿Donde lo querías guardar en un carpeta en tu ordenador o subirlo a un servidor?
    Por lo que veo lo que quieres hacer es un típico combinar correspondencia pero de forma más profesional y tenerlo como complemento para cualquier archivo word.
    Saludos,

    ResponderEliminar
  10. hola...

    gracias, ya solucione la inserción de datos...

    tienes algún tuto sobre los eventos de un documento de word,,..

    lo q' necesito hacer es q' cuando el usuario termine de suministrar la información, el documento se guarde en una ruta, y necesito desabilitar lo botones del documento como el de guardar y el botón redondo, y desabiliat los menus diseño de pagina, referencia, correspondencia y revisar....

    muchas gracias por la colaboración anterior...
    si pudiéramos hacer una vídeo llama seria super, mi usuario de skipe es jhon.javer.lozano.arce, para q' me ayudaras con otros temas que yo creo q' mas adelante me saldran

    ResponderEliminar
  11. Hola para desabilitar algunos controles la cinta de word no creo que sea difícil hacerlo vía .net como se consigue haciendolo usando VBA, ya que en .NET puedes cambiar las misma propiedades que en VBA lo que se diferencia es a la hora de escribir en código que este ya no es VB6. Este verano intentaré hacer algo de word que pueda ser útil.
    Saludos,

    Saludosm

    ResponderEliminar
    Respuestas
    1. hola....

      se me presento el siguiente problema, como hago para ejecutar un proyecto de tipo office desde un proyecto de tipo form.

      Eliminar
    2. Hola una cosa me podrías concretar un poquillo qué tipo de proyecto tienes para hacerme una idea. Porque un addin se añade a la aplicación word o excel directamente y un libro de Excel para VS es más de lo mismo. Al proyecto le puedes añadir formularios si quieres pero llamarlo desde otro formulario situado en otro proyecto podría ser sólo posible usando System.Diagnostics y usando Process.Start
      Saludos

      Eliminar
  12. hola raul...

    mira la aplicación q' estoy desarrollando es de gestión documental para la empresa q' trabajo....

    cual es la idea.

    existen platillas de diferentes tipos de documentos, y esas plantillas las cree en un proyecto de office "Word", los usuarios utilizan el proyecto de win form, para ver los documentos q' tiene en la bandeja de recibidos y los enviados, si el usuario quiere enviar un documento por eje: una carta, un memorando, tiene la opción de utilizar las plantillas, y esas plantillas son las del proyecto de office.

    en resumen: ejecutar un documento de word q' este en un proyecto de office, desde un proyecto de win form.

    gracias por prestar interés....

    ResponderEliminar
    Respuestas
    1. Hola te lo tendría que mirar este fin de semana y hacer unas pruebas. Lo que yo he hecho es llamar desde una aplicación a una plantilla de word creada previamente, para no tener que generarla en tiempo de ejecución, y una vez abierta le añado los datos que necesito.
      Pero seguro que si en tu solución tienes varios proyectos de documento de word aunque sea con process.start y apuntas a la carpeta bin/debug o release que se te ha creado, se tiene que poner llamar.
      Saludos,

      Eliminar
  13. Hola Raúl,

    mi nobre es Sebastián y me encuentro tratando de desarrollar una solución Excel... Antes he creado un par de proyectos en Visual basic 6 y esto es bastante diferente, pero me he dado cuenta que buena parte de lo que hice entonces lo podría utilizar ahora (esa es mi intención).

    Comencé por crear una solución usando una plantilla excel 2007 con lo que tengo el libro de trabajo con las tres hojas que me presenta por default... Pero quisiera importar las hojas del libro de trabajo con el que necesito trabajar.

    Me podrías ayudar a importar cada hoja de mi libro de trabajo (Llamemósle externo) y que éstas sean las de la solución que quiero desarrollar?

    Gracias por la ayuda que me puedas dar.

    ResponderEliminar
    Respuestas
    1. Hola y por qué al crear el proyecto de plantilla para Excel en Visual Studio en lugar de crear una nueva no seleccionas una existente. Seleccionas la plantilla que ya tienes creada en Excel y Visual Studio te mantendrá los diseños que has creado. Otra cosa será el código que tendrás que traducirlo de VBA a Vb.net o C# pero el proceso de traducción es muy sencillo y adémás .NET te da muchas más posibilidades y podrás usar muchos más controles.

      Saludos,

      Eliminar
  14. Disculpa, olvidé mencionar que estoy trabajando con Visual Basic 2010 (Framework 4)

    Soy Sebastián.

    ResponderEliminar
  15. Hola Raúl,

    Gracias por responder, te cuento que en algún momento pensé en lo que me sugieres, pero no encontré la manera de indicar que quería hace uso del libro de trabajo en que tengo mis datos de origen. VS me presenta diferentes plantillas para iniciar el proyecto y la única opción que tengo disponible para indicar un cambio de localización está habilitada para el proyecto que crearé. Continuaré buscando y gracias nuevamente.

    Saludos.

    ResponderEliminar
  16. si yo quisiera desarrollar aplicaciones con excel utilizando visual studio, necesitaría aprender a programar en vb.net?

    gracias

    ResponderEliminar
    Respuestas
    1. En principio si pero si dominad vb6 la curva de aprendizaje es muy sencilla.
      Saludos

      Eliminar
  17. Muy buen tutorial, pero tengo una duda que no puedo resolverla.
    He segui al pie de la letra tu tutorial y me funciona correctamente, pero el detalle es que solo funciona en la maquina que uso, es decir como agrego esa nueva funcionalidad al excel de otras pc's. Quizas se tenga que hacer un paquete de instalacion pero no se como..me podrias ayudar en eso por favor

    ResponderEliminar
    Respuestas
    1. Hola si usas hasta VS 2010 puedes crear un proyecto de instalación añadiéndolo a tu solución. En cualquier versión de VS tienes la posibilidad de usar también ClickOne. Vas a las propiedades del proyecto (botón derecho seleccionando el proyecto) y buscas la pestaña Publish o Publicar. Ojo porque hay que mirar que detecte las dependencias que sean necesarias y que las incluya en el paquete de instalación para que funcione en cualquier otra máquina.
      Saludos

      Eliminar
  18. Hola , buenos días. Me podrías recomendar algún libro sobre programación de complementos de excel desde visual studio 2010. Gracias de antemano

    ResponderEliminar
  19. Buenas, en principio libro específico dedicado a complementos para Excel usando el Visual Studio no me constan muchos pero en la web de desarrolladores de MSDN en msdn.microsoft.com/es-es/office/aa905411.aspx hay artículos y códigos útiles,

    Saludos,

    ResponderEliminar
    Respuestas
    1. Hola Raul me llamo tito, estoy haciendo una aplicacion que me genere en excel una lista de paciente con los totales y en cada hoja adicional me genere los detalle de cada paciente, mi problema es que como obtengo los datos desde la base y los pego en las hojas

      Eliminar
  20. Hola, aquí lo que has de hacer son 2 procesos en el recorrido por cada registro de la base de datos:
    1. Recuperas una fila con una consulta SQL Select * FROM BaseDatos usando un DataReader.
    2. Creas el libro y para cada fila que recuperas escribes el contenido en la posición de la hoja del libro que necesitas.
    El código es un poco farragoso pero es eso para cada fila que lees la tratas y la añades al Excel.
    Se podría usar la opción alternativa de añadir todos los datos un dataset y tratarlos según necesites o crearte una clase con los métodos necesarios e instanciarla para tratar los datos según lo que necesites.
    Saludos,

    ResponderEliminar
  21. Hola Raul,

    Interesante este artículo. Tan solo me gustaria saber de acuero a tu propia experiencia, cuales son las consideraciones a tener en cuenta para instalar un complemento de Excel en otro equipo. Y con esto me refiero a dos particularidades:

    01- El despliegue y los requisitos que debe cumplir la máquina para que el complemento se ejecute sin problema, porque en este caso, he de suponer que esto no se limita a copiar simplemente el complemento en las librerias de Add-Ins de Office.

    02- Protección Codigo: A efecto de proteger la propiedad intelectual es necesario aplicar técnicas de obfuscación antes del despliegue. Aplicas esto en tus desarrollos ? Con que lo haces?
    Infortunadamente, la protección VBA para los desarrollos Office es inocua, y las herramientas de obfuscación en el mercado destinadas a este propósito (VBA) son bastante deficientes, y te puedo decir que he probado varias.

    Gracias por la atención.

    ResponderEliminar
    Respuestas
    1. Hola,
      a la hora de desplegar un complemento si creas un proyecto de instalación o un proyecto ClickOne éste te dirá las dependencias necesarias para el despliege. No es sólo copiar el complemento o las dlls ya que es posible que te falte algo y por eso te falle el complemento y no sepas lo que es.
      A efectos de protección utilizo el Dotfuscator que viene con el Visual Studio.
      Ya fuera de .NET la protección por contraseña del código VBA es poco efectiva ya que es fácil resetear la contraseña del proyecto.

      Saludos,

      Eliminar
  22. Hola Raul, gracias por la info.
    La duda que me refleja debiese ser un poco basica por no logro encontrar, codigos globales, ejemplo:

    Windows("Libro1.xls").Activate : ¿Cual seria su codigo?
    ActiveSheet.Select

    En el fondo quiero saber como seleccionar el libro activo, la idea que tengo es importar las macros o complementos que he hecho en Excel a esta herramienta que seria mas segura y confiable.
    En el fondo seria genial encontrar un traductor de codigo de VBA a Visual Basic.

    Saludos y atento a tus comentarios, una vez mas, gracias

    ResponderEliminar