2011-03-15 208 views
3

我调试一些代码,需要找出一个
DoCmd.TransferSpreadsheet acImport, , ".....
失败,所以我决定将其导入“手动”行由行看看它跌倒在哪里。VBA导入Excel电子表格到Access行由行

我想这样的事情就是我在寻找:

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

我试图谷歌搜索无果。任何帮助深表感谢!


附加信息:

  • 电子表格,Access表的列名是相同的。
  • 每个数据类型为nvarchar(MAX)(或 “备忘录” 的访问调用它)
  • 该表是一个链接表到SQL Server 2008
+0

是否可以将xlsx文件导出为csv,然后逐行读取它? – 2011-03-15 12:32:46

+0

@MPękalski可能! – 2011-03-15 12:50:55

+2

将您的电子表格限制为仅一条记录,并查看它是否可用。 – JeffO 2011-03-15 17:42:55

回答

5

您可以创建与电子表格的ADO连接(请参见Connection strings for Excel 2007),然后使用该连接打开ADO记录集(例如,参见StackOverflow: 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中,或者任何适当的工具。

0

两个附加选项:

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

  2. 尝试修复Docmd.TransferSpreadsheet问题。我一直在使用这种方法多年,并且它工作正常,尽管在某些情况下它应该有点棘手(我相信它的情况)。如果您使用此方法提供有关您的问题的更多信息(包括您的Access和Excel版本),请值得。

我希望我能帮上忙。祝你好运。

+1

罕见的downvote,给予直接_wrong_信息。使用Jet/ACE驱动程序的ADO将Excel电子表格视为数据库表格没有任何问题。见HansUp的答案,包括链接。 – RolandTumble 2011-03-15 18:08:00

+0

好吧......我错了,我从来没有用过ADO连接到Excel。但是,先生。 @RolandTumble,其他选项不是做任务的方法吗? – Alex 2011-03-15 19:00:18

+0

其他选项可行 - 删除downvote。 – RolandTumble 2011-03-15 22:40:23

10

如果您有一个明确定义的数据表布局(HansUp答案),ADO会很好地工作。如果您在加载对象之前需要添加控件,则可以挂钩到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 
+0

非常感谢Fink。你的程序对我来说效果很好。真的很棒的节目... – 2012-05-18 09:03:51

0

为了排除故障,尝试连接到电子表格,看看你所遇到的问题,包括数据显示错了,当你在数据表视图中查看它。

0

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

相关问题