VBA将Excel电子表格逐行导入Access
我正在调试一些代码,需要找出aVBA将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") 我尝试过谷歌搜索,但
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的链接表
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.你的计划对我很有效。真的很棒的计划。。。