使用DoCmd.TransferSpreadsheet时如何避免accdb行大小限制?

时间:2014-12-05 11:27:18

标签: excel vba access-vba

我正在使用DoCmd.TransferSpreadsheet将数据从Excel导入Access。 一切正常,除了一些被截断的Excel行,因为Access单行(而不是字段)的字节太多。

我注意到Access中的每个字段都创建为文本(255),而我的Excel行不超过100个字符。

我认为如果我设法导入我的Excel文件创建默认长度为100个字符的字段,我将不再获得截断数据。

有没有办法将Access字段的默认文本长度设置为特定数字?


更新

在运行DoCmd.TransferSpreadsheet

时,似乎忽略了减少Access 2010选项中的默认字段文本大小

2 个答案:

答案 0 :(得分:0)

要设置Access(2007)的默认文本长度,请单击Office按钮> "访问选项按钮" > "对象设计师" (在左侧窗格中),然后在“表设计”下的“默认文本字段大小”框中输入50,然后单击“确定”。

答案 1 :(得分:0)

我编写了自己的导入功能,它可以工作:

' Import from an Excel with a default field length different from 255 (must be < 255)
Function importFromExcel(fileName As String, fieldLength as integer)
    Dim my_xl_app As Object
    Dim my_xl_worksheet As Object
    Dim my_xl_workbook As Object
    Set my_xl_app = CreateObject("Excel.Application")
    Set my_xl_workbook = my_xl_app.Workbooks.Open(fileName)
    Set s = my_xl_workbook.Worksheets(1)

    Dim fieldsNumber As Integer
    Dim recordNumber As Long
    fieldsNumber = s.cells(1, s.Columns.Count).End(1).Column
    recordNumber = s.cells(s.Rows.Count, 1).End(3).Row
    tablename = "[" & Replace(GetFilenameFromPath(fileName), ".", "_") & "]"
    On Error Resume Next
    DoCmd.RunSQL "DROP TABLE " & tablename
    On Error GoTo 0

    ' Creo tabella
    sql = "CREATE TABLE " & tablename & " (F1 TEXT(" & fieldLength & ")) "
    DoCmd.RunSQL sql

    For i = 2 To fieldsNumber
        sql = "ALTER TABLE " & tablename & " ADD COLUMN F" & i & " TEXT(" & fieldLength & ")"
        DoCmd.RunSQL sql
    Next



    ' Ora insert
    For i = 1 To recordNumber
        sql = "INSERT INTO " & tablename & " VALUES ("
        For j = 1 To fieldsNumber
            sql = sql & " '" & Replace(s.cells(i, j), "'", "''") & "',"
        Next
        sql = Mid(sql, 1, Len(sql) - 1)
        sql = sql & ")"

    Next

    my_xl_workbook.Close SaveChanges:=False
    Set my_xl_app = Nothing
End Function