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

Posted

技术标签:

【中文标题】VBA将Excel电子表格逐行导入Access【英文标题】:VBA to import Excel Spreadsheet into Access line-by-line 【发布时间】:2011-03-15 10:47:45 【问题描述】:

我正在调试一些代码,需要找出aDoCmd.TransferSpreadsheet acImport, , "..... 失败了,所以我决定逐行“手动”导入它,看看它在哪里掉下来。

我想我正在寻找这样的东西:

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

我试过谷歌搜索无济于事。非常感谢任何帮助!


附加信息:

电子表格和 Access 表的列名相同。 每种数据类型都是 nvarchar(MAX)(或 Access 称之为“备忘录”) 该表是与 SQL Server 2008 的链接表

【问题讨论】:

将 xlsx 文件导出为 csv 然后逐行读取是一种可能的解决方案吗? 将您的电子表格限制为只有一条记录,看看它是否有效。 【参考方案1】:

如果您有明确定义的数据工作表布局,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

【讨论】:

非常感谢芬克。你的程序对我很有效。真的很棒的程序...【参考方案2】:

您可以创建到电子表格的 ADO 连接(请参阅 Connection strings for Excel 2007),然后使用该连接打开 ADO 记录集(例如,请参阅 ***: ADODB recordset in VBA says excel field is empty when it's not)。

然后遍历记录集行,并使用行的值创建 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

截断的代码假定 first_field 和 second_field 是文本数据类型。如果它们是数字,请去掉单引号。

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

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

您也可以尝试将 Excel 数据复制到剪贴板,然后将其粘贴到 Access 表中。任何失败都会被 Access 写入“粘贴错误”表中。

【讨论】:

【参考方案5】:

两个附加选项:

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

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

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

【讨论】:

一个罕见的反对票,给出了彻底的错误信息。使用 Jet/ACE 驱动程序的 ADO 将 Excel 电子表格视为数据库表没有问题。请参阅 HansUp 的答案,包括链接。 好吧...我错了,我从来没有使用 ADO 连接到 Excel。但是,先生。 @RolandTumble,其他选项不是完成任务的方法吗? 好吧,我无法删除反对票——但如果你编辑你的答案,我就可以了。 我投了赞成票。只是为了让我知道docmd.transferspreadsheet 选项。发送。

以上是关于VBA将Excel电子表格逐行导入Access的主要内容,如果未能解决你的问题,请参考以下文章

访问 VBA 以拆分 Excel 中的所有合并单元格

VBA Excel - 从 MS Access 将列名保存到电子表格

Access VBA:删除单元格值与 Access 表中的值匹配的 Excel 行

将 Excel 文件导入 Access VBA 时更改数据类型

将 Excel 电子表格导入 MS Access 数据库

将 Excel 中的两列导入现有的 Access2010 表中使用转移电子表格时出错