【问题标题】:Importing values from excel to access with criteria from access table从 excel 导入值以使用访问表中的条件进行访问
【发布时间】:2017-12-21 23:30:59
【问题描述】:

首先,提前感谢您的时间和帮助。这是我的情况;

我正在尝试将现有 excel 工作簿中的一些值添加到 access 数据库中的现有表中。这是我根据需要找到并使用它的代码,但是当我单击按钮时,它什么也不做。没有错误消息,没有导入的值,什么都不做。

Private Sub Command39_Click()

On Error GoTo Err_Handler

Dim wbFDU As Workbook
Dim objExcelApp As Excel.Application
Dim db As Database
Dim rstWL As Recordset
Dim columnI As String
Dim columnS As String
Dim searchInC As String
Dim C As String
Dim I As String
Dim M As String
Dim S As String
Dim W As String

Dim iCounter As Integer

Set db = CurrentDb
Set rstWL = db.OpenRecordset("Select * FROM WL WHERE WLDate = Date()-1")

Set objExcelApp = New Excel.Application
objExcelApp.Workbooks.Open ("\\CDB\Shared\MNG\CIO Mng.xlsm")
Set wbFDU = objExcelApp.Workbooks(1)

If rstWL.EOF = False Then

    rstWL.MoveFirst
    Do While rstWL.EOF = False

        iCounter = 1
        C = "C" & iCounter
        I = "I" & iCounter
        M = "M" & iCounter
        S = "S" & iCounter
        W = "W" & iCounter

        Do Until wbFDU.Worksheets("Rep").Range(C).Value = ""

            searchInC = wbFDU.Worksheets("Rep").Range(C).Value

            If rstWL!CustName = searchInC Then

               columnI = wbFDU.Worksheets("Rep").Range(I).Value + wbFDU.Worksheets("Rep").Range(M).Value
               columnS = wbFDU.Worksheets("Rep").Range(S).Value + wbFDU.Worksheets("Rep").Range(W).Value

                rstWL.Edit
                rstWL.Fields("LCDCO") = columnI
                rstWL.Update
                rstWL.Fields("ECDCO") = columnS
                rstWL.Update

            End If

            iCounter = iCounter + 1
            C = "C" & iCounter
            I = "I" & iCounter
            M = "M" & iCounter
            S = "S" & iCounter
            W = "W" & iCounter
        Loop

        rstWL.MoveNext
    Loop

End If

wbFDU.Close False
Set wbFDU = Nothing

rstWL.Close
Set rstWL = Nothing
db.Close
Set db = Nothing
Exit Sub

Err_Handler:

MsgBox "The following error has occured." & vbCrLf & vbCrLf & _
    "Error Number " & Err.Number & vbCrLf & _
    "Error Description" & Err.Description & vbCrLf & _
    "Your application will close!", _
    vbCritical, "An Error has Occured"

End Sub

由于几天无法弄清楚我做错了什么。

【问题讨论】:

  • 您是否打算更新或追加记录,因为您声称没有导入值?如果后者使用Recordset.AddNew 并调用整个表而不是特定的SELECT。也可以先尝试Ifblock as:If rstWL.RecordCount > 0
  • 我的目的是更新记录。访问表具有带有其他值的客户 ID(并且相同的客户 ID 可能存在于许多不同的日期,这就是我尝试使用 Date()-1 条件调用记录集的原因,因此只有我在 excel 文件中的日期才会生效)。 Excel 表中有一些具有不同值的客户,这就是我需要作为更新将其引入访问表中的字段的值。
  • 尝试按 F8 逐行浏览代码。 Do Until wbFDU.Worksheets("Rep").Range(C).Value = ""If rstWL!CustName = searchInC Then 行可能会阻止您的更新触发。
  • 如果没有任何反应,那么您的查询要么不返回任何结果,要么没有任何更新。
  • 非常感谢 Parfait 和 destination-data,感谢您的宝贵时间和宝贵意见!代码现在工作正常,问题是源 Excel 文件,范围 C 在 4 行后有空单元格,所以代码停在那里。不过,我发现了另一个问题;有一些客户在同一天执行了 2 个或更多操作,因此代码为该特定客户执行操作的每条记录带来相同的总量。我现在正试图摆脱那些重复。棘手的部分是,所有操作都必须保留在访问表中,但 Excel 文件中的数据只能出现一次。

标签: vba ms-access


【解决方案1】:

考虑直接在 MS Access 中查询 Excel 工作簿,而不需要记录集循环。具体来说,使用每次重新创建或清除的临时表,以便在带有 WLUPDATE 查询中使用。

但是,您的工作簿似乎没有使用任何列标题,因此请指定 HDR=No,这将在查询结果集中产生 F1、F2、F3...。否则,请使用 HDR=Yes 并引用命名列。

Make-Table查询(第一次后,使用删除/追加查询进行后续Excel更新)

SELECT *
INTO myExcelTempTable
FROM [Excel 12.0 Xml;HDR=No;Database=\\CDB\Shared\MNG\CIO Mng.xlsm].[Rep$] AS t;

更新查询

UPDATE WL 
INNER JOIN myExcelTempTable AS t
ON WL.CustomerId = t.F3           --F3  being Column C (customer id)

SET LCDCO = F9,                   --F9  being Column I
    ECDCO = F19                   --F19 being Column S

WHERE WL.WLDate = Date()-1;

不要在 MS Access 的上述查询中使用 cmets。此处仅用于指导您。

【讨论】:

  • 再次感谢 Parfait,我会尽快尝试这种方法。以前从未处理过此类查询,并且很想学习它们。