从Excel导入数据时设置列类型为Memo的技术求助
解决Excel导入Access时Memo字段数据截断问题
我之前也碰到过一模一样的问题——用TransferSpreadsheet自动导入时,Access会默认把长文本列识别成最多255字符的Text类型,导致超过长度的数据直接丢失。下面给你几个可行的解决方法:
方法一:预先创建带Memo字段的临时表(最稳妥)
既然你导入的目标表是_tmp_table,不如提前在Access里建好这个表,把需要存长文本的列手动设置为Memo类型(Access 2016及以后叫「长文本」),再执行导入操作。如果不想手动建表,也可以用VBA动态创建:
' 先创建/重置临时表 Dim db As DAO.Database Set db = CurrentDb ' 如果表已存在就删除 On Error Resume Next db.TableDefs.Delete "_tmp_table" On Error GoTo 0 ' 创建新表并定义字段类型 Dim td As DAO.TableDef Set td = db.CreateTableDef("_tmp_table") ' 示例:添加需要的字段,把要存长文本的列设为dbMemo td.Fields.Append td.CreateField("序号", dbInteger) td.Fields.Append td.CreateField("详细备注", dbMemo) ' 这里就是Memo类型 ' 继续添加其他需要的字段... db.TableDefs.Append td Set td = Nothing Set db = Nothing ' 执行导入(因为表已存在,确保表头匹配,最后一个参数True表示第一行是表头) DoCmd.TransferSpreadsheet acImport, _ acSpreadsheetTypeExcel9, "_tmp_table", strFile, True
方法二:用Schema.ini文件指定字段类型
如果不想预先建表,可以在Excel文件的同目录下生成一个Schema.ini文件,告诉Access该怎么识别每一列的类型。这种方式适合动态处理不同的Excel文件:
' 生成Schema.ini文件 Dim schemaPath As String schemaPath = Left(strFile, InStrRev(strFile, "\")) & "Schema.ini" Open schemaPath For Output As #1 Print #1, "[" & Mid(strFile, InStrRev(strFile, "\") + 1) & "]" Print #1, "ColNameHeader=True" ' 表示Excel第一行是表头 ' 指定列类型:比如第2列(或列名)设为Memo Print #1, "Col2=详细备注 Memo" ' 如果用列名的话,也可以直接写"详细备注 Memo" Close #1 ' 执行导入,Access会读取Schema.ini的配置 DoCmd.TransferSpreadsheet acImport, _ acSpreadsheetTypeExcel9, "_tmp_table", strFile, True
额外注意事项
- 尽量避免用
TASKKILL /F /IM Excel.exe,这个命令会杀死所有打开的Excel进程,可能导致用户其他未保存的Excel文件丢失。正常情况下,oExcel.Quit加上Set oExcel = Nothing就能关闭你创建的Excel实例;如果遇到进程残留,可以考虑用API查找特定进程再关闭,而不是一刀切。 - 如果是Access 2016及更高版本,Memo类型对应界面里的「长文本」,代码里还是用
dbMemo来定义字段类型。
内容的提问来源于stack exchange,提问作者dmorgan20




