Pregunta

Estoy depurando algún código y necesito averiguar dónde
DoCmd.TransferSpreadsheet acImport, , ".....
falla, así que he decidido importarlo 'manualmente' línea por línea para ver dónde se cae.

Supongo que algo como esto es lo que estoy buscando:

mySpreadSheet = ConnectTo(Spreadsheet.xlsx)
while(!mySpreadSheet.EOF)
   get(mySpreadSheet.nextLine)
   SQL("UPDATE MyTable with mySpreadSheet.nextLine")

He intentado buscar en Google en vano. ¡Cualquier ayuda es muy apreciada!


Información adicional:

  • Los nombres de la columna de la hoja de cálculo y la tabla de acceso son idénticos.
  • Cada tipo de datos es nvarchar (máximo) (o "memo" como el acceso lo llama)
  • La tabla es una tabla vinculada a SQL Server 2008
¿Fue útil?

Solución

Puede crear una conexión de ADO a su hoja de cálculo (ver Cuerdas de conexión para Excel 2007), luego abra un conjunto de registros ADO con esa conexión (ver StackOverflow: ADODB Recordset en VBA dice que el campo de Excel está vacío cuando no está por ejemplo).

Luego muévase a través de las filas de registro y cree una instrucción SQL Insertar utilizando los valores de la fila.

strInsert = "INSERT INTO MyTable (first_field, second_field) VALUES ('" & -
    rs2.Field(0).Value & "', '" & rs2.Field(1).Value & "');"
Debug.Print strInsert
CurrentDb.Execute strInsert, dbFailonerror

Ese código recortado asume First_Field y Second_field son tipos de datos de texto. Si son numéricos, pierda las citas individuales.

Creo que eso hace más o menos lo que preguntaste. Sin embargo, antes de recurrir al código, verificaría si la hoja de cálculo se importa limpiamente en una nueva tabla de acceso nativo. (Además, verifique si los tipos de datos y las restricciones en esa nueva tabla son compatibles con los de la tabla de servidor SQL vinculada). Si eso funciona, tal vez intente importar la hoja de cálculo directamente al servidor SQL desde el estudio de administración, o cualquier herramienta sea apropiada.

Otros consejos

ADO funciona bien si tiene un diseño de hoja bien definido de sus datos (respuesta hansup). Si necesita un control agregado antes de cargar los objetos, puede conectarse al libro de trabajo de Excel y luego extraer los datos que desee. Realmente depende del nivel de control que necesite.

Public Sub LoadExcelToAccess(xlPath As String)
'uses late binding to open excel workbook and open it line by line

'make reference to Microsoft Excel xx.x Object Model to use native functions, requires early binding however

    Dim xlApp As Object 'Excel.Application
    Dim xlWrk As Object 'Excel.Workbook
    Dim xlSheet As Object 'Excel.Worksheet
    Dim i As Long
    Dim sql As String

    Set xlApp = VBA.CreateObject("Excel.Application")

    'toggle visibility for debugging
    xlApp.Visible = False

    Set xlWrk = xlApp.Workbooks.Open(xlPath)
    Set xlSheet = xlWrk.Sheets("Sheet1") 'modify to your perticular sheet

    'depends on what your trying to do with the sheet
    For i = 1 To 10

        'quick and dirty:  best to load items into custom class collection, then do processing there
        sql = "Insert Into [Temp] (Col1) VALUES (" & xlSheet.Cells(i, 1).Value & ")"
        DoCmd.RunSQL sql
    Next i

    'make sure to dispose of objects
    xlWrk.Close
    xlApp.Quit

    Set xlSheet = Nothing
    Set xlWrk = Nothing
    Set xlApp = Nothing
End Sub

Para fines de resolución de problemas, intente vincular a la hoja de cálculo y vea qué problemas se encuentra, incluidos los datos que muestran mal cuando lo ve en la vista de hoja de datos.

También puede intentar copiar sus datos de Excel al portapapeles y pegarlos en su tabla de acceso. Cualquier falla se escribirá en una tabla de 'Pegar errores' por acceso.

Dos opciones adicionales:

  1. Enlace la hoja de cálculo en acceso como una tabla. En Access 2007, vaya al panel de "datos externos" y seleccione "hoja de cálculo de importación de Excel". Debe importar a un DataTable existente, un nuevo DataTable o simplemente enlace al archivo de Excel. Luego, trabajaría con esta nueva tabla de "Excel" como una tabla de acceso (considerado los problemas de rendimiento, en el último caso).

  2. Intenta arreglar el Docmd.TransferSpreadsheet problema. He estado usando este método durante algunos años, y funciona bien, a pesar de que debería ser un poco complicado en algunos casos (creo que su caso). Por favor, es digno si proporciona más información sobre su problema con este método, incluidos su acceso y versión de Excel.

Espero haber ayudado. Buena suerte.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top