Foros del Web » Programación para mayores de 30 ;) » Programación General » Visual Basic clásico »

Exportar de un Flexgrid o un dat a excel.

Estas en el tema de Exportar de un Flexgrid o un dat a excel. en el foro de Visual Basic clásico en Foros del Web. Hola compañeros! Podriais ayudarme, tengo tres consultas del mismo tema de excel o mejor dicho VB a Excel ibiceversa. Os comento .: Por un lado ...
  #1 (permalink)  
Antiguo 20/08/2010, 04:41
Avatar de XYON126  
Fecha de Ingreso: abril-2006
Mensajes: 272
Antigüedad: 13 años, 10 meses
Puntos: 0
Exportar de un Flexgrid o un dat a excel.

Hola compañeros!

Podriais ayudarme, tengo tres consultas del mismo tema de excel o mejor dicho VB a Excel ibiceversa. Os comento .:

Por un lado necesito pasar datos de Flexgrid a Excel, nuestro compañero GeoAvila posteo este codigo .:

http://www.forosdelweb.com/1060044-post61.html

pero el problema que le encuentro y algunos que me conoceis ya de este foro, es que no me guasta copiar y pegar sino saber el porque y aprender, este codigo tiene dos funciones pero en ninguna me dice ni como utilizarlas, ni para que utilizarlas asi como si van en un Modulo o simplemente como función y punto.
Por otro lado u otra consulta como hay que activar o hacer para conectar VB con Excel púes supongo que debe tener relación sobre conexiones ADO pero no se como.
Y finalmente teniendo por ejemplo un archivo .dat se puede utilizar un sistema similar a pasar datos de .dat a Flexgrid de .dat a Excel ¿Como?

Un saludo y mil gracias por adelantado.
  #2 (permalink)  
Antiguo 20/08/2010, 06:32
Avatar de XYON126  
Fecha de Ingreso: abril-2006
Mensajes: 272
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: Exportar de un Flexgrid o un dat a excel.

Hola!

He estado probando un codigo de esta pag. :

http://www.recursosvisualbasic.com.a...-a-excel.htm#1

y si en la linea de codigo del boton como indican cambio el path no me funciona, en cambio tal como esta en el codigo si pero me lo guarda en el directorio de VB//VB98. ¿Podriais indicarme porque?

Muchas gracias.

codigo boton original.:

Código vb:
Ver original
  1. ' -------------------------------------------------------------------------------------------
  2. ' \\ -- Botón para importar datos en un nuevo libro
  3. ' -------------------------------------------------------------------------------------------
  4. Private Sub Command1_Click()
  5.     If Exportar_Excel(App.Path & "\libro1.xls", MSHFlexGrid1) Then
  6.         MsgBox " Datos exportados en " & App.Path, vbInformation
  7.     End If
  8. End Sub
  9. '

codigo boton modificado.:

Código vb:
Ver original
  1. Private Sub cmd_excel_Click()
  2. If Exportar_Excel(App.Path & "Y:\libro1.xls", MSFlexGrid1) Then
  3.          MsgBox " Datos exportados en " & App.Path, vbInformation
  4. End If
  5. End Sub
  #3 (permalink)  
Antiguo 20/08/2010, 06:48
Avatar de XYON126  
Fecha de Ingreso: abril-2006
Mensajes: 272
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: Exportar de un Flexgrid o un dat a excel.

hola!

Ya he encontrado el error, era este .:

Código vb:
Ver original
  1. ' -------------------------------------------------------------------------------------------
  2. ' \\ -- Botón para importar datos en un nuevo libro
  3. ' -------------------------------------------------------------------------------------------
  4. Private Sub Command1_Click()
  5.     If Exportar_Excel("Y:\libro1.xls", MSFlexGrid1) Then
  6.         MsgBox " Datos exportados en " & App.Path, vbInformation
  7.     End If
  8. End Sub

en la linea puse .: If Exportar_Excel((App.Path & "Y:\libro1.xls", MSFlexGrid1) Then
en vez de esto .: If Exportar_Excel(("Y:\libro1.xls", MSFlexGrid1) Then

debia de eliminar la parte roja;ahora solo me queda estudiar el codigo el porque de cada cosa.

Espero esto le sirva a alguien como a mi, si alguien me puede ayudar ahora con el .dat se lo agradeceria.

Un saludo
  #4 (permalink)  
Antiguo 20/08/2010, 07:30
Avatar de XYON126  
Fecha de Ingreso: abril-2006
Mensajes: 272
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: Exportar de un Flexgrid o un dat a excel.

hola otra vez!

Despues de mirarme el codigo comentado no soy capaz de encontrar como exportar tambien las cabeceras del MSFlexgrid.

¿Podriais ayudarme? la parte del codigo de carga es esta.:

Código vb:
Ver original
  1. Public Function Exportar_Excel(sBookFileName As String, FlexGrid As Object, Optional sNameSheet As String = vbNullString) As Boolean
  2.  
  3.     On Error GoTo Error_Handler
  4.  
  5.     Dim o_Excel     As Object
  6.     Dim o_Libro     As Object
  7.     Dim o_Hoja      As Object
  8.     Dim Fila        As Long
  9.     Dim Columna     As Long
  10.  
  11.     ' -- Error en la ruta del libro
  12.    If sBookFileName = vbNullString Or Len(Dir(sBookFileName)) = 0 Then
  13.        
  14.         MsgBox " Falta el Path del archivo de Excel o no se ha encontrado el libro en la ruta especificada ", vbCritical
  15.         Exit Function
  16.     End If
  17.    
  18.     ' -- Crea el objeto Excel, el objeto workBook y el objeto sheet
  19.    Set o_Excel = CreateObject("Excel.Application")
  20.     Set o_Libro = o_Excel.Workbooks.open(sBookFileName)
  21.     ' -- Comprobar si se abre la hoja por defecto, o la indicada en el parámetro de la función
  22.    If Len(sNameSheet) = 0 Then
  23.         Set o_Hoja = o_Libro.Worksheets(1)
  24.     Else
  25.         Set o_Hoja = o_Libro.Worksheets(sNameSheet)
  26.     End If
  27.     ' -- Bucle para Exportar los datos
  28.    With FlexGrid
  29.         For Fila = 1 To .Rows - 1
  30.             For Columna = 0 To .Cols - 1
  31.                 o_Hoja.Cells(Fila, Columna + 1).Value = .TextMatrix(Fila, Columna)
  32.             Next
  33.         Next
  34.     End With
  35.     ' -- Cerrar libro y guardar los datos
  36.    o_Libro.Close True
  37.     ' -- Cerrar Excel
  38.    o_Excel.Quit
  39.     ' -- Terminar instancias
  40.    Call ReleaseObjects(o_Excel, o_Libro, o_Hoja)
  41.     Exportar_Excel = True
  42. Exit Function
  43.  
  44. ' -- Controlador de Errores
  45. Error_Handler:
  46.     ' -- Cierra la hoja y el la aplicación Excel
  47.    If Not o_Libro Is Nothing Then: o_Libro.Close False
  48.     If Not o_Excel Is Nothing Then: o_Excel.Quit
  49.     Call ReleaseObjects(o_Excel, o_Libro, o_Hoja)
  50.     MsgBox Err.Description, vbCritical
  51. End Function


Muchas gracias

Un saludo
  #5 (permalink)  
Antiguo 21/08/2010, 03:56
Avatar de erbuson  
Fecha de Ingreso: noviembre-2009
Mensajes: 701
Antigüedad: 10 años, 3 meses
Puntos: 53
Respuesta: Exportar de un Flexgrid o un dat a excel.

Hola Xyon:

Estoy de vacaciones y de casualidad he leido tu post amigo mio, creo que el problema está en la primera linea del grid que se exporta:

For Fila = 1 To .Rows - 1

Debería empezar en la 0 que es precisamente la de cabecera

For Fila = 0 To .Rows - 1

Respecto a tu otra pregunta de exportar el DAT a Excel, una vez que domines la de exportar el Grid, yo te aconsejaría lo siguiente, carga los datos del DAT en un GRID, así puedes ver si cargas los datos bien, después exportas el Grid y listos.

Si no quieres que se vea este proceso es muy simple, oculta el grid ya que puedes trabajar con el igualmente aunque esté oculto y problema resuelto.

La gran ventaja que tiene esta opción, en mi opinión, es que si aplicas algun cambio al Exportador de Grid a Excel, automaticamente y sin hacer nada estas aplicando ya el cambio sobre el DAT a Excel ya que primero lo pasas por el Grid.

Saludos

Edito mensaje para comentar que deberás modificar además la siguiente linea ya que al empezar Fila en 0 deberá ser tambien Fila + 1

o_Hoja.Cells(Fila + 1, Columna + 1).Value = .TextMatrix(Fila, Columna)
__________________
Agradecer a quien te enseñó, es enseñar lo que de él aprendiste.
Recuerda: Decir gracias, poco cuesta y mucho vale ...

Última edición por erbuson; 21/08/2010 a las 14:09
  #6 (permalink)  
Antiguo 22/08/2010, 02:51
Avatar de XYON126  
Fecha de Ingreso: abril-2006
Mensajes: 272
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: Exportar de un Flexgrid o un dat a excel.

hola erbuson!

Espero disfrutes de las vacas, yo tambien estoy pero supongo que como a todos cuando hay algo que te gusta hasta en vacas lo haces. Bueno he probado lo que me has comentado y te puedo decir que gracias a tus enseñanzas lo de la linea de

Cita:
For Fila = 1 To .Rows - 1

Debería empezar en la 0 que es precisamente la de cabecera

For Fila = 0 To .Rows - 1
es lo primero que modifique antes de postear pero me daba error y no veia porque, cuando me has comentado lo de la otra lina, esta

Cita:
o_Hoja.Cells(Fila + 1, Columna + 1).Value = .TextMatrix(Fila, Columna)
es cuando lo he visto pero me surge un problema, como bien conoces esto es para aquel programa que inicie hace tiempo y ahora estoy en la fase de la exportación de excel y acces(esto mas tarde) aparte de unos problemillas que he detectado con el programa a la hora de visualizar semanas, en principio, corrigeme, este codigo de grabar a excel es solo para el Grid activo, en mi grid activo lo que se ve es esto .:



y en cambio cuando miro el archivo Excel la primera fila en vez de ponerme 29,27,29,1 y 2 que es la fecha me pone todas las celdas con 0:00:00 ¿Porque?

Otra pregunta si en vez de un grid es un Textbox o un combobox ¿Como seria el Whit o proceso de carga asi?

Código vb:
Ver original
  1. ' -- Bucle para Exportar los datos
  2.                   o_Hoja.Cells=combobox1
  3.                    o_Hoja.Cells=cTextbox1

Y finalmente como puedo hacer para ir sumando información al Excel pues este codigo lo que me hace es cargar siempre en uno y punto; al mismo, o me da error, o me pide otro haciendo una copia.

Un saludo

Última edición por XYON126; 22/08/2010 a las 03:06
  #7 (permalink)  
Antiguo 22/08/2010, 16:17
Avatar de erbuson  
Fecha de Ingreso: noviembre-2009
Mensajes: 701
Antigüedad: 10 años, 3 meses
Puntos: 53
Respuesta: Exportar de un Flexgrid o un dat a excel.

Hola Xyon:

Primero te explico la segunda pregunta, ya que es IMPRESCINDIBLE que entiendas perfectamente el With y el funcionamiento de la rutina para que puedas corregirla en el futuro.

Código vb:
Ver original
  1. ' -- Bucle para Exportar los datos
  2. With FlexGrid
  3.     For Fila = 0 To .Rows - 1
  4.       For Columna = 0 To .Cols - 1
  5.          o_Hoja.Cells(Fila + 1, Columna + 1).Value = .TextMatrix(Fila, Columna)
  6.       Next
  7.     Next
  8. End With
El With se emplea para simplificar el proceso de escritura o sea que en este ejemplo, lo escrito arriba es lo mismo que esto:

Código vb:
Ver original
  1. ' -- Bucle para Exportar los datos
  2.    For Fila = 0 To FlexGrid.Rows - 1
  3.       For Columna = 0 To FlexGrid.Cols - 1
  4.          o_Hoja.Cells(Fila + 1, Columna + 1).Value = FlexGrid.TextMatrix(Fila, Columna)
  5.       Next
  6.     Next
Perdona si te explico algo que tu ya sabes, pero me conoces y sabes que mi única intención es que se comprenda mi explicación.

En este caso evidentemente debe utilizarse un bucle For que recorra todas las filas y dentro de este un bucle anidado For que recorra todas las columnas de cada fila y esto es porque estamos procesando un control FlexGrid que es algo muy similar a una Hoja de Cálculo, la unica diferencia esta en que el FlexGrid empieza en Fila 0 y Columna 0 y la Hoja de Excel en Fila 1 Columna 1 por esto el hecho de sumar 1 a Fila y Columna de la Hoja con el fin de que 0,0 del FlexGrid se convierta en 1,1 de la Hoja.

Por esto, no tiene sentido tu pregunta de como hacerlo cuando se trata de un TextBox o un ComboBox ya que en este caso tan sólo tienes que indicar en que Fila y Columna de la Hoja Excel quieres el dato y esto evidentemente no puede formar parte de un bucle ya que no tiene razon de ser.

Estas indicando en tu ejemplo o_Hoja.Cells=cTextbox1 y esto te provocaría un error ya que debes indicarle Fila y Columna donde quieres que vaya el valor del cTextBox1 por ejemplo o_Hoja.Cells(1,5)=cTextbox1 'Fila 1 Columna 5 o realmente Columna E en Excel, aunque debes indicarle el 5, no vale la E)

Espero que se entienda clara mi explicación.

Respecto la otra pregunta seguramente se trata de un problema en el formato de los datos en Excel ya que por lo que veo casi toda la columna son HORAS y tal vez sea un problema del formato automático que excel aplica según los datos recibidos.

Comprueba si cuando entras en Excel sobre una celda de las que indicas estas viendo en la barra de formulas el numero real o ves el 0:00:00

De todos modos, haz por otra parte la prueba de quitar el .Value en la siguiente sentencia a ver que pasa, si funciona te explico el porque ya que es un poco de intuición y te daré un consejo para mejorar la rutina de exportación del FlexGrid a Excel.

o_Hoja.Cells(Fila + 1, Columna + 1).Value = FlexGrid.TextMatrix(Fila, Columna)

Saludos
__________________
Agradecer a quien te enseñó, es enseñar lo que de él aprendiste.
Recuerda: Decir gracias, poco cuesta y mucho vale ...
  #8 (permalink)  
Antiguo 23/08/2010, 06:37
Avatar de XYON126  
Fecha de Ingreso: abril-2006
Mensajes: 272
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: Exportar de un Flexgrid o un dat a excel.

Hola erbuson!

Muchisimas gracias por la explicación, cierto lo que dices referente al textbox y flexgrid, "mea culpa" pues la pregunta la he planteado mal aunque tu me la has explicado bien, púes realmente a lo que me referia era al formato del comando .:

o_Hoja.Cells(1,5)=cTextbox1

pues aunque me imaginaba que irian por ahi los tiros, no estaba muy seguro lo de la celda de Excel, de echo y lo que corre por mi mente púes no siempre puedes utilizar según para que el Flexgrid (en mi caso ahora es un problema de dar de alta en Windows el componente del Flexgrid, pues puedo utilizar macros realizados por mi pero no soy administrador y según que API,s no las reconoce?) era leer los datos del .dat, guardarlos en un ARRAY y de aqui pasarlos a Excel por un lado y por otro, de ahi como añadir datos al Excel, leer los datos de entrada de un combo o textbox y ademas de lo que deben realizar guardarlos en un Excel, por ejemplo.:

Tener un comando para renombrar planos Técnicos y al mismo tiempo guardar ese nombre de plano y archivo en un listado excel o una BBDD Acces. Me has captado ahora el porque de la consulta. De ahi procede esta nueva .:

¿Es posible que en la orden o_Hoja.Cells(1,5)=cTextbox1 en vez de ser .Cell(1,5) sea .Cell(a,b) siendo a y b una variable? y asi poder hacer una función de carga con un For/Next?.

Referente a lo del Excel
Cita:
Respecto la otra pregunta seguramente se trata de un problema en el formato de los datos en Excel ya que por lo que veo casi toda la columna son HORAS y tal vez sea un problema del formato automático que excel aplica según los datos recibidos.

Comprueba si cuando entras en Excel sobre una celda de las que indicas estas viendo en la barra de formulas el numero real o ves el 0:00:00

De todos modos, haz por otra parte la prueba de quitar el .Value en la siguiente sentencia a ver que pasa, si funciona te explico el porque ya que es un poco de intuición y te daré un consejo para mejorar la rutina de exportación del FlexGrid a Excel.
he verificado la respuesta en excel y la celda, su valor es "28-01-1900 0:00:00" y formato "Personalizado h:mm:ss" que posteriormente he cambiado en el Excel en una celda por "Personalizado dd" y ha salido su valor real, por otro lado he probado esto con el .Value eliminado y sin eliminarlo y el resultado ha sido el mismo, con lo que deduzco que he de cambiar el formato al enviarlo para estos datos y a partir de la fila 1 dejarlos como en su origen por lo que confirmamelo porfa deberia hacer por ejemplo un case para la linea 0 del flexgrid y otro a partir de la linea 1, ¿Es asi?

Un saludote
  #9 (permalink)  
Antiguo 23/08/2010, 07:22
Avatar de erbuson  
Fecha de Ingreso: noviembre-2009
Mensajes: 701
Antigüedad: 10 años, 3 meses
Puntos: 53
Respuesta: Exportar de un Flexgrid o un dat a excel.

Hola Xyon:

Efectivamente debo contestarte SI a la primera de las preguntas ya que como es lógico lo mismo es .Cells(Fila, Columna) que .Cells(Y,X) y cuando hablas de la funcion de carga supongo que estas haciendo referencia al comentario anterior que decias de cargar los datos en una matrizde X Filas Y Columnas, y así utilizar la Matriz como si un FlexGrid se tratara ya que son en estructura idénticos.

En relación con la segunda tambien estás en el camino correcto, aunque yo no utilizaría un CASE sino tan sólo un IF ya que creo que es mas facil de entender

If Fila = 0 Then ' Cabecera
...
Else ' Detalle
...
End If

Cuando te decia a darte un consejo, me refería a que además de poner el valor en la celda (Cells) correspondiente, le puede dar un formato a la misma, yo por ejemplo acostumbro a utilizar los siguientes:

Para Importes con decimales o_Hoja.Cells(F, C).NumberFormat = "#,##0.00"
Para Numeros sin decimales o_Hoja.Cells(F, C).NumberFormat = "#,##0"
Para Fechas, fuerzo valor Date o_Hoja.Cells(F, C) = CDate(MiDato)
Para Cadenas de Texto directo o_Hoja.Cells(F, C) = Cadena
Un número que deseo sea tratado como Cadena o_Hoja.Cells(F, C) = "'" & Numero

En este último caso como ves le añado delante una comilla, tal cual hace Excel.

Como puedes ver, cuando le asigno el valor NUNCA utilizo la opción .Value ya que creo es la propiedad por omisión, pero supongo que el resultado es el mismo.

Saludos
__________________
Agradecer a quien te enseñó, es enseñar lo que de él aprendiste.
Recuerda: Decir gracias, poco cuesta y mucho vale ...
  #10 (permalink)  
Antiguo 23/08/2010, 10:35
Avatar de XYON126  
Fecha de Ingreso: abril-2006
Mensajes: 272
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: Exportar de un Flexgrid o un dat a excel.

Hola erbuson!

Ahjaja! como dicen aqui en mi tierra, Picaro, picaro, sabe mas el diablo por viejo que por diablo. Ahora entiendo lo del consejo, antes de este post, los truquillos de la experiencia, muchas gracias por compartilos y enseñarlos.
Referente al tema de Case o If estoy de acuerdo contigo aunque como bien me enseñastes al principio, si la consulrta es 1, 2 o 3 el If va ideal pero cuando sea de varios el case va mejor y es mas limpio. Lo de la función es exactamente a lo que me referia y referente al truquillo del .value ahora analizando el codigo inicial y lo hasta ahora comentado veo que es exactamente lo mismo pero me despistaba lo de Fila +1 o_Hoja.Cells(Fila + 1, Columna + 1).Value que viendo esta linea no es, ni mas, ni menos que dos variables una para la columna y otra para la fila como en un Array o un grid cualquiera.

Y para rematar veo que una vez declarado el Excel y que las lineas de codigo son siempre las mnismas el resto es cuestion de escudriñar lo que quieres hacer como en el flexgrid y punto.

Muchisimas gracias compañero por tu enseñanza espero que con lo aprendido hoy este post pueda ayudar a muchos a eliminar sus dudas como a mi con el excel pues le tenia mas miedo que al printer y veo que no tiene nada.

Un saludote
  #11 (permalink)  
Antiguo 23/08/2010, 10:44
Avatar de erbuson  
Fecha de Ingreso: noviembre-2009
Mensajes: 701
Antigüedad: 10 años, 3 meses
Puntos: 53
Respuesta: Exportar de un Flexgrid o un dat a excel.

Hola Xyon:

Encantado de haber 'despejado incógnitas'. Entre todos, un poco por aqui y un poco por allá, estamos documentando una importante información para los que acudan a aclarar sus posibles dudas.

De aqui una de las importantes normas del foro, de preguntar en el mismo y no en mensaje privado y sobre todo cuando se trata de algo que se ve claramente es del interés común.

Saludos
__________________
Agradecer a quien te enseñó, es enseñar lo que de él aprendiste.
Recuerda: Decir gracias, poco cuesta y mucho vale ...

Etiquetas: excel
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 03:57.