使用Excel用户表单搜索Access数据库,并使用VBA在列表框中显示结果

使用Excel用户表单搜索Access数据库,并使用VBA在列表框中显示结果,excel,database,vba,ms-access,Excel,Database,Vba,Ms Access,我在Excel中有一个userform,我打算用作搜索表单,并有一个列表框来显示结果 表单将从我的Access数据库中的表中搜索帐号。 除了一个搜索字段(文本框),它还有一个搜索按钮(CommandButton)和一个列表框 我的目标: 从Excel连接到我的Access数据库 验证搜索字段。 如果该字段为空,则显示消息以输入帐号。 如果该条目不在表中,则返回一条消息,说明该账号不存在。 如果表中有帐号,则在列表框中显示结果 我正在尝试创建Excel工作表以放置查询结果 AcctNo是Acces

我在Excel中有一个userform,我打算用作搜索表单,并有一个列表框来显示结果

表单将从我的Access数据库中的表中搜索帐号。
除了一个搜索字段(文本框),它还有一个搜索按钮(CommandButton)和一个列表框

我的目标:

  • 从Excel连接到我的Access数据库
  • 验证搜索字段。
    如果该字段为空,则显示消息以输入帐号。
    如果该条目不在表中,则返回一条消息,说明该账号不存在。
    如果表中有帐号,则在列表框中显示结果
  • 我正在尝试创建Excel工作表以放置查询结果

  • AcctNo是Access中my MemberAccts表的标题之一
  • acctNoField是我的搜索表单中搜索字段的名称
  • 错误是

    “一个或多个参数没有给定值”

    调试时,
    rst.Open qry、cnn、adOpenKeyset、adLockOptimistic
    突出显示

    我是哪个参数

    Private Sub-acctSearchBtn\u Click()
    将sh设置为工作表
    Set sh=ThisWorkbook.Sheets(“AcctInfo”)
    sh.Cells.ClearContents
    将cnn设置为新的ADODB.连接
    将rst设置为新ADODB.Recordset
    像弦一样模糊,
    作为字符串的Dim AcctNo
    如果Me.acctnofeld.Value=”“,则
    MsgBox“请输入帐号”,VBC
    出口接头
    ElseIf Me.acctNoField.Value qry然后
    cnn.Open“Provider=Microsoft.ACE.OLEDB.12.0;数据源=E:\MasterDb.accdb”
    qry=“从membracts中选择*,其中Me.acctNoField.Value=”&AcctNo&“
    rst.开放qry、cnn、adOpenKeyset、AdLock
    MsgBox“账号不存在”,vbCritical
    出口接头
    其他的
    MsgBox“此处放置检索账户功能”,vbCritical
    如果结束
    rst.关闭
    有线电视新闻网,结束
    端接头
    
    在qry代码中,Me.acctNoField.Value和AcctNo处于彼此的位置。不需要声明AcctNo变量。将acctnofeld.Value与qry变量进行比较毫无意义。缺少空记录集的测试

    考虑:

    If Me.acctNoField.Value = "" Then
        MsgBox "Please enter an Account Number", vbCritical
    
    Else
    
        cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=E:\MasterDb.accdb"
        qry = "SELECT * FROM MembrAccts WHERE AcctNo = '" & Me.acctNoField.Value & "'"
    
        rst.Open qry, cnn, adOpenKeyset, adLockOptimistic
    
        If rst.EOF And rst.BOF Then
            MsgBox "The Account Number does not exist", vbCritical
        Else
            'code here to read data from recordset, perhaps use CopyFromRecordset
            sh.Range("A1").CopyFromRecordset rst
        End If
    
        rst.Close
        cnn.Close
    
    End If
    

    为什么要涉及Excel呢?为什么需要导出到Excel?为什么不从访问端进行搜索、筛选和导出?Review是表名实际上拼写为MembrAccts还是缺少
    e
    ?当Access无法将查询语句中的名称与Access表字段(或其他表达式)匹配时,它会将名称解释为参数(请参阅上的DAO/ACE部分)。如果没有为参数指定值,则会出现此错误。我假设您的Access数据库中没有名为
    Me.acctNoField.Value
    的字段;因此出现了错误。感谢您的回复。我会检查我的代码。谢谢。我一定会努力的。