none
Error al cargar Hoja de Excel en un Datatable RRS feed

  • Pregunta

  • Hola a todos:

    Tengo un apartado para la importación de datos en el cual relleno un datable a partir de la importación desde una hoja de Excel.

    Hasta ahora in problemas. Pero resulta que al querer importar una hoja nueva, siguiendo el mismo patrón que utilizo para las otras me está tirando un error de que falta asignar parámetros. Es incomprensible porque no utiliza parámetros, resultando al final que no me rellena el datatable y lleva un valor nothing lo cual tampoco entiendo, ya que pasando un breakpoint por todas las variables, las mismas llevan su valor correcto.

    El error me lo lanza al final de la consulta (Marcado en negrita) y no veo por donde puede estar el error. Por otro lado la hoja de Excel es normalita, es decir, que no tiene nada extraño en principio. 

    Esta es la función:

    Private Function RellenarObjetoDataTable() As DataTable
    
            Dim rutaArchivo As String = ruta
    
            ' Datos necesarios de las celdas de la hoja de cálculo
    
            Dim rangoCeldas As String = String.Format("[{0}${1}:{2}]",
                                                      strNombreDeHoja, CeldaInicial, CeldaFinal)
    
            ' Índice en base 1 de las columnas donde se encuentran los siguientes datos
            '
            Dim columnaCuentas As Integer = intGruposContables
            Dim columnaSaldosDeudores As Integer = intSaldoDeudor
            Dim columnaSaldosAcreedores As Integer = intSaldoAcreedor
            Dim columnaSaldoActual As Integer = intSaldoActual
    
            ' Construir la sintaxis de la consulta SQL de selección.
            'Utilizar esta consulta cuando queramos tener los campos del saldo separados en deudor y acreedor
            Dim sql As String
    
            If EjercImportar = 4 Then
                    sql = String.Format("SELECT Left(F{0},4) As [Cód_GC], F{1} As [Deudor], F{2} As [Acreedor] FROM {3} ",
                                        columnaCuentas, columnaSaldosDeudores, columnaSaldosAcreedores, rangoCeldas)
                    My.Settings.Nivel4dig = True
                    My.Settings.Save()
                Else
                    sql = String.Format("SELECT Left(F{0},3) As [Cód_GC], F{1} As [Deudor], F{2} As [Acreedor] FROM {3} ",
                                        columnaCuentas, columnaSaldosDeudores, columnaSaldosAcreedores, rangoCeldas)
                    My.Settings.Nivel3dig = True
                    My.Settings.Save()
                End If
           
            ' Cadena de conexión, donde indicamos que la primera fila del
            ' rango de celdas 'NO CONTIENE' el nombre de los campos.
            '
            Dim cadenaConexion As String =
                "Provider=Microsoft.ACE.OLEDB.12.0;" &
                "Extended Properties='Excel 12.0 Xml;HDR=No;IMEX=1';" &
                "Data Source=" & rutaArchivo
    
            ' DataTable que contendrá los datos creados por el programa de contabilidad
            ' y localizados en el rango de celdas sin nombre indicado por el usuario.
    
            Dim da As New OleDbDataAdapter(sql, cadenaConexion)
            Dim dtInicial As New DataTable   'No coge los datos de la hoja de Excel y salta el error.
            'Cargar el Datatable con el fichero XLSX
            da.Fill(dtInicial)
    
            Dim dt As DataTable = dtInicial.Clone
            '
            For Each Fila As DataRow In dtInicial.Rows
                If Fila("Cód_GC").ToString <> "" Then
                    dt.ImportRow(Fila)
                End If
            Next
    
            Return dt
    
        End Function

    Bueno, comentar como he indicado anteriormente que esta función me va perfecta con otras hojas.

    Un cordial saludo a todos.

    Gemma

    lunes, 30 de octubre de 2017 14:46

Respuestas

  • "gemma_campillo" escribió:

    > Pero resulta que al querer importar una hoja nueva, siguiendo el mismo patrón que
    > tilizo para las otras me está tirando un error de que falta asignar parámetros...
    >

    Hola, Gemma:

    ¿Ese es el error exacto que obtienes ("Falta asignar parámetros") o es un "resumen particular" que has hecho del mensaje de error original?

    > Bueno, comentar como he indicado anteriormente que esta función me va perfecta con otras hojas.

    ¿Qué características tiene la nueva hoja que la diferencie de aquellas donde no tienes ningún problema?

    >  If EjercImportar = 4 Then
    >      sql = String.Format("SELECT Left(F{0},4) As [Cód_GC], F{1} As [Deudor], F{2} As [Acreedor] FROM {3} ",
    >                           columnaCuentas, columnaSaldosDeudores, columnaSaldosAcreedores, rangoCeldas)
    >      My.Settings.Nivel4dig = True
    >      My.Settings.Save()
    >  Else
    >     sql = String.Format("SELECT Left(F{0},3) As [Cód_GC], F{1} As [Deudor], F{2} As [Acreedor] FROM {3} ",
    >                         columnaCuentas, columnaSaldosDeudores, columnaSaldosAcreedores, rangoCeldas)
    >     My.Settings.Nivel3dig = True
    >     My.Settings.Save()
    >  End If

    ¿No será mejor que indiques el VALOR EXACTO FINAL que tiene la variable local llamada sql en lugar de que nosotros tengamos que averiguarlo?

    > Dim rutaArchivo As String = ruta

    ¿Qué valor tiene la supuesta variable GLOBAL llamada ruta?

    ¿No puede suceder que la función RellenarObjetoDataTable esté bien y que el problema sea de los DISTINTOS VALORES QUE TIENEN LAS VARIABLES GLOBALES de las que hace uso en ella?

    Observa que mi respuesta solamente contiene preguntas que te hago porque realmente, yo al menos soy incapaz de averiguar lo que te está sucediendo. :-(


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.

    • Marcado como respuesta gemma_campillo lunes, 30 de octubre de 2017 16:58
    lunes, 30 de octubre de 2017 15:42
    Moderador
  • "gemma_campillo" escribió:

    > 2) la sql final es esta: sql = String.Format("SELECT Left(F{0},4) As [Cód_GC], F{1} As [Deudor],
    >    F{2} As [Acreedor] FROM {3} ", columnaCuentas, columnaSaldosDeudores, columnaSaldosAcreedores, rangoCeldas)

    Me refería al resultado final, porque ignoro por completo los valores que tienen las variables llamadas columnaCuentas, columnaSaldosDeudores, columnaSaldosAcreedores, rangoCeldas.

    Una vez descargado el archivo de Excel, lo único que sé es que contiene dos hojas de cálculo llamadas Hoja1 y Hoja2, donde no aparecen en la primera fila los nombres de las columnas, por lo que es sumamente necesario conocer qué rango de celdas estás tomando, que se supone es el valor de la variable rangoCeldas.

    Y entiendo que donde deseas obtener los datos es de la Hoja2, porque de la Hoja1 pocos datos vas a poder seleccionar, porque cada palabra del nombre de la cuenta está en una columna diferente, y cuyos valores se entremezclan con cantidades numéricas decimales. ¡Vamos! ¡Para volverse loco!

    En definitiva, que lo que deseo conocer es el valor de la consulta SQL de selección definitiva que deseas ejecutar, algo parecido a:

       
    SELECT F1 AS [Cód_GC], F2 AS [Deudor], F3 AS [Acreedor] FROM Hoja2$A1:M50


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.

    • Marcado como respuesta gemma_campillo lunes, 30 de octubre de 2017 17:34
    lunes, 30 de octubre de 2017 17:20
    Moderador
  • "gemma_campillo" escribió:

    > Ya he visto cual es el error estúpido. Creía que estaba cargando la hoja 1 y
    > realmente tenía que ser la hoja 2.Había abierto el Excel sin comprobar bien
    > que hoja tenía que cargar, pensando que era la 1. Ahí está el error.
    >
    > Ahora con ese mismo Excel funciona perfectamente, claro, antes se volvía loca.

    Ya me extrañaba a mí que pudieras obtener datos válidos de aquellos existentes en la Hoja1. :-))

    Te hago saber que en el libro de Excel que he descargado existen dos conexiones llamadas BSyS y BSyS1 las cuales hacen referencia a un supuesto archivo delimitado por comas existente en C:\TEMP\BSyS.csv.

    Si quieres verlas, vete a la pestaña Datos y selecciona el botón Conexiones. Pulsa el botón Propiedades y en la pestaña Definición encontrarás la ruta del archivo indicado.

    La verdad es que no sé lo que hace eso ahí, porque al abrir el archivo con Microsoft Excel puede que te aparezca una ADVERTENCIA DE SEGURIDAD.


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.



    lunes, 30 de octubre de 2017 17:57
    Moderador

Todas las respuestas

  • Hola.

    Bueno, cosas que a veces pasan con el Excel. Os explico: He copiado los datos de esa hoja que no podía importar a una nueva hoja y ahora hace la importación perfectamente, por lo que entiendo que a la primera hoja le pasaba alguna cosa que no llego a comprender, pero en fin, el tema es que ya funciona correctamente otra vez.

    Un saludo.

    Gemma

    • Marcado como respuesta gemma_campillo lunes, 30 de octubre de 2017 15:35
    • Desmarcado como respuesta gemma_campillo lunes, 30 de octubre de 2017 16:58
    lunes, 30 de octubre de 2017 15:35
  • "gemma_campillo" escribió:

    > Pero resulta que al querer importar una hoja nueva, siguiendo el mismo patrón que
    > tilizo para las otras me está tirando un error de que falta asignar parámetros...
    >

    Hola, Gemma:

    ¿Ese es el error exacto que obtienes ("Falta asignar parámetros") o es un "resumen particular" que has hecho del mensaje de error original?

    > Bueno, comentar como he indicado anteriormente que esta función me va perfecta con otras hojas.

    ¿Qué características tiene la nueva hoja que la diferencie de aquellas donde no tienes ningún problema?

    >  If EjercImportar = 4 Then
    >      sql = String.Format("SELECT Left(F{0},4) As [Cód_GC], F{1} As [Deudor], F{2} As [Acreedor] FROM {3} ",
    >                           columnaCuentas, columnaSaldosDeudores, columnaSaldosAcreedores, rangoCeldas)
    >      My.Settings.Nivel4dig = True
    >      My.Settings.Save()
    >  Else
    >     sql = String.Format("SELECT Left(F{0},3) As [Cód_GC], F{1} As [Deudor], F{2} As [Acreedor] FROM {3} ",
    >                         columnaCuentas, columnaSaldosDeudores, columnaSaldosAcreedores, rangoCeldas)
    >     My.Settings.Nivel3dig = True
    >     My.Settings.Save()
    >  End If

    ¿No será mejor que indiques el VALOR EXACTO FINAL que tiene la variable local llamada sql en lugar de que nosotros tengamos que averiguarlo?

    > Dim rutaArchivo As String = ruta

    ¿Qué valor tiene la supuesta variable GLOBAL llamada ruta?

    ¿No puede suceder que la función RellenarObjetoDataTable esté bien y que el problema sea de los DISTINTOS VALORES QUE TIENEN LAS VARIABLES GLOBALES de las que hace uso en ella?

    Observa que mi respuesta solamente contiene preguntas que te hago porque realmente, yo al menos soy incapaz de averiguar lo que te está sucediendo. :-(


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.

    • Marcado como respuesta gemma_campillo lunes, 30 de octubre de 2017 16:58
    lunes, 30 de octubre de 2017 15:42
    Moderador
  • Hola maestro:

    Bueno, disculpas por los datos que faltaban:

    1) EL error es el siguiente: Error en la validación de datos. No se han especificado valores para algunos de los parámetros requeridos. Aceptar para continuar.

    2) la sql final es esta: sql = String.Format("SELECT Left(F{0},4) As [Cód_GC], F{1} As [Deudor], F{2} As [Acreedor] FROM {3} ", columnaCuentas, columnaSaldosDeudores, columnaSaldosAcreedores, rangoCeldas)

    3) La variable ruta lleva el siguiente valor: C:\Users\Gemma\Documents\Maecon.xlsx

    4) La hoja de Excel está subida en: https://www.financialsystem.es/SoftwareFinancialSystem/BaseDatos/Maecon.xlsx

    He repasado las variables varias veces y si copio esa hoja de Excel (original) en otra nueva, entonces va bien. Por ello creo que el problema es de la hoja de Excel, pero no entiendo cuál es.

    Enrique, gracias por todo y un fuerte abrazo.

    Gemma

    lunes, 30 de octubre de 2017 16:48
  • "gemma_campillo" escribió:

    > 2) la sql final es esta: sql = String.Format("SELECT Left(F{0},4) As [Cód_GC], F{1} As [Deudor],
    >    F{2} As [Acreedor] FROM {3} ", columnaCuentas, columnaSaldosDeudores, columnaSaldosAcreedores, rangoCeldas)

    Me refería al resultado final, porque ignoro por completo los valores que tienen las variables llamadas columnaCuentas, columnaSaldosDeudores, columnaSaldosAcreedores, rangoCeldas.

    Una vez descargado el archivo de Excel, lo único que sé es que contiene dos hojas de cálculo llamadas Hoja1 y Hoja2, donde no aparecen en la primera fila los nombres de las columnas, por lo que es sumamente necesario conocer qué rango de celdas estás tomando, que se supone es el valor de la variable rangoCeldas.

    Y entiendo que donde deseas obtener los datos es de la Hoja2, porque de la Hoja1 pocos datos vas a poder seleccionar, porque cada palabra del nombre de la cuenta está en una columna diferente, y cuyos valores se entremezclan con cantidades numéricas decimales. ¡Vamos! ¡Para volverse loco!

    En definitiva, que lo que deseo conocer es el valor de la consulta SQL de selección definitiva que deseas ejecutar, algo parecido a:

       
    SELECT F1 AS [Cód_GC], F2 AS [Deudor], F3 AS [Acreedor] FROM Hoja2$A1:M50


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.

    • Marcado como respuesta gemma_campillo lunes, 30 de octubre de 2017 17:34
    lunes, 30 de octubre de 2017 17:20
    Moderador
  • Hola Enrique:

    El valor de la consulta es el siguiente:

    SELECT Left(F1,4) As [Cód_GC], F5 As [Deudor], F6 As [Acreedor] FROM [Hoja1$A1:F61] 

    Era eso lo que me pedías?

    Gemma

    lunes, 30 de octubre de 2017 17:34
  • Maestro:

    Ya he visto cual es el error estúpido. Creía que estaba cargando la hoja 1 y realmente tenía que ser la hoja 2.Había abierto el Excel sin comprobar bien que hoja tenía que cargar, pensando que era la 1. Ahí está el error.

    Ahora con ese mismo Excel funciona perfectamente, claro, antes se volvía loca.

    En fin, cosas de la edad.

    Disculpas por el error y gracias por tu ayuda como siempre.

    Un abrazo.

    Gemma

    lunes, 30 de octubre de 2017 17:42
  • "gemma_campillo" escribió:

    > El valor de la consulta es el siguiente:
    >
    > SELECT Left(F1,4) As [Cód_GC], F5 As [Deudor], F6 As [Acreedor] FROM [Hoja1$A1

    ¡Vamos a ver! [Hoja1$A1 no es el nombre correcto de ningún rango de celdas, por lo que lo único que puedes obtener es el clásico error de sintaxis en la cláusula FROM.

    Yo quiero pensar que te has equivocado al escribir en el mensaje el valor correcto, por lo que he decidido ejecutar la siguiente consulta:

       
    Dim sql As String = "SELECT Left(F1,4) As [Cód_GC], F5 As [Deudor], F6 As [Acreedor] FROM [Hoja1$A1:L68]"

    Y siento decirte que no he obtenido error alguno, por lo que ignoro por completo el motivo por el cual obtienes el mensaje "Error en la validación de datos. No se han especificado valores para algunos de los parámetros requeridos. Aceptar para continuar".

    El "Error en la validación de datos" y "Aceptar para continuar", me extraña muchísimo que ese mensaje de error sea del motor de base de datos Microsoft Access, cuyo ISAM de Excel es el que estás utilizando. Quiero pensar que es algún añadido personalizado de tu cosecha para acompañar al verdadero mensaje de error: "No se han especificado valores para algunos de los parámetros requeridos.".

    Desde luego, observando los datos del objeto DataTable recuperado, no sé yo cómo vas a poder manipular los datos existentes en las columnas Deudor y Acreedor, porque aparecen datos de texto y numéricos entremezclados. ¿?

    Aprovecho el mensaje para indicarte que en lugar de ejecutar:

        If Fila("Cód_GC").ToString <> "" Then

    mejor será que ejecutes:

       
    If (Fila("Cód_GC").ToString().Length > 0) Then

    De esta manera el compilador de Visual Basic .net no tendrá que recurrir a ejecutar lo siguiente:

        If (Operators.CompareString(Fila.Item("Cód_GC").ToString(), "", False) > 0) Then


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.


    lunes, 30 de octubre de 2017 17:54
    Moderador
  • "gemma_campillo" escribió:

    > Ya he visto cual es el error estúpido. Creía que estaba cargando la hoja 1 y
    > realmente tenía que ser la hoja 2.Había abierto el Excel sin comprobar bien
    > que hoja tenía que cargar, pensando que era la 1. Ahí está el error.
    >
    > Ahora con ese mismo Excel funciona perfectamente, claro, antes se volvía loca.

    Ya me extrañaba a mí que pudieras obtener datos válidos de aquellos existentes en la Hoja1. :-))

    Te hago saber que en el libro de Excel que he descargado existen dos conexiones llamadas BSyS y BSyS1 las cuales hacen referencia a un supuesto archivo delimitado por comas existente en C:\TEMP\BSyS.csv.

    Si quieres verlas, vete a la pestaña Datos y selecciona el botón Conexiones. Pulsa el botón Propiedades y en la pestaña Definición encontrarás la ruta del archivo indicado.

    La verdad es que no sé lo que hace eso ahí, porque al abrir el archivo con Microsoft Excel puede que te aparezca una ADVERTENCIA DE SEGURIDAD.


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.



    lunes, 30 de octubre de 2017 17:57
    Moderador
  • Querido amigo, gracias como siempre por tu ayuda.

    Mañana le diré al usuario el tema del error y le comentaré el tema de las conexiones.

    Bueno Enrique, muchas gracias como siempre. Cuidate mucho.

    Un fuerte abrazo.

    Gemma

    lunes, 30 de octubre de 2017 18:26