Este es un ejemplo de automatización – controlar un programa desde otro – usando Visual Basic .NET y Excel.

Desde Visual Basic .NET vamos a crear y llenar una hoja de Excel. Proyecto Crearemos un proyecto Visual Basic de tipo Windows Application, y lo llamaremos: WinAppExcelAutomation. Formulario Aparece un formulario, Form1, que renombré a frmExcelAutomation. También le cambié el nombre del archivo, de Form1.vb a frmExcelAutomation.vb. Le puse la propiedad Text: Excel Automation.

Le adicioné un DataGrid, que nombré dgDatos, y un botón, con nombre: btnAlmacenarExcel, y texto: Almacenar Excel. (También recomendaría especificar las propiedades Anchor apropiadas, para que al cambiar el tamaño del formulario, los controles se ajusten).

Acceso a Datos

DataAdapter

Para llenar la hoja de Excel, vamos a leer datos de la tabla Customers en la base de datos Northwind que viene de demostración en SQL Server. Usaremos un DataAdapter para accesar la base de datos y llenar un DataSet, que es un área en memoria en donde almacenaremos temporalmente los datos.

En el Toolbox, bajo el encabezado de Data, arrastraremos un control SqlDataAdapter y lo dejamos caer sobre el formulario. Aparece un Wizard de Data Adapter Configuration:

Pasamos a la siguiente pantalla con Next >; y escogemos una conexión a Northwind. En caso de que no exista una conexión a Northwind, la creamos oprimiendo el botón New Connection.

Luego, escogeremos accesar los datos con enunciados SQL (versus con Procedimientos Almacenados):

y la conexión SqlConnection1 a cnnNorthwind. Renombré el Data Adapter SqlDataAdapter1 a daCustomers. y luego Finish para terminar. lo renombré a: dsCustomers: Código Acceso a Datos . Sobre el control daCustomers le damos botón derecho y pedimos laopción Generate Dataset… Le decimos que queremos un nuevo Dataset oprimiendo sobre: New y le damos el nombre: dsCustomers Revisamos que la caja Add this dataset to the designer esté marcada: y una vez creado. DataSet El DataSet es un área en memoria en donde almacenamos los datos con que vamos a trabajar.Y establecemos la sentencia SQL Server (puede utilizar el botón Query Builder para crear la sentencia SQL en forma gráfica) Dar Next >.

Damos doble click sobre alguna parte del formulario.Object. para que el DataAdapter daCustomers llene el DataSet dsCustomers con los datos de los clientes: Public Class frmExcelAutomation Inherits System.daCustomers. Establecemos las propiedades del DataGrid: DataSource dsCustomers DataMember Customers .Load Me.Windows.Forms.Form (Windows Form Designer generated code) Private Sub frmExcelAutomation_Load( _ ByVal sender As System. Escribimos lo siguiente.DsCustomers.EventArgs) _ Handles MyBase. lo que nos lleva a ver el código de la página.Fill(Me.Customers) End Sub End Class Binding del DataGrid al DataSet El DataGrid mostrará los datos que hemos almacenado en el DataSet. _ ByVal e As System.Escribiremos código para que al momento de cargar el formulario también cargue los datos.

El formulario debe aparecer con los datos de la tabla Customers (Clientes): Referencia a Excel Para poder accesar el modelo de objetos de Excel. por lo que nos vamos al tabulado COM. En mi caso. dé doble click sobre el mensaje de error y cuando aparezca una ventana Startup Object escoja el formulario de inicio correcto – en nuestro caso: frmExcelAutomation. Buscamos Microsoft Excel 11. . tenemos que adicionar una a Excel.0 Object Library (yo tengo instalado Office 2003. posicionémonos sobre References y con click derecho pedimos la opción Add Reference… Aparece la caja de diálogo: Add Reference Resulta que Excel todavía es tecnología COM (la tecnología previa a . dio el siguiente error debido a que renombré el formulario de Form1 a frmExcelAutomation: ‘Sub Main’ was not found in ‘WinAppExcelAutomation. corregirlo.Form1’.NET). cuyo Excel es la versión 11).Probarlo… Vamos a revisar que el sistema cargue los datos en el Grid Dar Debug – Start u oprimir el botón de Start (una flecha azul hacia la derecha). Oprimimos Select para escogerlo y luego OK para aceptarlo. En la ventana Solution Explorer. Para corregir este error. Si tiene errores.

Click Dim oExcel As Excel.Workbooks Dim oBook As Excel.Cells(ROW_FIRST.Cells(ROW_FIRST.Código que Instancia Excel y lo manipula Private Sub btnAlmacenarExcel_Click( _ ByVal sender As System.Visible = True oBooks = oExcel.ApplicationClass Dim oBooks As Excel.WorkbookClass Dim oSheet As Excel.Object.font. _ ByVal e As System.Worksheet ' Inicia Excel y abre el workbook oExcel = CreateObject("Excel.Sheets(1) 'oBook = oBooks. 1). 2) = "Compañía" oSheet.Cells(ROW_FIRST.font.Cells(ROW_FIRST.bold = True oSheet. 2).Open( _ ' "C:\DevCare\DevCareExcelAutomation\Data.EventArgs) _ Handles btnAlmacenarExcel.Workbooks oBook = oExcel.Add oSheet = oBook.xls") Const ROW_FIRST = 3 Dim iRow As Int64 = 1 ' Encabezado oSheet. 3) = "Contacto" oSheet. 4) = "País" oSheet.Workbooks. 1) = "ID" oSheet.bold = True .Cells(ROW_FIRST.Application") oExcel.Cells(ROW_FIRST.

ColumnWidth = 10 oSheet.Columns(3).ColumnWidth = 40 oSheet.Cells(iCurrRow.Marshal.Cells(ROW_FIRST.Cells(ROW_FIRST + iRow + 1.Country iRow += 1 Next ' Fórmula oSheet.font.Cells(iCurrRow.ContactName oSheet. 1) = rowCustomer.bold = True oSheet.Customers Dim iCurrRow As Int64 = ROW_FIRST + iRow oSheet.bold = True oSheet.Runtime. 3) = rowCustomer.Columns(2).font.CompanyName oSheet.InteropServices.Cells(iCurrRow.InteropServices.Columns(1). _ ' ReleaseComObject(oBooks) 'oBooks = Nothing . 2) = rowCustomer.CustomersRow For Each rowCustomer In Me.CustomerID oSheet.Cells(iCurrRow. _ ' ReleaseComObject(oBook) 'oBook = Nothing 'System. 4).Columns(4).Runtime.Close(True) 'System.ColumnWidth = 15 ' Loop que almacena los datos Dim rowCustomer As dsCustomers.DsCustomers.1).ToString & "C1)" '' Cierra todo 'oBook.ColumnWidth = 30 oSheet.Cells(ROW_FIRST. 4) = rowCustomer.oSheet.Marshal. 1) = _ "=counta(R" & (ROW_FIRST + 1) & "C1:R" & _ (ROW_FIRST + iRow . 3).

si es asi.Excel al proyecto.SaveAs("C:\nuevacarpeta\prueba.Marshal. Para iniciar debemos de agregar la referencia Microsoft.Click 0 2 Dim exApp As New Microsoft.Office.False) ' creamos nuestro archivo con el nombre que le querramos dar y en el directorio que lo querramos guardar exApp.Quit() 'System.Interop.Interop.Office.Visible = False ' esto nos sirve para que la aplicación(excel) no sea visible al trabajar en ella exApp.'oExcel. verificar si existen . "".InteropServices. abro el archivo y le agrego la hoja 11 .Interop. "".Office. _ ' ReleaseComObject(oExcel) 'oExcel = Nothing End Sub Como trabajar con un archivo de Excel desde VB.Interop. eliminarlos. 09 .Office.EventArgs) Handles Button1. todo con tan solo hacer un click en un botón desde una aplicación de visual basic .xls".Add.Runtime.Worksheet 'y nuestra hoja 05 06 Try 07 exApp. ByVal e AsSystem 1 .NET En estos días me la pase mordiéndome las uñas por no tener ni la mínima idea de cómo crear archivos Excel. 11 para office 97-2003 y 12 para 2007.Add() 'Añadimos el Libro al programa.Workbooks. view source print? 0 Private Sub Button1_Click(ByVal sender As System.Excel.Excel. False.Object.Application 'declaramos lo que sera nuestra aplicacion de excel 03 Dim exLibro As Microsoft. y la hoja al 08 libro exApp.Workbook 'nuestro libro 04 Dim exHoja As Microsoft.Excel.net.Close() 'cerramos nuestro archivo para poder trabajar 10 con él 'en mi caso necesito crear varios archivos excel con cierto nombre asi que verifico antes de añadir informacion 12 'Si el archivo existe.Workbooks.Workbooks. así que les comparto puntos básicos de cómo hacerlo.

UsedRange.UsedRange.Rows.Cells.Worksheets.xls") Then 15 exLibro = exApp.Rows.Item(1).Row . 6) = "Referencia Alfanumerica" 'Titulo en negrita.Rows. 4) = "Nombre/Razón social" 23 exHoja.Save() ' esto es muy importante para que no nos aparesca el cuadro de dialogo que nos dice si 30 'queremos guardar cambios 29 31 End If ' hasta ahora solo hemos creado el archivo y le agregamos los titulos 32 de las columnas. 3) = "Importe" 22 exHoja. y existen muchos más pero eso se los dejo de 42 tarea =) 43 'ahora recorremos el libro.Item(1.Item(1.Item(1.Open("C:\nuevacarpeta\prueba.NumberFormat = "@" 'con el numberformat le damos formato a las celdas. el @ sirve para que sean tipo texto ' y las numericas con #.Workbooks.Item(1). 1) = "Tipo Cuenta" 20 exHoja. Alineado al centro y que el tamaño de la columna se ajuste al texto 26 exHoja. ahora le añadiremos 33 ' la informacion que necesitemos 34 Dim intultimafila As Integer 35 Dim auxrefe As Integer 'con la siquiente linea sabemos cual es la ultima fila que contiene 36 datos intultimafila = exLibro.Exists("C:\nuevacarpeta\prueba. 5) = "Referencia Numerica" 24 exHoja.ActiveSheet.con la que deseo trabajar.Item(1. y las columnas que querramos para ponerles el titulo 18 exHoja = exLibro.xls") 16 exHoja = exLibro.AutoFit() exLibro. 2) = "Cuenta" 21 exHoja.1 + exLibro. con la hoja que querramos trabajar.Add() 17 19 exHoja.Cells. en caso contario 13 'creo el archivo de la forma anterior 14 If File. en este caso la hoja que le añadimos 'y con las siguientes lineas nos posicionamos en la fila vacia seguida por el numero de celda 44 With exLibro 45 .Cells.Columns.Count 38 auxrefe = intultimafila 37 39 'le añadimos uno para escribir en la fila vacia siguiente 40 intultimafila += 1 41 exHoja.ActiveSheet.Item(1.Cells.Sheets(1) 'aqui añadimos la hoja al archivo 'recorremos la primera fila.HorizontalAlignment = 3 28 exHoja.Cells.Cells.Cells.Font.Bold = 1 25 27 exHoja.Item(1.

"Error al exportar a Excel") 57 End Try ' la siguiente linea nos sirve para eliminar archivos que hayan sido 58 creados y que ya no nos serviran.Quit() 63 exHoja = Nothing 64 exLibro = Nothing 65 exApp = Nothing 66 67 End Sub Simple ejemplo para cargar un rango de una hoja de Excel en un DataGridView El siguiente es un simple código fuente para poder conectarse a una hoja de un libro. xls". FileIO.Value = dato2 49 exHoja.UIOption.Cells(intultimafila. 52 guardamos y cerramos. y dejamos sin basura a nuestras instancias.Message.DoNothing) ' si ya no trabajaremos con archivos de excel.46 ' y agregamos los datos que deseamos guardar 47 exHoja. MsgBoxStyle.DeleteFile("C:\recibedispersion\banamex\prueba.Save() 54 exLibro.Value = dato1 48 exHoja.Value = dato3 50 exHoja.FileSystem.omitiendo 59 6 0 61 ' tambien el mensaje del cuadro de dialogo. 1). 3).OnlyErrorDialogs.Cells(intultimafila. FileIO. 62 exApp. cerramos la aplicacion.SendToRecycleBin. 4). . FileIO.Value = dato4 51 End With ' despues de recorrer nuestro libro y ya agregamos lo que deseamos. 53 exLibro. 2).Cells(intultimafila. leer un rango de datos y mostrarlos o cargarlos en un control de tipo DataGridView.Computer. si estamos seguros de mandarlo a la papelera My.Close() 55 Catch ex As Exception 56 MsgBox(ex.Cells(intultimafila.Critical.UICancelOption.RecycleOption.

4. 14. Private Sub Button1_Click( _ .Object.Para el ejemplo colocar en un Form los siguientes controles:    Un TextBox : llamado txtRange ( Para indicar el rango a cargar en la grilla) Un DataGridView Un control Button Código fuente Texto planoImprimir 1. Option Explicit On 2. ByVal sender As System.EventArgs) Handles MyBase. _ 7. Public Class Form1 5.Text = "A1:C15" 11. Option Strict On 3. txtRange.Load 8. End Sub 13. 12.Text = "Cargar" 10. ByVal e As System. 9. Private Sub Form1_Load( _ 6. Button1.

0.Text.Data. ByVal sRange As String." 40. Dim sSql As String = "select * from " & "[" & sSheetName & "$" & sRange & "]" 45.OleDbDataAdapter 38.Click ' // Pasar valores para Leer el rango loadRange("c:\book1. objDataSet = New System. .Jet.Data. MsgBoxStyle. 21.OleDb.xls".Data. " & "data source=" & sFileName & ".Object. Extended Properties=Excel 8. MsgBox(ex. MsgBox("No se ha encontrado el archivo: " & sFileName.OLEDB. ' // Obtener los datos 46. 64. "sheet1".OleDbConnection 41.TableName 59.Data. ByVal dv As DataGridView) 31.4. ' --------------------------------------------------------------------------------26. Exit Sub 65.Close() 54. With dv 57.OleDb. 48.OleDb. objDataAdapter. ' // Comprobar que el archivo Excel existe 34.Critical) .Exclamation) 62.Data. ByVal sender As System. .Tables(0). MsgB oxStyle. 17. DataGridView1) End Sub ' --------------------------------------------------------------------------------24.Data. ' // Cerrar la conexión 53. objDataAdapter = New System. ' // Subrutina para conectar al libro Excel y obtener el rango de datos 25. 20. 16. If System. Dim sCs As String = "provider=Microsoft. Else 61.DataMember = objDataSet. ByVal sFileName As String. Catch ex As Exception 66. objOleConnection) 47. txtRange.0.DataSource = objDataSet 58. 23. Private Sub loadRange( _ 27. 36.EventArgs) Handles Button1. 18.15. 19.IO.Exists(sFileName) Then 35. End With 60. ' // Enlazar DataGrid al Dataset 56. ' // Crear DataSet y llenarlo 49.DataSet 37. Try 33. ' // Declarar la Cadena de conexión 39. 55.OleDbConnection(sC s) 42. End If 63. 32. Dim objDataSet As System. _ 30. _ ByVal e As System.OleDb.DataSet 50. _ 28. 43. ByVal sSheetName As String.OleDbDataAdapter(sSq l.Message. 22. objOleConnection.File. 51. Dim objDataAdapter As System.Fill(objDataSet) 52. objOleConnection = New System. _ 29. ' // Declarar la consulta SQL que indica el libro y el rang o de la hoja 44. Dim objOleConnection As System.

Interop.Worksheets("Hoja1").0 Object Library.value = "prueba" 'Guardamos los cambios del libro activo m_Excel.Application Dim strRutaExcel As String strRutaExcel = "C:\libro.SaveAs 'Eliminamos la instancia de Excel de memoria If Not m_Excel Is Nothing Then m_Excel. pinchar en referencias.Worksheets("Hoja1").cells(3.Visible = False 'Dejamos el libro oculto 'Mostramos el valor de la celda 1.Open(strRutaExcel) m_Excel.Excel.Net Muchas veces resulta útil acceder a datos de Excel desde una aplicación Visual Basic.ActiveWorkbook.67. End Class Nota.Quit() m_Excel = Nothing End If .Application. agregar.Application") m_Excel. Lo primero es agregar la referencia a Microsoft Excel.ActiveWorkbook. Ahora.Cells(1.Value) 'Escribir en una celda m_Excel. buscar las de tipo COM y seleccionar de la lista Microsoft Excel 11. 69. Hacerlo es muy sencillo: basta con agregar la referencia de Excel y escribir un sencillo código. con este sencillo código tendremos acceso a Excel: Dim m_Excel As Microsoft. End Try 68.1 del primer libre MsgBox(m_Excel.Office. ya sea para leer datos o para exportar información que ha sido procesada por el programa.xls" m_Excel = CreateObject("Excel. 1).Workbooks. 3). Para ello hay que ir a las propiedades del proyecto.Save() 'Nota: Hay una instruccion como esta: m_Excel. End Sub 70. Ejemplo probado con Excel 2000 y Visual basic Excel y Visual Basic .Application.

.Espero que os sea útil. Hoy día Excel está muy extendido y bastante a menudo tengo que recurrir códigos como este para poder conectar Microsoft Excel con algún programa de Visual Basic.

Sign up to vote on this title
UsefulNot useful