在Excel 2003 VBA中使用combobox和文本框的多个高级filter

在我发布我的问题之前,我仔细search了这些话题,实际上找不到匹配我的案例。

我已经使用Excel 2003为当前作业的需求创build了一个大型数据库。我已经build立了一个包含八个可能的标准选项的高级filter。 现在我必须通过设置UserForm来扩展界面和function。 不幸的是,我觉得如果我不完成这个,可能会让我的工作耗费我的工作。

我的UserForm的目的是通过允许用户从三个保pipe箱(cboSelectCategory,cboSelectStructure,cboSelectSX)中指定一个标准来简化数据库中的search。 comboboxcboSelectCategory是适应我的标准范围的头是CriteriaCategory(见图1)。 另外两个,cboSelectStructure和cboSelectSX由两个单独的下拉列表填充,数据库中的每一条信息都有两个列表(在我的数据库中,每一行代表一个文档,而且我有三个文档 – 活动文档,取消文档和待处理文档)。 所有三个cbo应该使用同一个文本框(txtSearch)来inputsearch关键字/ s。 另外,如果没有从cbo中select任何内容,则文本框input文本应作为整个数据库匹配数据的searchstring,即使部分(如果数据以searchstring符号开始或结束)也是如此。

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

CriteriaCategory标准范围的概述

范围CriteriaCategory包括BN到BU(DOC编号,英文名称,包括STRUCTURE)的标题。 下面的单元格(第8行)用于根据我要search的数据typesinputsearchstring。 例如,如果我正在查找文档编号,我将在DOC NUMBER下面的单元格中inputsearchstring,以此类推。 这些标题列在下面的图片UserForm中的我的cboSelectCategorycombobox中。

用户窗体的外观与命名约定

我正在试图让Excel把我在工作表中正确的单元格中的关键字文本框中input的内容取决于我在cboSelectCategory中select的内容,然后运行高级filter。 此外,我需要让Excelsearch整个数据库,如果这三个cbo被用户留空,并返回每一个匹配,不pipe工作表(我有三个)在哪里find它,无论它是在开始单元格文本或最后。

我没有丝毫的线索来解决这个问题。 任何想法,赞赏,代码片断也。 我看起来像这样:

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(名称是一个提示)是为了使ExcelsearchCriteriaCategory范围的第一行来查找cboSelectCategory值的匹配,然后向下一个单元格,将关键字文本框(txtSearch)的值,并执行高级filter。 不幸的是,这不起作用,我认为我的想法可能是错的。

不知道我是否完全理解你的问题本身; 但是如果你想从数据库返回logging,我build议根据input的表单值dynamic构build一个SQLstring。

下面是一些示例代码连接到Access数据库,并select一些基于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 

希望这是如何构builddynamicSQLstring的说明。 您可以使用它来强化您的查询并返回您之后的相关结果。 如果您已经在那里加载数据,甚至可以在Excel中执行SQL查询,只需查找相关的连接string即可。

希望这有助于

==瑞安