Autor Tema: Bucle para copiar o importar columna excel en datagridview Visual Basic  (Leído 5507 veces)

Mary

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 39
    • Ver Perfil
Hola de nuevo.  Estoy intentando hacer un bucle para pasar los datos de una columna en Excel a una columna de un datagridview en visual basic 2010 express.
 
El código que tengo es el siguiente:
Código: [Seleccionar]
Dim oExcel As Object
        Dim oBook As Object
         Dim oSheet1 As Object
       
        'Iniciar un nuevo libro en Excel
        oExcel = CreateObject("Excel.Application")
        oBook = oExcel.Workbooks.Open("C:\Users\Packard Bell\Desktop\Viscosidad.xlsx")
        oSheet1 = oBook.Worksheets("Hoja2")
 Dim stConexion1 As New MySqlConnection("server= localhost; user id = root; password =; database = basededatos2") 'este es el codigo que funciona para office 2007 y 2010

 Dim col  As New DataGridViewTextBoxColumn
 col.Name = "DATOS"
     

        DataGridView42.Columns.Add(col)
        DataGridView42.Rows.Add(60)



        Dim a As Integer

        For j = 0 To DataGridView42.RowCount - 1
            For j = 1 To 60
                DataGridView42.Rows(j).Cells(0).Value = CDbl(oSheet1.Range("a" & j).Value)
            Next
        Next

     
        stConexion1.Open()

El problema es que no funciona. Sólo consigo que todas las celdas de la columna del datagridview se complete con 0. Creo que el fallo esta en que faltan poner comillas en la expresión:
oSheet1.Range("a" & j).Value

pero todas las pruebas que he hecho no han salido, por lo que ya no se si es ahí donde está el error. Tampoco me sale ningún mensaje de error, únicamente se completa la columna con 0.
¿Alguien sabe donde podría encontrarse el error? Gracias.
Saludos,

« Última modificación: 15 de Julio 2016, 12:56 por Alex Rodríguez »

Mary

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 39
    • Ver Perfil
Re:Bucle para copiar columna excel en datagridview
« Respuesta #1 en: 19 de Junio 2016, 13:35 »
Hola de nuevo,
he conseguido encontrar el error. Había que poner
For a = 1 to a +1
Ahora me copia la columna completamente en el datagridview.

Código: [Seleccionar]
  Dim a As Integer

        For j = 0 To DataGridView42.RowCount - 1
            For a = 1 To a + 1
                DataGridView42.Rows(j).Cells(0).Value = CDbl(oSheet1.Range("A" & a).Value)
            Next a
        Next j

Saludos.

Mary

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 39
    • Ver Perfil
Re:Bucle para copiar columna excel en datagridview
« Respuesta #2 en: 19 de Junio 2016, 20:53 »
Hola,
sigo teniendo un problema con este código.
Si en lugar  de 60 filas, añado 1250 filas (que son las que realmente necesito), la aplicación se bloquea.

DataGridView42.Rows.Add(1250)


For j = 0 To DataGridView42.RowCount - 1
            For j = 1 To 1250
                DataGridView42.Rows(j).Cells(0).Value = CDbl(oSheet1.Range("a" & j).Value)
            Next
        Next



Habría alguna forma de añadir tantas filas sin que esto ocurra? Gracias.
Saludos.

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Re:Bucle para copiar columna excel en datagridview
« Respuesta #3 en: 28 de Junio 2016, 22:33 »
Hola Mary en este código hay algo extraño:

For j = 0 To DataGridView42.RowCount - 1
            For j = 1 To 1250
                DataGridView42.Rows(j).Cells(0).Value = CDbl(oSheet1.Range("a" & j).Value)
            Next
        Next

Si j es el índice del bucle exterior y luego es también el índice del bucle interior ahí parece que generas un conflicto entre índices de bucles.

El problema de bloqueo con un excesivo número de filas es posible que puedas resolverlo añadiendo filas en paquetes de tamaño más reducido. Por ejemplo de 250 en 250, por ejemplo:

            For j = 1 To 250
                DataGridView42.Rows(j).Cells(0).Value = CDbl(oSheet1.Range("a" & j).Value)
            Next

           For j = 251 To 500
                DataGridView42.Rows(j).Cells(0).Value = CDbl(oSheet1.Range("a" & j).Value)
            Next

            For j = 500 To 750
                DataGridView42.Rows(j).Cells(0).Value = CDbl(oSheet1.Range("a" & j).Value)
            Next

           For j = 751 To 1000
                DataGridView42.Rows(j).Cells(0).Value = CDbl(oSheet1.Range("a" & j).Value)
           Next

          For j = 1001 To 1250
                DataGridView42.Rows(j).Cells(0).Value = CDbl(oSheet1.Range("a" & j).Value)
           Next

En realidad podrías automatizar para que te vaya cogiendo paquetes sin necesidad de repetir el código del bucle, sino por ejemplo llamando a un procedimiento o función.

Saludos

Mary

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 39
    • Ver Perfil
Re:Bucle para copiar columna excel en datagridview
« Respuesta #4 en: 10 de Julio 2016, 16:07 »
Hola Alex, al final he podido encontrar una función que pasar los datos de la columna de la hoja excel al datagridview. No consigo que funciona la función insertar código, así que lo escribo a continuación tal cual:

Código: [Seleccionar]
'Primero en el formulario tengo un botón desde donde llama la función que inserta la columna excel

 Private Sub Button70_Click(sender As System.Object, e As System.EventArgs) Handle Button70.Click
     
        Dim col As New DataGridViewTextBoxColumn
        DataGridView42.Columns.Add(col)
       ImportExcellToDataGridView("\\server\Docs\Publicos\coeficiente\Viscosidad.xlsx",   DataGridView42)

    End Sub

'A continuación pongo la función ImportExceltoDataGridview, la cual pasa los datos de la columna A de la  hoja 2 de libro excel al datagridview.


    Public Function ImportExcellToDataGridView(ByRef path As String, ByVal Datagrid As DataGridView)

        Try
            Dim stConexion As String = ("Provider=Microsoft.ACE.OLEDB.12.0;" & ("Data Source=" & (path & ";Extended Properties=""Excel 12.0;Xml;HDR=NO;IMEX=2"";")))
            Dim cnConex As New OleDb.OleDbConnection(stConexion)
            Dim Cmd As New OleDb.OleDbCommand("Select * From [Hoja2$]")
            Dim Ds As New DataSet
            Dim Da As New OleDb.OleDbDataAdapter
            Dim Dt As New DataTable
            cnConex.Open()
            Cmd.Connection = cnConex
            Da.SelectCommand = Cmd
            Da.Fill(Ds)
            Dt = Ds.Tables(0)
            Datagrid.Columns.Clear()
            Datagrid.DataSource = Dt
            cnConex.Close()

        Catch ex As Exception
            MsgBox(ex.Message, MsgBoxStyle.Critical, "Error")
        End Try
        Return True
End Function


Espero pueda servirle a alguien. Gracias y saludos.
« Última modificación: 15 de Julio 2016, 12:55 por Alex Rodríguez »

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Hola Mary gracias por compartir la solución, puede servir de ayuda para otras personas

Saludos

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".