【问题标题】:Excel Not Transferring Data to Access DatabaseExcel 未将数据传输到 Access 数据库
【发布时间】:2015-07-24 22:08:03
【问题描述】:

我在 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 程序员,所以任何建议都会很棒。

【问题讨论】:

  • 注释掉On Error Resume Next,然后再次运行代码,看看会发生什么。 (我假设您在此代码之前的某个时间点将 r 设置为有效值?)
  • 是的,r在开头定义为r=2。这仍然返回空白字段。
  • 一旦你弄清楚错误是什么,将注释掉的On Error Resume Next 行删除。然后在此站点上快速搜索 VBA 中的错误处理。永远不知道发生了什么的最好方法是使用On Error Resume Next
  • 如果您没有收到任何错误但在数据库中获得了空白字段,那么您很有可能只需要指定代码应该使用的工作表 - 即使用Worksheets("foo").Range(...).Value,而不仅仅是使用Range(...).Value

标签: excel ms-access ms-access-2010 excel-2010 vba


【解决方案1】:

我的猜测是您的代码在尝试添加具有与另一行的 LocationID 值匹配的 LocationID 值的新行时触发了主键冲突。这是添加新行的位置:

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

因为你在程序的前面有这个......

On Error Resume Next

... Access 不会通知您阻止添加该行的问题。

按照其他 cmets 的建议,禁用 On Error 行来测试我的猜测:

'On Error Resume Next

我怀疑您需要一种策略,首先检查当前 LocationID 值是否已存储在表中。如果存在,请更新该现有行。如果不存在,请添加一个新行......类似这样......

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

【讨论】:

    猜你喜欢
    • 2016-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 2016-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多