Excel VBA向Access表新增记录时写入空白值问题咨询
问题产生原因
核心错误是字段引用的行号写错了:
- 从你计算
lastColumn的逻辑(取第2行最右非空列)可以判断,Excel表的表头(和Access字段名一一对应的列名)存放在第2行,实际数据从第3行开始遍历。 - 但内层赋值循环中,你写的是
rs(sht.Cells(i, j).Value) = sht.Cells(i, j).Value,这里的i是当前遍历的数据行号(从3开始),相当于拿数据行的单元格内容当Access表的字段名去匹配,完全找不到对应字段,因此没有任何字段被写入有效值。 - Access表第一列的自动编号列不需要手动赋值,ADO执行新增时会自动生成,这部分逻辑没有问题,最终只会插入带自增ID的空白行。
修正方法
只需要把Recordset字段引用的行号从数据行变量i改为表头行号2即可,修正后的核心循环代码如下:
For i = 3 To lastRow rs.AddNew For j = 1 To lastColumn ' 取第2行表头值作为Access字段名,替换原来的i行引用 rs(sht.Cells(2, j).Value) = sht.Cells(i, j).Value Next j rs.Update Next i
可选优化建议
- 可以在赋值前增加判断,跳过Excel中表头为空、或者Access不存在对应字段的列,避免运行时报错。
- 如果数据量较大,不建议使用逐行Recordset新增的方式,可以直接用SQL批量插入,执行效率会高很多。
内容的提问来源于stack exchange,提问作者Alex Silva
相关产品推荐
相关产品推荐

