Excel 未将数据传输到 Access 数据库
Excel Not Transferring Data to Access Database
我在 Access 2010 中有一个 table 用于存储项目信息。为此,主要的列是 LocationID
、Priority1
和 Priority2
(它们具有专有名称,但为了概括...)
我还有一个 Excel 2010 电子表格,其中包含要导出到 Access 的信息。它所做的是 运行 通过 Excel 和 Access 中的 LocationID
列,并为所有匹配字段着色。然后它检查 Priority1
和 Priority2
列以查看是否有任何行已被填充,并为未填充的行着色。这部分工作正常。
它应该做的 下一步 是将 Excel 着色的两个 Priority
列的值复制到 Access table .这没有发生,我不确定为什么。
整个代码比较长,这里只介绍传值部分。我可以添加任何其他可能有用的代码。
If (Not (IsNull(path))) Then
Set cn = New ADODB.Connection
cn.Open "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & path & ";"
Set rs = New ADODB.Recordset
rs.Open "BCIImport", cn, adOpenKeyset, adLockOptimistic, adCmdTable
On Error Resume Next
Do While Len(Range("B" & r).Formula) > 0
With rs
If Not rs.BOF Then
rs.MoveFirst
End If
If (Range("B" & r).Interior.Color = RGB(0, 255, 255)) Then
.AddNew
.Fields("LocationID") = Range("B" & r).Value
.Fields("Priority1") = Range("C" & r).Value
.Fields("Priority2") = Range("D" & r).Value
.Update
End If
End With
r = r + 1 'advances to next row
Loop
rs.Close
cn.Close
Set rs = Nothing
Set cn = Nothing
End If
我不是一个 VBA 程序员,所以任何建议都很好。
我猜你的代码在尝试添加一个 LocationID 值与 LocationID 匹配的新行时触发了主键冲突另一行的值。这是添加新行的地方:
.AddNew
.Fields("LocationID") = Range("B" & r).Value
因为你在程序的前面有这个...
On Error Resume Next
...Access 不会通知您阻止添加该行的问题。
通过禁用 On Error
行来测试我的猜测,正如其他评论所建议的那样:
'On Error Resume Next
我怀疑您需要一种策略,首先检查当前 LocationID 值是否已存储在 table 中。如果存在,则更新该现有行。如果不存在,添加一个新行......像这样......
If DCount("*", "BCIImport", "LocationID=" & Range("B" & r).Value) = 0 Then
' add new row
Else
' update existing row
End If
我在 Access 2010 中有一个 table 用于存储项目信息。为此,主要的列是 LocationID
、Priority1
和 Priority2
(它们具有专有名称,但为了概括...)
我还有一个 Excel 2010 电子表格,其中包含要导出到 Access 的信息。它所做的是 运行 通过 Excel 和 Access 中的 LocationID
列,并为所有匹配字段着色。然后它检查 Priority1
和 Priority2
列以查看是否有任何行已被填充,并为未填充的行着色。这部分工作正常。
它应该做的 下一步 是将 Excel 着色的两个 Priority
列的值复制到 Access table .这没有发生,我不确定为什么。
整个代码比较长,这里只介绍传值部分。我可以添加任何其他可能有用的代码。
If (Not (IsNull(path))) Then
Set cn = New ADODB.Connection
cn.Open "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & path & ";"
Set rs = New ADODB.Recordset
rs.Open "BCIImport", cn, adOpenKeyset, adLockOptimistic, adCmdTable
On Error Resume Next
Do While Len(Range("B" & r).Formula) > 0
With rs
If Not rs.BOF Then
rs.MoveFirst
End If
If (Range("B" & r).Interior.Color = RGB(0, 255, 255)) Then
.AddNew
.Fields("LocationID") = Range("B" & r).Value
.Fields("Priority1") = Range("C" & r).Value
.Fields("Priority2") = Range("D" & r).Value
.Update
End If
End With
r = r + 1 'advances to next row
Loop
rs.Close
cn.Close
Set rs = Nothing
Set cn = Nothing
End If
我不是一个 VBA 程序员,所以任何建议都很好。
我猜你的代码在尝试添加一个 LocationID 值与 LocationID 匹配的新行时触发了主键冲突另一行的值。这是添加新行的地方:
.AddNew
.Fields("LocationID") = Range("B" & r).Value
因为你在程序的前面有这个...
On Error Resume Next
...Access 不会通知您阻止添加该行的问题。
通过禁用 On Error
行来测试我的猜测,正如其他评论所建议的那样:
'On Error Resume Next
我怀疑您需要一种策略,首先检查当前 LocationID 值是否已存储在 table 中。如果存在,则更新该现有行。如果不存在,添加一个新行......像这样......
If DCount("*", "BCIImport", "LocationID=" & Range("B" & r).Value) = 0 Then
' add new row
Else
' update existing row
End If