You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

从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

火山引擎 最新活动