Domanda

Sono il debug del codice e hanno bisogno per scoprire dove un
DoCmd.TransferSpreadsheet acImport, , ".....
fallisce così ho deciso di importarla 'manualmente' line-by-line per vedere dove cade sopra.

I qualcosa supponiamo come questo è quello che sto cercando:

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

Ho provato Googling inutilmente. Ogni aiuto è molto apprezzato!


Ulteriori informazioni:

  • I nomi delle colonne del foglio di calcolo e la tabella di Access sono identici.
  • Ogni tipo di dati è di tipo nvarchar (MAX) (Or "Memo", come lo chiama Accesso)
  • La tabella è una tabella collegata a SQL Server 2008
È stato utile?

Soluzione

È possibile creare una connessione ADO per il foglio di calcolo (vedi stringhe di connessione per Excel 2007 ), poi aprire un recordset ADO a tale connessione (vedi StackOverflow: ADODB recordset in VBA dice campo di excel è vuoto quando non è per esempio).

Poi spostarsi tra le righe del recordset, e creare un'istruzione SQL INSERT utilizzando i valori della riga.

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

Questo codice snipped assume FIRST_FIELD e SECOND_FIELD sono i tipi di dati di testo. Se sono numerici, perdere le virgolette singole.

Credo che fa più o meno quello che hai chiesto. Tuttavia, prima di ricorrere al codice vorrei verificare se le importazioni di fogli di calcolo in modo pulito in una nuova tabella di accesso nativo. (Inoltre, verificare se i tipi di dati e vincoli che nuova tabella siano compatibili con quelli della tabella collegata di SQL Server.) Se funziona, forse prova a importare il foglio di calcolo direttamente in SQL Server dalla Management Studio, o qualunque strumento è appropriato.

Altri suggerimenti

ADO funziona bene se si dispone di un foglio di lamiera ben definito dei dati (risposta HansUp). Se avete bisogno di un maggior controllo prima di caricare gli oggetti, è possibile collegare nella cartella di lavoro di Excel, quindi estrarre qualsiasi dato che ti piace. Dipende molto dal livello di controllo necessario.

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

Per la risoluzione dei problemi, provare il collegamento al foglio di calcolo e vedere quali sono i problemi che si incontrano, tra cui la visualizzazione dei dati sbagliato quando si visualizza in visualizzazione Foglio dati.

Si può anche provare semplicemente copiando i dati di Excel negli appunti e incollarlo nella vostra tabella di Access. Qualunque sia fallisce andranno scritti in un 'Incollare errori' tavolo da Access.

Due opzioni aggiuntive:

  1. Collegamento il foglio di calcolo in Access come un tavolo. In Access 2007, passare al riquadro "dati esterni" e selezionare "Importa foglio di calcolo Excel". Si dovrebbe importare ad una, un nuovo collegamento datatable o semplicemente DataTable esistente per file di Excel. Quindi, si dovrebbe lavorare con questa nuova tabella "Excel", come una tabella di Access (considerato i problemi di prestazioni, in quest'ultimo caso).

  2. Prova a risolvere il problema Docmd.TransferSpreadsheet. Sto usando questo metodo per alcuni anni, e funziona bene, nonostante dovrebbe essere un po 'difficile in alcuni casi (I belive sua tuo caso). Si prega, la sua degna se si dà ulteriori informazioni sul problema con questo metodo, tra cui la versione Access ed Excel.

spero ho aiutato. Buona fortuna.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top