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

我在Access 2010中有一个存储项目信息的表格。 为此目的,主要的栏目是LocationIDPriority1Priority2 (它们有合适的名字,但是为了概括…)

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

接下来应该做的是将Excel中两个Priority列的值复制到Access表中。 这没有发生,我不知道为什么。

整个代码相当长,所以这里只是关于传输值的部分。 我可以添加任何其他可能有用的代码。

 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程序员,所以任何build议都会很好。

我的猜测是,当您尝试添加一个LocationID值与另一行的LocationID值相匹配的新行时,您的代码会触发主键冲突。 这是添加新行的地方:

 .AddNew .Fields("LocationID") = Range("B" & r).Value 

既然你在这个过程中有这个…

 On Error Resume Next 

…访问不会通知您阻止该行被添加的问题。

通过禁用On Error行来testing我的猜测,就像推荐的其他评论一样:

 'On Error Resume Next 

我怀疑你会需要一个策略,首先检查当前的LocationID值是否已经存储在表中。 如果存在,请更新该现有行。 如果不存在,添加一个新的行…像这样的东西…

 If DCount("*", "BCIImport", "LocationID=" & Range("B" & r).Value) = 0 Then ' add new row Else ' update existing row End If