Excel 未将数据传输到 Access 数据库

Excel Not Transferring Data to Access Database

我在 Access 2010 中有一个 table 用于存储项目信息。为此,主要的列是 LocationIDPriority1Priority2(它们具有专有名称,但为了概括...)

我还有一个 Excel 2010 电子表格,其中包含要导出到 Access 的信息。它所做的是 运行 通过 Excel 和 Access 中的 LocationID 列,并为所有匹配字段着色。然后它检查 Priority1Priority2 列以查看是否有任何行已被填充,并为未填充的行着色。这部分工作正常。

它应该做的 下一步 是将 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