我正在调试一些代码,需要找出一个
DoCmd.TransferSpreadsheet acImport, , ".....
失败了,所以我决定“手动”逐条导入它,以查看它的掉落在哪里。

我想这样的东西是我想要的:

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

我尝试谷歌搜索无济于事。任何帮助深表感谢!


附加信息:

  • 电子表格和访问表的列名是相同的。
  • 每种数据类型都是nvarchar(max)(访问称为“备忘录”)
  • 该表是链接表到SQL Server 2008
有帮助吗?

解决方案

您可以创建与电子表格的ADO连接(请参阅 Excel 2007的连接字符串),然后打开具有该连接的ADO记录集(请参阅 stackoverflow:vba中的adodb记录集说Excel字段是空的 例如)。

然后穿过记录集行,并使用行的值创建一个SQL插入语句。

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是文本数据类型。如果它们是数字,则会失去单个引号。

我认为这大致做出了您的要求。但是,在诉诸代码之前,我将检查电子表格是否干净地导入到新的本机访问表中。 (另外,检查该新表上的数据类型和约束是否与链接的SQL Server表的数据类型和约束。)如果有效,请尝试将电子表格直接从管理工作室导入SQL Server,或者任何适用的工具。

其他提示

如果您的数据的定义明确布局(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

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

您也可以尝试将Excel数据复制到剪贴板并将其粘贴到访问表中。无论失败,都会通过访问将其写入“粘贴错误”表中。

另外两个选项:

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

  2. 尝试修复 Docmd.TransferSpreadsheet 问题。我已经使用了这种方法了几年,尽管在某些情况下应该有些棘手(我相信这是您的情况)。请,如果您通过此方法提供有关问题的更多信息,包括您的访问和Excel版本,那值得。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top