DCount类型不匹配错误VBA

时间:2016-08-03 23:28:52

标签: excel excel-vba access-vba vba

我尝试使用DCount在将数据插入数据库之前查看表中是否存在记录但是我在#34;客户编号"中不断出现类型不匹配错误。并且不知道为什么。代码如下:

Public Sub ExportData()
Set cn = CreateObject("ADODB.Connection")
dbPath = Application.ActiveWorkbook.Path & "\PRID.mdb"
dbWb = Application.ActiveWorkbook.FullName
dbWs = Application.ActiveSheet.Name
scn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & dbPath
dsh = "[" & Application.ActiveSheet.Name & "$]"
cn.Open scn

ssql = "INSERT INTO [Investment Data] ([Customer Number])"
ssql = ssql & "SELECT  [Customer Number] FROM [Excel 8.0;HDR=YES;DATABASE=" & dbWb & "]." & dsh

If Application.WorksheetFunction.DCount("Customer Number", "Investment Data", "[Customer Number]=" & Range("A2")) > 0 Then
    MsgBox ("A similar entry has been detected within the PRID database, please make sure that this is a new entry before you continue.")
Else
    MsgBox ("Entry has been entered into the database.")
    cn.Execute ssql
    Exit Sub
End If

感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

这应解决您的问题

您可以在查询中添加WHERE子句,该子句将跳过[投资数据]表中已存在的[客户编号]。


ssql = ssql & _
 " WHERE [Customer Number] NOT IN(SELECT [Customer Number] FROM [Investment Data]);)"

然后,您可以使用Connection.Execute返回添加的记录数。


Results = cN.Execute(ssql)

MsgBox Results & " Records were added " & (allRecordsCount - Results) & "Records Were Skipped"

如果您想在插入记录之前提醒用户,则需要两次查询。

ssql = ssql & "SELECT [Customer Number] FROM [Excel 8.0;HDR=YES;DATABASE=" & dbWb & "]." & dsh & _
   ssql & " WHERE [Customer Number] IN(SELECT [Customer Number] FROM [Investment Data]);)"


Set rs = CreateObject("ADODB.Recordset")
Set rs = cN.Execute(ssql)


If Not rs.BOF AND  Not rs.EOF Then
    msg = msg & vbCrLf & rs.Fields("Customer Number").Value
    rs.MoveNext
End If

If msg <> "" Then

    MsgBox "These Records Are Duplicates" & vbCrLf & msg
    Exit Sub
End If

这应该回答你的问题

您收到“DCount类型不匹配错误VBA”,因为您尝试使用Excel WorksheetFunction DCount查询外部Access数据库。

测试查询

Public Sub TestQueries()
    Set cN = CreateObject("ADODB.Connection")
    Set rs = CreateObject("ADODB.Recordset")
    dbPath = Application.ActiveWorkbook.path & "\PRID.mdb"
    'dbPath = "C:\Users\best buy\Downloads\stackoverfow\Sample Data File\test.mdb"
    dbWb = Application.ActiveWorkbook.FullName
    dbWs = Application.ActiveSheet.Name
    scn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & dbPath
    dsh = "[" & Application.ActiveSheet.Name & "$]"
    cN.Open scn

    ssql = ssql & "SELECT [Customer Number] FROM [Excel 8.0;HDR=YES;DATABASE=" & dbWb & "]." & dsh

    Set rs = cN.Execute(ssql)

    Do While Not rs.BOF And Not rs.EOF
        msg = msg & vbCrLf & rs.FIelds(0).Value
        rs.MoveNext
    Loop

    MsgBox msg, vbInformation, "Results Query Without Where Clause"

    ssql = ssql & _
 " WHERE [Customer Number] IN(SELECT CDbl([Customer Number]) FROM [Investment Data])"

    msg = ""

    Set rs = cN.Execute(ssql)

    Do While Not rs.BOF And Not rs.EOF
        msg = msg & vbCrLf & rs.FIelds(0).Value
        rs.MoveNext
    Loop

    MsgBox msg, vbInformation, "Results Query With Where Clause"


End Sub