【问题标题】:Excel VBA - Importing numbers into Access table as textExcel VBA - 将数字作为文本导入 Access 表
【发布时间】: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") if Value 有一个 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 & """)" .. 必须在值周围加上额外的双引号。

标签: excel vba


【解决方案1】:

当前,该行中的字符串

Cn.Execute "INSERT INTO myTable VALUES (" & CellValue & ")"

将评估为 0001234:

INSERT INTO myTable VALUES (0001234)

因为 0001234 周围没有引号,所以被 SQL 当作数字而不是字符串来处理。 将该行代码更改为:

Cn.Execute "INSERT INTO myTable VALUES (""" & CellValue & """)"

额外的引号“”是VBA字符串转义序列,表示在计算字符串时应将双引号放入字符串中,生成以下内容:

INSERT INTO myTable VALUES ("0001234")

这将导致 SQL 将其视为文本字符串并正确插入。

【讨论】:

  • 我在你发布它之前就知道了,但我会接受它,因为它是正确的答案:)
  • 谢谢!希望它会帮助其他正在寻找相同东西的人。
  • 我同意。这个网站帮助了我很多!
【解决方案2】:

尝试使用CellValue = Cells(i, 1).Text 访问单元格的文本值

【讨论】:

  • 谢谢 .. 我刚刚尝试过,它仍然会从单元格值中删除前导 0。我不得不在整个事情上加上双引号(更新了原帖)
  • 如果你想要一个六位数字前面带零的数字,你可以将单元格的数字格式更改为“000000”
猜你喜欢
  • 2011-11-16
  • 1970-01-01
  • 2014-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多