VBA将Excel电子表格逐行导入Access

VBA将Excel电子表格逐行导入Access,excel,ms-access,vba,excel-2010,Excel,Ms Access,Vba,Excel 2010,我正在调试一些代码,需要找出a DoCmd.TransferSpreadsheet导入,“…” 失败,所以我决定逐行“手动”导入它,看看它落在哪里 我想这就是我想要的: mySpreadSheet = ConnectTo(Spreadsheet.xlsx) while(!mySpreadSheet.EOF) get(mySpreadSheet.nextLine) SQL("UPDATE MyTable with mySpreadSheet.nextLine") 我尝试过谷歌搜索,但

我正在调试一些代码,需要找出a
DoCmd.TransferSpreadsheet导入,“…”

失败,所以我决定逐行“手动”导入它,看看它落在哪里

我想这就是我想要的:

mySpreadSheet = ConnectTo(Spreadsheet.xlsx)
while(!mySpreadSheet.EOF)
   get(mySpreadSheet.nextLine)
   SQL("UPDATE MyTable with mySpreadSheet.nextLine")
我尝试过谷歌搜索,但没有结果。非常感谢您的帮助


其他信息:

  • 电子表格和Access表的列名相同
  • 每个数据类型都是nvarchar(MAX)(或Access调用的“Memo”)
  • 该表是SQL Server 2008的链接表

另外两个选项:

  • 在Access中像表格一样链接电子表格。在Access 2007中,转到“外部数据”窗格并选择“导入Excel电子表格”。您应该导入到现有数据表、新数据表或仅链接到Excel文件。然后,您将像Access表一样使用此新的“Excel”表格(考虑到性能问题,在最后一种情况下)

  • 尝试修复
    Docmd.TransferSpreadsheet
    问题。我已经使用此方法好几年了,它工作得很好,尽管在某些情况下它应该有点棘手(我相信这是您的情况)。请提供有关此方法问题的更多信息,包括您的Access和Excel版本


  • 希望我有所帮助。祝你好运。

    你可以创建一个与电子表格的ADO连接(请参阅),然后用该连接打开一个ADO记录集(请参阅示例)

    然后遍历记录集行,并使用该行的值创建SQL INSERT语句

    strInsert = "INSERT INTO MyTable (first_field, second_field) VALUES ('" & -
        rs2.Field(0).Value & "', '" & rs2.Field(1).Value & "');"
    Debug.Print strInsert
    CurrentDb.Execute strInsert, dbFailonerror
    
    截取的代码假定第一个字段和第二个字段是文本数据类型。如果它们是数字,则丢失单引号


    我认为这大致符合您的要求。但是,在使用代码之前,我会检查电子表格是否干净地导入到新的本机访问表中。(此外,检查新表上的数据类型和约束是否与链接SQL Server表的数据类型和约束兼容。)如果可行,可以尝试从Management Studio或任何合适的工具将电子表格直接导入SQL Server。

    ADO可以很好地工作,如果您有一个定义良好的数据表布局(HansUp答案)。如果在加载对象之前需要添加控件,则可以挂接excel工作簿,然后提取所需的任何数据。这实际上取决于所需的控件级别

    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
    

    出于故障排除目的,请尝试链接到电子表格,查看您遇到的问题,包括在“数据表”视图中查看时数据显示错误。

    您也可以尝试将Excel数据复制到剪贴板并粘贴到Access表中。失败的数据将通过Access写入“粘贴错误”表中

    将xlsx文件导出为csv,然后逐行读取是一种可行的解决方案吗?将电子表格限制为一条记录,看看它是否有效。对于完全错误的信息,会进行罕见的否决。ADO使用Jet/ACE驱动程序,将Excel电子表格视为数据库表没有问题。请参阅HansUp的答案,包括取消链接。好吧……我错了,我从未使用ADO连接Excel。但是,@RolandTumble先生,其他选项不是完成任务的方法?好吧,我无法删除否决票——但如果您编辑您的答案,我就可以。我投了赞成票。只是为了让我了解
    docmd.transferspreadsheet
    选项。txs。非常感谢您nk.你的计划对我很有效。真的很棒的计划。。。