Foros aprenderaprogramar.com

Aprender a programar => Aprender a programar desde cero => Mensaje iniciado por: Mary en 19 de Junio 2016, 12:50

Título: Bucle para copiar o importar columna excel en datagridview Visual Basic
Publicado por: Mary en 19 de Junio 2016, 12:50
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,

Título: Re:Bucle para copiar columna excel en datagridview
Publicado por: Mary 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.
Título: Re:Bucle para copiar columna excel en datagridview
Publicado por: Mary 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.
Título: Re:Bucle para copiar columna excel en datagridview
Publicado por: Alex Rodríguez 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
Título: Re:Bucle para copiar columna excel en datagridview
Publicado por: Mary 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.
Título: Re:Bucle para copiar o importar columna excel en datagridview Visual Basic
Publicado por: Alex Rodríguez en 15 de Julio 2016, 12:56
Hola Mary gracias por compartir la solución, puede servir de ayuda para otras personas

Saludos