REVISIÓN: ADO inserta datos en columnas erróneas en Excel

Seleccione idioma Seleccione idioma
Id. de artículo: 314763 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

En esta página

Síntomas

Cuando utiliza ADO para insertar nuevas filas de datos en una hoja de cálculo de Microsoft Excel, si los datos incluyen campos que contienen valores de cadena vacía, ADO puede insertar los valores de datos de campos numéricos posteriores en las columnas incorrectas en Excel.

Este problema se produce en proveedor Microsoft OLE DB para Jet versión 4.0 y el controlador ODBC de Microsoft para Excel. Este problema se produce si utiliza una instrucción SQL INSERT o la AddNew y los métodos Update del objeto Recordset de ADO.

Este problema no se produce si el libro de Excel está abierto en la aplicación Excel cuando ADO inserta nuevos registros.

Sin embargo, Microsoft no recomienda este ejercicio porque se produce una pérdida de memoria si Excel está abierto durante las operaciones de ADO. Para obtener información adicional, haga clic en el número de artículo siguiente para ver el artículo en Microsoft Knowledge Base:
319998Error: Pérdida de memoria al consulta Abrir hoja de cálculo de Excel con ADO
Consulte la sección "Más información" para obtener información detallada sobre las circunstancias en que se produce este problema.

Solución

Para resolver este problema, obtenga el service pack más reciente para Jet 4.0 service pack. Para obtener información adicional, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
239114Cómo: Obtener el Service Pack más reciente para el motor de base de datos Microsoft Jet 4.0

Estado

Microsoft ha confirmado que se trata de un problema de los productos de Microsoft enumerados al principio de este artículo.

Más información

Pasos para reproducir este comportamiento

  1. Abra Microsoft Excel y, a continuación, cree un nuevo libro.
  2. En la Hoja1, escriba los datos ejemplo siguiente, comenzando por la celda A1 en la esquina superior izquierda:
    Contraer esta tablaAmpliar esta tabla
    ColumnAColumnBColumnCColumnDColumnEColumnF
    11las pruebas11las pruebas
    22las pruebas22las pruebas

  3. Guarde el libro como prueba.xls. Puede dejar abierta la aplicación Excel, pero debe cerrar el nuevo libro.
  4. En Microsoft Visual Basic, cree un nuevo proyecto EXE estándar. Se creará Form1 de manera predeterminada.
  5. En el menú proyecto , haga clic en referencias . En la lista de referencias disponibles, seleccione Microsoft ActiveX Data Objects 2. x biblioteca .
  6. Coloque un control CommandButton en Form1 y, a continuación, pegue el código siguiente el procedimiento de evento Click para el botón . Tenga en cuenta que este código inserta una cadena vacía en la columna central, la columna C.
    Private Sub Command1_Click()
       Dim strCn As String
       Dim cn As ADODB.Connection
       Dim rs As ADODB.Recordset
       Dim fld As ADODB.Field
    
       'Open connection
       strCn = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
          "Data Source=" & App.Path & "\Test.xls;" & _
          "Extended Properties=Excel 8.0"
       Set cn = New ADODB.Connection
       cn.Open strCn
        
       'Add new values.
       Set rs = New ADODB.Recordset
       With rs
          .CursorLocation = adUseClient
          .Open "Select * from [Sheet1$]", cn, adOpenStatic, adLockOptimistic
          .AddNew
          .Fields("ColumnA").Value = 3
          .Fields("ColumnB").Value = 3
          .Fields("ColumnC").Value = ""
          .Fields("ColumnD").Value = 3
          .Fields("ColumnE").Value = 3
          .Fields("ColumnF").Value = "testing"
          .Update
          .Close
       End With
       Set rs = Nothing
       cn.Close
       Set cn = Nothing
    End Sub
    					
  7. Guarde el proyecto de prueba de Visual Basic en la misma carpeta como el libro prueba.xls.
  8. Ejecute el proyecto y a continuación, haga clic en el botón. La primera vez que ejecute el proyecto en el VBA integrado entorno de desarrollo (IDE), puede recibir el siguiente mensaje de error:
    Error de tiempo de ejecución '-2147467259 (80004005)': seleccionados secuencia no admite el sistema operativo de intercalación
    Se trata de un problema conocido.Para obtener información adicional, haga clic en el número de artículo siguiente para ver el artículo en Microsoft Knowledge Base:
    246167La secuencia de ordenación error abrir un conjunto de registros la primera vez en una hoja de CÁLCULO de Excel ADODB
  9. En el cuadro de diálogo mensaje de error, haga clic en Depurar y, a continuación, presione la tecla F5 para continuar ejecutar el proyecto. Tenga en cuenta que inserta dos nuevas filas de datos en lugar de uno dado Update se ejecuta dos veces.
  10. Cierre el formulario para finalizar el proyecto. Vuelva a abrir prueba.xls en Excel y, a continuación, examinar los datos en la Hoja1. Esperar los resultados siguientes:

    Contraer esta tablaAmpliar esta tabla
    ColumnAColumnBColumnCColumnDColumnEColumnF
    11las pruebas11las pruebas
    22las pruebas22las pruebas
    3333las pruebas

    No obstante, vea los siguientes datos:

    Contraer esta tablaAmpliar esta tabla
    ColumnAColumnBColumnCColumnDColumnEColumnF
    11las pruebas11las pruebas
    22las pruebas22las pruebas
    3333las pruebas

    Aparece como si la cadena vacía que se inserta en ColumnC se ha omitido y ha desaparecido. Por tanto, los siguientes valores numéricos son insertada una columna a la izquierda de sus destinos previstos. No afecta a la columna de cadena siguientes.

Variación 1

Configurar los datos de prueba como sigue:

Contraer esta tablaAmpliar esta tabla
ColumnAColumnBColumnCColumnDColumnE
1las pruebas11las pruebas
2las pruebas22las pruebas

En el proyecto de Visual Basic, modifique la sección para agregar nuevos valores como sigue:
   'Add new values.
   Set rs = New ADODB.Recordset
   With rs
      .CursorLocation = adUseClient
      .Open "Select * from [Sheet1$]", cn, adOpenStatic, adLockOptimistic
      .AddNew
      .Fields("ColumnA").Value = 3
      .Fields("ColumnB").Value = ""
      .Fields("ColumnC").Value = 3
      .Fields("ColumnD").Value = 3
      .Fields("ColumnE").Value = "testing"
      .Update
      .Close
   End With
   Set rs = Nothing
   cn.Close
   Set cn = Nothing
				
cuando abre prueba.xls en Excel, Sheet1 muestra los datos siguientes:

Contraer esta tablaAmpliar esta tabla
ColumnAColumnBColumnCColumnDColumnE
1las pruebas11las pruebas
2las pruebas22las pruebas
333las pruebas

Observe que este problema no se produce cuando una sola columna numérica preceda el valor de cadena vacía.

Variación 2

Configurar los datos de prueba como sigue:

Contraer esta tablaAmpliar esta tabla
ColumnAColumnBColumnCColumnDColumnEColumnFColumnG
11las pruebaslas pruebas11las pruebas
22las pruebaslas pruebas22las pruebas

En el proyecto de Visual Basic, modifique la sección para agregar nuevos valores como sigue:
   'Add new values.
   Set rs = New ADODB.Recordset
   With rs
      .CursorLocation = adUseClient
      .Open "Select * from [Sheet1$]", cn, adOpenStatic, adLockOptimistic
      .AddNew
      .Fields("ColumnA").Value = 3
      .Fields("ColumnB").Value = 3
      .Fields("ColumnC").Value = ""
      .Fields("ColumnD").Value = ""
      .Fields("ColumnE").Value = 3
      .Fields("ColumnF").Value = 3
      .Fields("ColumnG").Value = "testing"
      .Update
      .Close
   End With
   Set rs = Nothing
   cn.Close
   Set cn = Nothing
				
cuando abre prueba.xls en Excel, Sheet1 muestra los datos siguientes:

Contraer esta tablaAmpliar esta tabla
ColumnAColumnBColumnCColumnDColumnEColumnFColumnG
11las pruebaslas pruebas11las pruebas
22las pruebaslas pruebas22las pruebas
3333las pruebas

Si ADO inserta dos valores de cadena vacía, parece como si se omiten las cadenas vacías que se insertan en ColumnC y ColumnD y que han desaparecido. Por tanto, los siguientes valores numéricos son insertados dos columnas a la izquierda de sus destinos previstos. No afecta a la columna de cadena siguientes.

Referencias

Para obtener información adicional, haga clic en los números de artículo correspondientes para verlos en Microsoft Knowledge Base:
294410ACC2002: Valores nulos reemplazados con datos del campo siguiente al exportar a Excel
257819Cómo: Usar ADO con datos de Excel desde Visual Basic o desde VBA

Propiedades

Id. de artículo: 314763 - Última revisión: lunes, 26 de septiembre de 2005 - Versión: 1.2
La información de este artículo se refiere a:
  • Microsoft ActiveX Data Objects 2.1
  • Microsoft ActiveX Data Objects 2.5
  • Microsoft ActiveX Data Objects 2.6
  • Microsoft OLE DB Provider for Jet 4.0
Palabras clave: 
kbmt kbhotfixserver kbqfe kbbug kbfix kbiisam kbjet kbqfe KB314763 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 314763
Renuncia a responsabilidad de los contenidos de la KB sobre productos a los que ya no se ofrece asistencia alguna
El presente artículo se escribió para productos para los que Microsoft ya no ofrece soporte técnico. Por tanto, el presente artículo se ofrece "tal cual" y no será actualizado.

Enviar comentarios

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com