在我发布问题之前,我仔细搜索了主题,实际上找不到我的案例。
我使用Excel 2003创建了一个大型数据库,以满足当前作业的需要。我已经建立了一个高级过滤器,其中包含八个可能的标准选项。现在我必须通过设置UserForm来扩展界面和功能。不幸的是,我觉得如果我不完成这件事,我的工作就会花费我的成本。
我的UserForm的目的是通过允许用户从三个dropbox(cboSelectCategory,cboSelectStructure,cboSelectSX)指定标准来简化数据库中的搜索。组合框cboSelectCategory适应我的标准范围的头部,即CriteriaCategory(见图1)。另外两个,cboSelectStructure和cboSelectSX是从两个单独的下拉列表中填充的,数据库中的每一条信息都有(在我的数据库中,每一行代表一个文档,我有三张文档 - 活动文档,取消文档和待定文档)。所有三个cbo应该使用同一个文本框(txtSearch)来输入搜索关键字。而且,如果没有从cbo中选择任何内容,则文本框输入文本应该作为整个数据库中的搜索字符串,甚至可以部分匹配数据(如果数据以搜索字符串符号开头或结尾,则无任何内容)。
这是我的代码到目前为止的样子。我添加了评论和图片链接来说明我的情况。
范围CriteriaCategory包括BN到BU列的标题(DOC NUMBER,NAME IN ENGLISH,包括STRUCTURE)。它们下面的单元格(第8行)用于输入搜索字符串,具体取决于我要搜索的数据类型。例如,如果我正在查找文档编号,我将在DOC NUMBER下方的单元格中键入搜索字符串,依此类推。这些标题列在我在下图中UserForm的cboSelectCategory组合框中。
我正在尝试将Excel放入工作表中正确单元格中的关键字文本框中输入的内容,具体取决于我在cboSelectCategory中选择的内容,然后运行高级过滤器。此外,我需要让Excel搜索整个数据库,如果三个cbo被用户留空并返回每个匹配,无论工作表在哪里(我有三个)都找到它,无论它是否在开头单元格或最后。
我对如何处理这种情况没有丝毫的线索。任何想法都受到赞赏,代码片段也是如此。我看起来像这样:
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)并执行高级过滤器。不幸的是,这不起作用,我认为我的想法可能是错的。
答案 0 :(得分:0)
不确定我是否完全理解您的问题;但是,如果您尝试从数据库返回记录,我建议根据输入的表单值动态构建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中执行SQL查询,只需查找相关的连接字符串。
希望这会有所帮助
==瑞恩