在发布我的问题之前,我仔细搜索了这些主题,但实际上找不到适合我的案例的匹配项。
我使用 Excel 2003 为当前工作的需要创建了一个大型数据库。我已经建立了一个具有八个可能标准选项的高级筛选器。现在我必须通过设置一个 UserForm 来扩展界面和功能。不幸的是,我觉得如果我不完成这件事,我可能会失去工作。
我的用户窗体的目的是通过允许用户从三个下拉框(cboSelectCategory、cboSelectStructure、cboSelectSX)中指定标准来简化数据库中的搜索。组合框 cboSelectCategory 容纳了我的标准范围的头部,即 CriteriaCategory(参见图 1)。另外两个,cboSelectStructure 和 cboSelectSX 是从两个单独的下拉列表中填充的,数据库中的每条信息都具有这两者(在我的数据库中,每一行都代表一个文档,我有三张文档 - 事件文档、已取消文档和待处理文档文件)。所有三个 cbo 都应该使用同一个文本框 (txtSearch) 来输入搜索关键字。而且,如果未从 cbo 中选择任何内容,则文本框输入文本应在整个数据库中用作搜索字符串,甚至部分匹配数据(无论数据是否以搜索字符串符号开头或结尾)。
这是我的代码到目前为止的样子。我添加了评论和图片链接来说明我的情况。
范围 CriteriaCategory 包括列 BN 到 BU 的标题(文档编号、英文名称,包括结构)。它们下方的单元格(第 8 行)用于输入搜索字符串,具体取决于我要搜索的数据类型。例如,如果我正在查找文档编号,我将在 DOC NUMBER 下方的单元格中键入搜索字符串,依此类推。这些标题列在下图用户窗体中我的 cboSelectCategory 组合框中。
我试图让 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/