vba - 使用组合框和带有 Excel 2003 VBA 的文本框的多个高级过滤器

标签 vba excel combobox excel-2003

在发布我的问题之前,我仔细搜索了这些主题,但实际上找不到适合我的案例的匹配项。

我使用 Excel 2003 为当前工作的需要创建了一个大型数据库。我已经建立了一个具有八个可能标准选项的高级筛选器。现在我必须通过设置一个 UserForm 来扩展界面和功能。不幸的是,我觉得如果我不完成这件事,我可能会失去工作。

我的用户窗体的目的是通过允许用户从三个下拉框(cboSelectCategory、cboSelectStructure、cboSelectSX)中指定标准来简化数据库中的搜索。组合框 cboSelectCategory 容纳了我的标准范围的头部,即 CriteriaCategory(参见图 1)。另外两个,cboSelectStructure 和 cboSelectSX 是从两个单独的下拉列表中填充的,数据库中的每条信息都具有这两者(在我的数据库中,每一行都代表一个文档,我有三张文档 - 事件文档、已取消文档和待处理文档文件)。所有三个 cbo 都应该使用同一个文本框 (txtSearch) 来输入搜索关键字。而且,如果未从 cbo 中选择任何内容,则文本框输入文本应在整个数据库中用作搜索字符串,甚至部分匹配数据(无论数据是否以搜索字符串符号开头或结尾)。

这是我的代码到目前为止的样子。我添加了评论和图片链接来说明我的情况。

Overview of the criteria range called CriteriaCategory

范围 CriteriaCategory 包括列 BN 到 BU 的标题(文档编号、英文名称,包括结构)。它们下方的单元格(第 8 行)用于输入搜索字符串,具体取决于我要搜索的数据类型。例如,如果我正在查找文档编号,我将在 DOC NUMBER 下方的单元格中键入搜索字符串,依此类推。这些标题列在下图用户窗体中我的 cboSelectCategory 组合框中。

UserForm appearance with naming conventions

我试图让 Excel 根据我在 cboSelectCategory 中选择的内容,将我在关键字文本框中输入的任何内容放入工作表的正确单元格中,然后运行高级过滤器。此外,如果用户将三个 cbo 留空并返回每个匹配项,我需要让 Excel 搜索整个数据库,无论在工作表的哪个位置(我有三个)找到它,也不管它是否在开头单元格文本或末尾。

我一点也不知道如何处理这种情况。任何想法都会受到赞赏,代码片段也是如此。我的看起来像这样:

   Private Sub cmdSearch_Click()

        If Me.cboSelectCategory.Value = "" Or Me.cboSelectStructure.Value = "" Or Me.cboSelectSX.Value = "" Then
            Me.txtSearch.Value = Sheet6.Cells("BS8").Value

            AdvancedFilterCategory

        Else
            Me.cboSelectCategory.Value = Range("CriteriaCategoryFirstRow").Find(what:=Me.cboSelectCategory.Value, _
            LookIn:=xlValues)
            Me.txtSearch.Value = Range("CriteriaCategoryFirstRow").Offset(1, 0).Value

            AdvancedFilterCategory

        End If

    End Sub

我使用范围 CriteriaCategoryFirstRow 的想法(名称是一个提示)是让 Excel 搜索 CriteriaCategory 范围的第一行以查找 cboSelectCategory 值的匹配项,然后向下一个单元格,输入关键字文本框(txtSearch)中的值并执行高级过滤器。不幸的是,这不起作用,我认为我的想法可能是错误的。

最佳答案

不确定我是否完全理解您的问题本身;但是,如果您尝试从数据库返回记录,我建议您根据输入的表单值动态构建 SQL 字符串。

这是一些连接到 Access 数据库的示例代码,并根据正在填写的 Excel 单元格选择一些数据:

Const adCmdText = &H1
Public Sub Example()

Dim DbConnection               As Object
Dim AccessRecordSet            As Object

Set DbConnection = CreateObject("ADODB.Connection")
Set AccessRecordSet = CreateObject("ADODB.Recordset")

Set DbConnection = New ADODB.Connection

'Lookup your relevant Connection String Online
'www.connectionstrings.com :)
With DbConnection
    .Provider = "Microsoft.ACE.OLEDB.12.0"
    .ConnectionString = "Data Source='C:\Users\SampleUserName\Desktop\MYDATABASE.accdb'; Persist Security Info=False;"
    .Open
End With

'To Customize your SQL I'd do something like...
'I'm assuming all ANDs; hopefully this is illustrative enough to communicate the general idea
SqlWhere = "Where "


If Range("A1").Value <> "" Then
    SqlWhere = SqlWhere & "[MyTableName].[MyFieldName] = " & Range("A1").Value & " AND " 'Add apostrophes on either side of the double quotes if the variable is TEXT
End If

If Range("B1").Value <> "" Then
    SqlWhere = SqlWhere & "[MyTableName].[MyOtherField] = " & Range("B1").Value & " AND "
End If

StrSql = "SELECT * FROM [MyTableName] "

'Remove the last AND applicable
If SqlWhere = "Where " Then
    SqlWhere = ""
Else
    SqlWhere = Left(SqlWhere, Len(SqlWhere) - 4)
End If

StrSql = StrSql & SqlWhere

AccessRecordSet.Open StrSql, DbConnection, adOpenStatic, adLockOptimistic, adCmdText

'This will paste the recordset to range you specify below
Range("A2").CopyFromRecordset AccessRecordSet

MsgBox "There are " & AccessRecordSet.RecordCount & " record(s)!"

End Sub

希望这能说明如何构建动态 SQL 字符串。您可以使用它来支持您的查询并返回您所追求的相关结果。如果您已经在 Excel 中加载了数据,您甚至可以在 Excel 中执行 SQL 查询,只需查找相关的连接字符串。

希望这会有所帮助

==瑞恩

关于vba - 使用组合框和带有 Excel 2003 VBA 的文本框的多个高级过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29904672/

相关文章:

excel - 使用 VBA 对第二个工作簿的宏进行密码保护

c# - 在 DataGridView 中显示 bool 和 Enum 列的组合框

excel - 获取组合框的选定值

java - 如何在类外部使用组合框变量或在组合框方法内部使用变量

vba - 构建 Word 字段

javascript - 如何在存储过程中使用表值作为参数?

.net - 如何使用特定文件启动 Excel 加载项调试器?

excel - VBA TypeText Word Wrapping 内联与前一行的缩进

mysql - 使用vba从mysql更新excel文件数据

excel - Excel 2016 中的 Workbook_Open() 未触发