Error: El controlador ODBC para Excel pasa el FirstRowHasNames o encabezado configuración

Síntomas

Cuando se utiliza el controlador de conectividad abierta de base de datos de Microsoft Excel (ODBC) para conectarse a una hoja de cálculo de Excel como origen de datos ODBC, el controlador se supone de forma predeterminada que la primera fila de la hoja de datos contiene encabezados de columna (nombres de campo). Según la documentación del controlador, la configuración de conexión FirstRowHasNames opcional puede utilizarse para cambiar este comportamiento predeterminado utilizando 0 para Falso y 1 para Verdadero. Sin embargo, en realidad, el controlador ignora esta configuración y la primera fila de datos se trata siempre como encabezados de columna. Si la primera fila de datos contiene encabezados de columna u otras entradas, el resultado eficaz es que la primera fila de datos "desaparece."

Causa

El valor del parámetro de encabezado (HDR) o FirstRowHasNames nunca se que se pasa al controlador ODBC de Excel.

Solución

El HDR = valor es funcional y disponible cuando se utiliza el proveedor OLE DB de Microsoft Jet y el controlador ISAM de Excel. Por lo tanto, la mejor solución es utilizar el proveedor Jet en lugar del controlador ODBC para Excel.

Puesto que el controlador ODBC de Excel siempre supone que la primera fila contiene nombres de campo, la primera fila debe contener siempre los nombres de campo válido o entradas ficticias que el desarrollador está dispuesto a pasar por alto.

Estado

Microsoft ha confirmado que se trata de un error en los productos de Microsoft que se enumeran al principio de este artículo.

Más información

Pasos para reproducir el comportamiento

  1. Crear un nuevo libro de Excel y guárdelo con el nombre predeterminado de la carpeta donde se creará el proyecto de prueba de Visual Basic.
  2. En la celda A1, rellenar algunas celdas de la primera columna con datos aleatorios.
  3. Cree un nuevo proyecto de Visual Basic y establezca una referencia ActiveX Data Objects (ADO).
  4. Escriba y ejecute el código siguiente:
    Private Sub Form_Load()  Dim cn As ADODB.Connection
    Dim rs As ADODB.Recordset
    Set cn = New ADODB.Connection
    With cn
    .Provider = "MSDASQL"
    .ConnectionString = "Driver={Microsoft Excel Driver (*.xls)};DBQ=" & App.Path & "\Book1.xls;FirstRowHasNames=0;"
    .Open
    End With
    Set rs = New ADODB.Recordset
    With rs
    Set .ActiveConnection = cn
    .Source = "[Sheet1$]"
    .Open
    End With
    Debug.Print rs.Fields(0).Value
    Debug.Print rs.Fields(0).Name
    rs.Close
    cn.Close
    End Sub

Normalmente esperaría ver el controlador Excel asignar el nombre de campo predeterminado "F1" en la columna de datos y para mostrar los datos empezando por la primera registran que se entró en la celda A1. Sin embargo, tenga en cuenta que en la ventana de depuración, el valor que escribió en la celda que a2 se imprimen como el valor del primer registro a pesar de su haber establecido FirstRowHasNames en False. El valor en la celda A1 "desapareció" para convertirse en el nombre del campo de la columna.
Propiedades

Id. de artículo: 288343 - Última revisión: 21 ene. 2017 - Revisión: 1

Comentarios