LMNAJP
Usuario (Perú)

Exportar contenido de un DataGrid a un archivo de Excel Como estan, este post como muchos otros que cuelgo estan echos con la finalidad de compartir informacion sobre la programacion en Visual Basic 6.0. En esta oportunidad les paso el codigo de como exportar el contenido de un DataGrid (previamente cargado con un recordset) a un archivo de excel paso a paso. Paso 1: Crear una base de datos de prueba (en este caso utilizaremos access) con una tabla en este caso yo llamare a mi base de datos "PRUEBA" y a mi tabla "TABARTICULOS". La tabla podra tener cuantos campos quieran Nota: La coneccion a la base de datos no es el tema principal realmente el tipo de coneccion no influye en lo que se esta tratando en este post pero si quieren aprender pasen por este post.(reparando enlace) Paso 2: Abrir un nuevo proyecto de Visual Basic 6.0. Paso 3: Agregar las referencias de ado para el proyecto, Menu ProyectoReferencias y en el cuadro de dialogo ubicar y seleccionar "Microsoft ActiveX Data Objects 2.0 Library" (en el caso de conecciones sencillas es el mas recomendable) y ubicar y seleccionar con un check "Microsoft Excel 11.0 Object Library" para poder exportar. Paso 4: Agregar los componentes no predeterminados nesesarios desde la biblioteca de componentes Menu ProyectoComponentes y en el cuadro de dialogo ubicar y seleccionar con un check "Microsoft DataGrid Control 6.0 (SP6) (OLEDB)". Paso 5: Agegar un DataGrid al Formulario con dos CommandButton Nota: al DataGrid lo llamare dgExportar, a los CommandButton cmdCargar y cmdExportar respectivamente Paso 6: Agregar un Modulo .bas al proyecto Ahora el codigo: Esto en el modulo (es la manera de conectar mediante DSN) 'VARIABLES DE CONECCION Public coneccion As New Connection Public rstFacturas As New Recordset 'LA CONECCION Public Sub Conneccion() Set Module1.coneccion = New Connection Module1.coneccion.CursorLocation = adUseClient End Sub 'LA FUNCION QUE CARGA LA TABLA EN EL DATAGRID Public Sub Fun_rstFacturas(Grid As DataGrid) Set rstFacturas = New Recordset rstFacturas.Open "select * from TABARTICULOS", coneccion, adOpenStatic, adLockOptimistic Set Grid.DataSource = rstFacturas End Sub Para cargar la tabla en el DataGrid: Private Sub cmdCargar_Click() Call Conneccion coneccion.Open "DSN=PRUEBA;database=PRUEBA" Call Fun_rstFacturas(Me.dgExportar) End Sub 'Ahora para exportar Private Sub cmdExportar_Click() On Error GoTo ErrorExcel Dim objExcel As Excel.Application Dim HNom As Integer 'Horizontal Dim VNom As Integer 'Vertical Dim Hdatos As Integer 'Horizontal Dim Vdatos As Integer 'Vertical Dim cuentaNombres As Integer Dim cuentadatos As Integer Dim i As Integer Dim n As Integer Dim j As Integer If rstFacturas.RecordCount <> 0 Then 'Crear un objeto del tipo excel.application Set objExcel = New Excel.Application objExcel.Visible = True objExcel.SheetsInNewWorkbook = 1 objExcel.Workbooks.Add 'PONER UN TITULO objExcel.ActiveSheet.Cells(1, 1) = "EJEMPLO DE EXPORTAR A EXCEL" With objExcel.ActiveSheet.Cells(1, 1).Font .Color = vbBlack .Size = 9 .Bold = True End With 'AHORA UN SUBTITULO objExcel.ActiveSheet.Cells(3, 1) = "CONSULTA DE ARTICULOS" With objExcel.ActiveSheet.Cells(3, 1).Font .Color = vbBlack .Size = 9 .Bold = True End With 'UTILIZAMOS LAS VARIABLES PARA LA UBICACION DE NUESTROS TEXTOS HNom = 1 VNom = 7 Vdatos = 8 Hdatos = 1 cuentaNombres = rstFacturas.Fields.Count cuentadatos = rstFacturas.RecordCount 'AGREGAMOS LOS REGISTROS (RECUERDEN QUE NO IMPORTA CUANTAS COLUMNAS O REGISTROS TENGAMOS EL BUCLE_ 'FUNCIONA SEGUN EL NUMERO DE CABECERAS Y REGISTROS For i = 0 To (cuentaNombres - 1) objExcel.ActiveSheet.Cells(VNom, HNom) = Me.dgExportar.Columns(i).Caption 'rstFacturas.Fields(i).Name objExcel.ActiveSheet.Range(objExcel.ActiveSheet.Cells(VNom, HNom), objExcel.ActiveSheet.Cells(VNom, HNom)).HorizontalAlignment = xlHAlignCenterAcrossSelection With objExcel.ActiveSheet.Cells(VNom, HNom).Font .Size = 9 .Color = vbRed .Bold = True End With rstFacturas.MoveFirst For n = 1 To rstFacturas.RecordCount objExcel.ActiveSheet.Cells(Vdatos, Hdatos) = rstFacturas.Fields(i).Value objExcel.ActiveSheet.Cells(Vdatos, Hdatos).Font.Size = 8 Vdatos = Vdatos + 1 rstFacturas.MoveNext Next HNom = HNom + 1 Hdatos = Hdatos + 1 Vdatos = 8 rstFacturas.MoveFirst Next i 'AHORA LE ASIGNAMOS UN TAMAÑO A CADA COLUMNA SEGUN NESECITEMOS objExcel.Columns( "B" ).ColumnWidth = 19.43 objExcel.Columns( "C" ).ColumnWidth = 19.43 objExcel.Columns( "D" ).ColumnWidth = 16.86 objExcel.Columns( "E" ).ColumnWidth = 10.83 End If Exit Sub ErrorExcel: MsgBox Err.Description End Sub Cabe mencionar que este ejemplo puede ser utilizado cuando no dispongamos de Crystal Reports o tengamos algun problema al imprimir por esta misma via.
Proteger u ocultar carpeta (DIrectorio) con un comando batch Que tal en esta ocasion un pequeño post para enseñarles como proteger el acceso a una carpeta privada. ¿Quien no ha querido hacer esto siempre? ... que nadie pueda ver lo que tenemos en nuestra carpeta ... bueno ahi les va. Paso 1: Creamos un nuevo archivo de texto en donde queramos en este caso yo tengo una carpeta que se llama "Bloquear Carpeta" que es donde almacenare mis archivos de acceso y restricción. Paso 2: Creamos el directorio a bloquear o ubicamos la carpeta existente que queramos proteger. Paso 3: Abrimos al archivo de texto que creamos en el paso 1 y escribimos el comando que protegerá la carpeta: ren "D:CarpetaPrueba" Panel.{21EC2020-3AEA-1069-A2DD-08002B30309D} Como nos damos cuenta la carpeta que protegeremos en este caso esta ubicada en el disco D: con el nombre CarpetaPrueba, si la carpeta esta ubicada en otro directoria se debe agregar todo el path o direccion de la carpeta. Paso 4: Guardamos el archivo de texto con la extension .bat, vamos al menu "Guardar" ("Guardar como" si el archivo no es nuevo) le asignamos un nombre por ejemplo Bloquear, de tipo "Todos los archivos" y de Codificación "ANSI" que es la predeterminada, por ultimo le asignamos la extensión .bat al nombre del archivo y cerramos el block de notas después que haya guardado, quedara asi: Paso 5: Ejecutamos el archivo .bat creado anteriormente, ubicamos la carpeta que hemos protegido y nos percataremos que nuestra carpeta ha cambiado de icono,de nombre y ha adoptado una extension, llamemosle extraña muy extensa, si es asi quiere decir que nuestra carpeta ya esta protegida. Lo que se hizo realmente es redireccionar el acceso a nuestra carpeta y desviarlo hacia el panel de control. Si tratamos de abir la carpeta con el nombre panel y esa extension extraña nos direccionara hacia el panel de control de windows. Paso 6: Para Liberar la carpeta y volver a usarla normalmente se deben repetir todos los pasos anteriores con la diferencia que se debe crear un nuevo block de notas con el codigo: ren "Danel.{21EC2020-3AEA-1069-A2DD-08002B30309D}" CarpetaPrueba De preferencia le ponen un nombre clave para que nadie sepa para que sirve. Ejecutamos ese nuevo archivo .bat y nuestra carpeta volvera a ser la misma de antes Nota: En el momento en que se crea el .bat para bloquear podemos cambiar el nombre de salida es decir en vez de ser "Panel.{21EC2020-3AEA-1069-A2DD-08002B30309D}" podria ser con un nombre distinto para no despertar dudas, logicamente el archivo de desbloqueo tambien debera ser modificado segun el nombre que hayamos asignado al bloquear. Es asi como podemos proteger nuestra carpeta personal. Yo en lo personal el codigo para abrir la carpeta lo llevo en mi usb para que no este a la mano
Alojar Archivos .swf e ubicarlos en nuestro post En esta oportunidad mostrare como y donde alojar un archivo de tipo .swf y mostrarlo en nuestra web o post.Tenemos nuestro archivo .swf creado de preferencia que sea sencillo de un tamaño estándar y que no pese demasiado. Paso 1: Vamos al navegador y ubicamos la siguiente direccion "http://megaswf.com" Paso 2: Nos Logueamos, sino contamos con una cuenta nos registramos en la parte superior que dice "Welcome guest. Please login or register." Nota: Si no contamos con una cuenta en esta web los siguientes pasos se podran realizar a diferencia de que los archivos que subamos seran publicos. Paso 3: Luego de ingresar como usuario (o caso contrario) veremos en el lado izquierdo un boton que dice Browse, clickeamos en el y nos abrira el cuadro de dialogo para seleccionar nuestro archivo, seleccionamos nuestro .swf y le damos aceptar.La web nos direccionara a otra pantalla donde se encuentra la vista de nuestro archivo .swf. Hasta aqui ya sabemos alojarlo en esta web para nuestro uso ahora a ubicarlo en nuestro post o web Paso 4: Este paso es un poco confuso, yo cuento con tres tipos de navegadores, Google Chrome, Mozilla Firefox y nuestro viejo Internet Explorer (que por cierto no lo tengo actualizado). Usaremos 2 de estos, Google Chrome y Mozilla Firefox. Copiamos la direccion completa de la vista de nuestro .swf que acabamos de subir, en mi caso es "http://megaswf.com/serve/35859/" y lo pegamos en el Mozilla. Nota: Por alguna razon el Mozilla que tengo, apesar de las actualizaciones no muetra el archivo .swf pero ese no sera impedimento para lograr nuestro objetivo. Paso 5: Despues que la pagina cargo en Mozilla damos click derecho sobre una zona vacia y clickeamos en "Ver informacion de la pagina", se nos mostrara una cuadro de dialogo, damos click en la segunda pestaña "Medios". Paso 6: Nos percataremos rapidamente de una lista, son los distntos objetos que se encuentran en la web que estamos navegando, si nos desplegamos por la lista veremos que las propiedades que se describen en la parte media del cuadro de dialogo cambian segun el objeto que seleccionemos, en este caso queremos el archivo que sea de tipo "application/x-shockwave-flash", puede haber uno o varios en una sola web. damos click derecho sobre el item seleccionado en la lista y le damos copiar. Paso 7: Quiero aclarar que en este caso vamos a colocar nuestro archivo .swf en un post de taringa ya que no he probado en algun "embed", le damos click a "Insertar Archivo SWF" y pegamos lo copiado. El resultado: Nota: debes probar el texto copiado del cuadro de dialogo de mozilla ya que posiblemente te muestre un mensaje de "Access denied", vuele a repetir los pasos apartir del nro 4 si sucede esto. Tambien es problabe que al ver este post los swf no se muestren porque en el servidor de alojamiento los indices de los archivos son cambiantes. Este post esta basado en informar como obtener la url del .swf y copiarla en algun "embed" o en este caso "Insertar Archivo SWF".
TreeView con base de datos (Visual Basic 6.0) Que tal Taringueros, en este post explicare brevemente como usar un treeview con base de datos y extraer datos segun la Key almacenada al cargar, comencemos: Nota: Obviaremos algunos pasos que los he explicado en post anteriores como por ejemplo agregar componentes o la muy conocida coneccion a la base de datos. Utilizaremos un solo formulario, un control TreeView y un modulo para las conecciones Paso 1: Crear una base de datos de prueba (en este caso utilizaremos access) con una tabla en este caso yo llamare a mi base de datos "EJEMPLOS" y a mi tabla "TABUSUARIOS". Paso 2: Abrir un nuevo proyecto de Visual Basic 6.0. Paso 3: Agregar las referencias de ado para el proyecto, Menu Proyecto Referencias y en el cuadro de dialogo ubicar y seleccionar "Microsoft ActiveX Data Objects 2.0 Library" (en el caso de conecciones sencillas es el mas recomendable) y ubicar y seleccionar con un check y tambien "Microsoft ADO Ext. 2.8 for DLL and Security" para obtener lla cantidad de tablas en la base de datos. Paso 4: Agregar los componentes no predeterminados nesesarios desde la biblioteca de componentes Menu Proyecto Componentes y en el cuadro de dialogo ubicar y seleccionar con un check " Microsoft Windows Common Controls 6.0 (SP6) " que es donde esta almacenado el TreeView y "Microsoft DataGrid Control 6.0 (OLEDB)" para utilizar la grilla. Paso 5: Agregar un Nuevo Formulario aparte del que esta como predeterminado. Nota: Los formularios se llamaran frmTreeView (el predeterminado) y frmMuestra que nos servira para mostrar los datos obtenidos en la consulta Paso 6: Agegar un TreeView al frmTreeView y un imageList para las imagenes del comportamiento del TreeView. Paso 7: Agregar un DataGrid en el formulario frmMuestra. Paso 8: Agregar un Modulo .bas al proyecto. Paso 9: Agregamos un Menu en frmTreeView (con el editor de menu) con el Nombre mnuDatos y un submenu con el nombre subVer, esto nos servira para el menu contextual que nos permitira consultar los datos del registro seleccionado. Ahora el Codigo: Este Codigo (en el modulo .bas) genera la coneccion a la base de datos mediante DSN del Sistema. 'Variables de Coneccion Public cn As New Connection Public rsTabla As New Recordset 'En este caso utilizaremos el "Sub Main" para ejecutar la coneccion y la muetra de los datos en el TreeView de un solo golpe Sub Main() Call Coneccion Call AbrirTablaLectura(rsTabla, "TABUSUARIOS"; ) frmTreeView.Show End Sub 'La coneccion Public Sub Coneccion() Set cn = New Connection cn.CursorLocation = adUseClient cn.Open "DSN=EJEMPLOS;database=EJEMPLOS", "", "" End Sub 'Procedimiento que abre la tabla Public Sub AbrirTabla(rs As Recordset, NomTabla As String) Set rs = New ADODB.Recordset rs.CursorLocation = adUseServer rs.Open NomTabla, cn, adOpenStatic, adLockReadOnly, adCmdTable End Sub Ahora el codigo en frmTreeView: 'Primero crearemos un procedimiento para cargar el TreeView: Public Sub Obtener_Datos() Dim n As Integer 'Variable para bucle for Dim x As Integer 'Variable para bucle for Dim Nodo As Node 'Variable para crear el nodo Dim oCatalog As New ADOX.Catalog 'Variable para cargar el esquema de la base de datos Dim Tablas As ADOX.Tables 'Variable para obtener las tablas en la base de datos Set oCatalog.ActiveConnection = cn 'Cargamos el esquema de la base de datos Set Tablas = oCatalog.Tables 'Pasamos el esquema de tablas a la variable With TreeView1 .Nodes.Clear 'Limpiamos el control For x = 6 To Tablas.Count - 1 'For que cargara las tablas Set Nodo = .Nodes.Add(, tvwFirst, Tablas.Item(x).Name, Tablas.Item(x).Name, Me.ImageList1.ListImages("Usuario" ).Key) 'Aca se carga el Nodo de tipo tvwFirst que funcionara como raiz Nodo.Expanded = True 'Expandimos el Nodo (Raiz) Call AbrirTablaLectura(rsTabla, Tablas.Item(x).Name) 'Cargamos la tabla que hemos obtenido con el esquema de en la variable "Tablas" If rsTabla.RecordCount > 0 Then 'Confirmamos si hay registros For n = 0 To rsTabla.RecordCount - 1 'For para cargar los registros de la tabla Set Nodo = TreeView1.Nodes.Add(Tablas.Item(x).Name, tvwChild, "NODE_" & rsTabla(0), rsTabla(0), Me.ImageList1.ListImages("normal" ).Key, Me.ImageList1.ListImages("seleccionada" ).Key) 'Cargamos Nodos de tipo tvwChild con cada registro de la tabla rsTabla.MoveNext 'Siguiente registro Next Else 'En caso no hayan registros en la tabla .Nodes.Clear Set Nodo = .Nodes.Add(, tvwFirst, "nodo", "NO HAY DATOS EN LA TABLA", Me.ImageList1.ListImages("Usuario" ).Key) 'Un nodo tipo Raiz para hacer mencion a la tabla End If Next 'Pasamos a cargar la siguiente tabla End With 'dejamos vacias las variables Set oCatalog = Nothing Set Tabla = Nothing End Sub 'Este pequeño procedimiento en el TreeView nos almacena el nombre de la tabla que se muestra en el nodo tipo tvwFirst o raiz, nos servira para abrir la tabla con nuestro procedimiento AbrirTablaLectura Private Sub TreeView1_NodeClick(ByVal Node As MSComctlLib.Node) On Error Resume Next xNomTabla = Node.Parent End Sub 'Cargamos el procedimiento con la carga del Formulario Private Sub Form_Load() Call Obtener_Datos End Sub 'Este codigo es en el menu para obtener los datos del registro seleccionado 'Esta parte puede resultar un poco confusa ya que utilizamos 2 recorset para abrir la misma tabla uno nos proveera del nombre de la primera columna que es con la que identificaremos el registro y el otro abrira la tabla segun el criterio ya obtenido al seleccionar el item en el TreeView Private Sub subVer_Click() Dim n As Integer Dim rs As New Recordset Dim rsMuestra As New Recordset Dim xSQL As String Call AbrirTablaLectura(rs, xNomTabla) Set rsMuestra = New Recordset xSQL = "SELECT * FROM " & xNomTabla & " WHERE " & rs.Fields(0).Properties.Item(1).Value & "='" & Mid(Me.TreeView1.SelectedItem.Key, 6, Len(Me.TreeView1.SelectedItem.Key)) & "'" 'En la sentencia sql abrimos la tabla almacenada en xNomTabla pidiendo como criterio el dato seleccionado en TreeView (extraido con la funcion MID) en el campo obtenido con el recorset RS With rsMuestra .Open xSQL, cn, adOpenKeyset, adLockOptimistic End With With rsMuestra If .RecordCount <> 0 Then Set frmMuestra.DataGrid1.DataSource = rsMuestra 'Pasamos el recordset al DataGrid en el frmMuestra frmMuestra.Show vbModal 'Y mostramos en Modal End If End With End Sub 'Esto nos mostrara el menu Contextual haciendo click derecho sobre el TreeView Private Sub TreeView1_MouseUp(Button As Integer, Shift As Integer, x As Single, y As Single) If Button = 2 Then PopupMenu mnuDatos End If End Sub En mi opinion el Control TreeView es muy tedioso en el momento de la programacion pero muy util cuando queremos hacer este tipo de consultas a varias vistas. Suerte y Gracias
Exportar contenido de un DataGrid a un archivo de Excel Como estan, este post como muchos otros que cuelgo estan echos con la finalidad de compartir informacion sobre la programacion en Visual Basic 6.0. En esta oportunidad les paso el codigo de como exportar el contenido de un DataGrid (previamente cargado con un recordset) a un archivo de excel paso a paso. Paso 1: Crear una base de datos de prueba (en este caso utilizaremos access) con una tabla en este caso yo llamare a mi base de datos "PRUEBA" y a mi tabla "TABARTICULOS". La tabla podra tener cuantos campos quieran Nota: La coneccion a la base de datos no es el tema principal realmente el tipo de coneccion no influye en lo que se esta tratando en este post pero si quieren aprender pasen por este post.(reparando enlace) Paso 2: Abrir un nuevo proyecto de Visual Basic 6.0. Paso 3: Agregar las referencias de ado para el proyecto, Menu ProyectoReferencias y en el cuadro de dialogo ubicar y seleccionar "Microsoft ActiveX Data Objects 2.0 Library" (en el caso de conecciones sencillas es el mas recomendable) y ubicar y seleccionar con un check "Microsoft Excel 11.0 Object Library" para poder exportar. Paso 4: Agregar los componentes no predeterminados nesesarios desde la biblioteca de componentes Menu ProyectoComponentes y en el cuadro de dialogo ubicar y seleccionar con un check "Microsoft DataGrid Control 6.0 (SP6) (OLEDB)". Paso 5: Agegar un DataGrid al Formulario con dos CommandButton Nota: al DataGrid lo llamare dgExportar, a los CommandButton cmdCargar y cmdExportar respectivamente Paso 6: Agregar un Modulo .bas al proyecto Ahora el codigo: Esto en el modulo (es la manera de conectar mediante DSN) 'VARIABLES DE CONECCION Public coneccion As New Connection Public rstFacturas As New Recordset 'LA CONECCION Public Sub Conneccion() Set Module1.coneccion = New Connection Module1.coneccion.CursorLocation = adUseClient End Sub 'LA FUNCION QUE CARGA LA TABLA EN EL DATAGRID Public Sub Fun_rstFacturas(Grid As DataGrid) Set rstFacturas = New Recordset rstFacturas.Open "select * from TABARTICULOS", coneccion, adOpenStatic, adLockOptimistic Set Grid.DataSource = rstFacturas End Sub Para cargar la tabla en el DataGrid: Private Sub cmdCargar_Click() Call Conneccion coneccion.Open "DSN=PRUEBA;database=PRUEBA" Call Fun_rstFacturas(Me.dgExportar) End Sub 'Ahora para exportar Private Sub cmdExportar_Click() On Error GoTo ErrorExcel Dim objExcel As Excel.Application Dim HNom As Integer 'Horizontal Dim VNom As Integer 'Vertical Dim Hdatos As Integer 'Horizontal Dim Vdatos As Integer 'Vertical Dim cuentaNombres As Integer Dim cuentadatos As Integer Dim i As Integer Dim n As Integer Dim j As Integer If rstFacturas.RecordCount <> 0 Then 'Crear un objeto del tipo excel.application Set objExcel = New Excel.Application objExcel.Visible = True objExcel.SheetsInNewWorkbook = 1 objExcel.Workbooks.Add 'PONER UN TITULO objExcel.ActiveSheet.Cells(1, 1) = "EJEMPLO DE EXPORTAR A EXCEL" With objExcel.ActiveSheet.Cells(1, 1).Font .Color = vbBlack .Size = 9 .Bold = True End With 'AHORA UN SUBTITULO objExcel.ActiveSheet.Cells(3, 1) = "CONSULTA DE ARTICULOS" With objExcel.ActiveSheet.Cells(3, 1).Font .Color = vbBlack .Size = 9 .Bold = True End With 'UTILIZAMOS LAS VARIABLES PARA LA UBICACION DE NUESTROS TEXTOS HNom = 1 VNom = 7 Vdatos = 8 Hdatos = 1 cuentaNombres = rstFacturas.Fields.Count cuentadatos = rstFacturas.RecordCount 'AGREGAMOS LOS REGISTROS (RECUERDEN QUE NO IMPORTA CUANTAS COLUMNAS O REGISTROS TENGAMOS EL BUCLE_ 'FUNCIONA SEGUN EL NUMERO DE CABECERAS Y REGISTROS For i = 0 To (cuentaNombres - 1) objExcel.ActiveSheet.Cells(VNom, HNom) = Me.dgExportar.Columns(i).Caption 'rstFacturas.Fields(i).Name objExcel.ActiveSheet.Range(objExcel.ActiveSheet.Cells(VNom, HNom), objExcel.ActiveSheet.Cells(VNom, HNom)).HorizontalAlignment = xlHAlignCenterAcrossSelection With objExcel.ActiveSheet.Cells(VNom, HNom).Font .Size = 9 .Color = vbRed .Bold = True End With rstFacturas.MoveFirst For n = 1 To rstFacturas.RecordCount objExcel.ActiveSheet.Cells(Vdatos, Hdatos) = rstFacturas.Fields(i).Value objExcel.ActiveSheet.Cells(Vdatos, Hdatos).Font.Size = 8 Vdatos = Vdatos + 1 rstFacturas.MoveNext Next HNom = HNom + 1 Hdatos = Hdatos + 1 Vdatos = 8 rstFacturas.MoveFirst Next i 'AHORA LE ASIGNAMOS UN TAMAÑO A CADA COLUMNA SEGUN NESECITEMOS objExcel.Columns( "B" ).ColumnWidth = 19.43 objExcel.Columns( "C" ).ColumnWidth = 19.43 objExcel.Columns( "D" ).ColumnWidth = 16.86 objExcel.Columns( "E" ).ColumnWidth = 10.83 End If Exit Sub ErrorExcel: MsgBox Err.Description End Sub Cabe mencionar que este ejemplo puede ser utilizado cuando no dispongamos de Crystal Reports o tengamos algun problema al imprimir por esta misma via.