Excel不将数据传输到Access数据库
我在Access 2010中有一个存储项目信息的表格。 为此目的,主要的栏目是LocationID
, Priority1
和Priority2
(它们有合适的名字,但是为了概括…)
我也有一个Excel 2010的电子表格,这些信息被导出到Access中。 它通过Excel和Access中的LocationID
列运行,并为所有匹配的字段着色。 然后,它检查Priority1
和Priority2
列,看是否有任何行已经被填充,并且颜色不是。 这部分工作正常。
接下来应该做的是将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