使用VBA导入大型、各种EXCEL以访问

使用VBA导入大型、各种EXCEL以访问,excel,ms-access,Excel,Ms Access,我有一个项目要创建一个access数据库,该数据库将能够将不同列数、列名和行数的EXCEL(从SurveyMonkey类程序导出)导入access,然后交叉遍历以在统一表(SQL后端上的链接表)中设置行,以便跨调查比较数据 如果我能让卓越进入Access,我就可以完成其余的工作,但我总是会出错 下面是我尝试使用的脚本。当按下按钮时,脚本将运行。它从工作人员输入的文本字段中获取文件名。我试图使用DoCmd.TransferSpreadsheet,但对于某些文件,我得到了“运行时错误3047记录太大

我有一个项目要创建一个access数据库,该数据库将能够将不同列数、列名和行数的EXCEL(从SurveyMonkey类程序导出)导入access,然后交叉遍历以在统一表(SQL后端上的链接表)中设置行,以便跨调查比较数据

如果我能让卓越进入Access,我就可以完成其余的工作,但我总是会出错

下面是我尝试使用的脚本。当按下按钮时,脚本将运行。它从工作人员输入的文本字段中获取文件名。我试图使用DoCmd.TransferSpreadsheet,但对于某些文件,我得到了“运行时错误3047记录太大”(或其他错误),尽管最大单元格长度为430个单元格,只有75列

此外,由于访问字段名字符的限制,即使它可以工作(对于一些较小的Excel也是如此),列名也会被切断(我尝试了一种不带列标题的导入方法,但39之后的任何列都不会被包括在内)。理想情况下,字段名应命名为F1、F2等,然后在导入带有字段(FieldName、ColumnName)的表时,插入列,使表看起来像

| FieldName | ColumnName
| F1        | [Column1 Name]
| F2        | [Column2 Name]
etc...
如果有一个完全不同的方式来处理这个项目,我很乐意去一个不同的方向。我真的希望这里有个魔术师能帮我!短暂性脑缺血发作

按钮脚本:

Dim NameOfTable As String
Dim NameOfFile As String
Dim rst As DAO.Recordset, db As DAO.Database, x As Integer
Dim FieldName As String

Dim NameOfTable2 As String

NameOfTable2 = "TableOfColumns"

NameOfTable = Me.cbxTable.Value
NameOfFile = "\\dcfs\teleforms\Data for Julian\Dashboard Data\BackUps\" & Me.cbxTable.Value & ".xlsx"

'-Does table  exist?  If true, delete it;
 If Not IsNull(DLookup("Name", "MSysObjects", "Name='" & NameOfTable & "'")) Then
        DoCmd.SetWarnings False
        DoCmd.Close acTable, NameOfTable, acSaveYes
        DoCmd.DeleteObject acTable = acDefault, NameOfTable
        Debug.Print "Table" & NameOfTable & "deleted..."
        DoCmd.SetWarnings True
    End If
'Create new tblTable

DoCmd.TransferSpreadsheet _
        TransferType:=acImport, _
        SpreadsheetType:=acSpreadsheetTypeExcel12Xml, _
        TableName:=NameOfTable, _
        FileName:=NameOfFile, _
        HasFieldNames:=True


'Testing column name grab

 If Not IsNull(DLookup("Name", "MSysObjects", "Name='" & NameOfTable2 & "'")) Then
        DoCmd.SetWarnings False
        DoCmd.Close acTable, NameOfTable2, acSaveYes
       DoCmd.DeleteObject acTable = acDefault, NameOfTable2
       Debug.Print "Table" & NameOfTable2 & "deleted..."
      DoCmd.SetWarnings True
    End If
    
DoCmd.TransferSpreadsheet _
        TransferType:=acImport, _
        SpreadsheetType:=acSpreadsheetTypeExcel12Xml, _
        TableName:=NameOfTable2, _
        FileName:=NameOfFile, _
        HasFieldNames:=False

您的意思是“最大单元格长度为430个字符”吗?好的,TransferSpreadsheet通过分析前十几行左右的数据来确定数据类型。若将字段设置为短文本类型,那个么import将遇到430个字符的单元格,它将不适合。然而,我认为它只会截断数据。我的研究表明,如果导入涉及4000多条记录,则可能会触发引用错误。不要导入,试着只设置一个链接-
acLink
。嗯,我会查看acLink。至于截断,我不知道。它只是给我一个错误信息,所以我假设它不会这样做。excel只有40多行,所以这不是问题所在