【发布时间】:2013-10-18 18:16:17
【问题描述】:
我有以下 Excel VBA 代码,它读取 Excel 中的一列并将值导入 Access 中的表:
Dim Cn As Object
Dim strSql As String
Dim strConnection As String
Set Cn = CreateObject("ADODB.Connection")
strConnection = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=C:\myDatabase.accdb"
Cn.Open strConnection
For i = 2 To ActiveSheet.UsedRange.Rows.Count
Cn.Execute "INSERT INTO myTable VALUES (" & Cells(i, 1).Value & ")"
Next i
Cn.Close
Set Cn = Nothing
问题在于,即使列中的值在技术上是数字(0001234、0123456、0001 等),该列的格式为文本,而 Access 表中的字段格式为文本。但是上面的代码仍然将它们作为数字导入,这会删除前导 0(s)。有没有办法强制它们作为文本值导入?
谢谢!!
编辑:我尝试在列中的值前面加上一个单引号(例如:'0001234 而不是 0001234),但它们仍以数字形式导入。
EDIT2:我也试过这个:
Dim Cn As Object
Dim strSql As String
Dim strConnection As String
Dim CellValue as String
Set Cn = CreateObject("ADODB.Connection")
strConnection = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=C:\myDatabase.accdb"
Cn.Open strConnection
For i = 2 To ActiveSheet.UsedRange.Rows.Count
CellValue = Cells(i, 1).Value
Cn.Execute "INSERT INTO myTable VALUES (" & CellValue & ")"
Next i
Cn.Close
Set Cn = Nothing
但导入时,这些值仍然会删除前导 0。
EDIT3 - 已解决!! 我必须在 Cells(i, 1).Value 周围加上双引号。现在前导 0 保持不变!
Dim Cn As Object
Dim strSql As String
Dim strConnection As String
Set Cn = CreateObject("ADODB.Connection")
strConnection = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=C:\CarrierAudit.accdb"
Cn.Open strConnection
For i = 2 To ActiveSheet.UsedRange.Rows.Count
Cn.Execute "INSERT INTO Pinnacol_NDC VALUES (""" & Cells(i, 1).Value & """)"
Next i
Cn.Close
Set Cn = Nothing
【问题讨论】:
-
你能做类似
Dim cellValue as String然后cellValue = Cells(i, 1).Value,然后在你的Cn.Execute中,用Cells(i, 1).Value替换cellValue吗?我不知道这是否会有所作为。 -
cellValue = Cells(i, 1).Value.toString("D8")ifValue有一个toString方法(我对 VBA 不是 100% 满意)。如果可行,您甚至可能不需要cellValue变量。只需将toString("D8")添加到您已有的内容中即可。 -
或者更好的是,
Dim cellValue as Int然后"INSERT INTO myTable VALUES (" & cellValue.toString("D8") & ")"应该可以工作。 -
试试
ToString而不是toString,我忘了VBA喜欢大写。 -
成功了!
Cn.Execute "INSERT INTO Pinnacol_NDC VALUES (""" & CellValue & """)".. 必须在值周围加上额外的双引号。