VBA: 使用文本框填充 Word 用户表单上的列表框 - 查询 excel 数据库
VBA: Use Text Box to Populate List Box on Word User Form - Query excel data base
我想根据在同一表单的文本框中输入的数据填充 Word 用户表单上的列表框。理想情况下,这将实时发生(使用我认为的更改事件),在文本框中输入的每个字符都会过滤出现在列表框中的项目。
数据源是使用 DAO 访问的 Excel "data base"。下面的代码有效,但它将整个数据库输入列表框(基于此 - Link)。
Private Sub UserForm_Initialize()
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim NoOfRecords As Long
'Open the database (Excel File)
Set db = OpenDatabase("C:\Users\T400\Documents\UserFormListTest.xlsx" _
, False, False, "Excel 8.0")
'Retrieve the recordset > Excel Range = "ListBoxData"
Set rs = db.OpenRecordset("SELECT * FROM ListBoxData")
' Determine the number of retrieved records
With rs
.MoveLast
NoOfRecords = .RecordCount
.MoveFirst
End With
' Set the number of Columns = number of Fields in recordset
ListBox1.ColumnCount = rs.Fields.Count
ListBox1.Column = rs.GetRows(NoOfRecords)
rs.Close
db.Close
Set rs = Nothing
Set db = Nothing
End Sub
如何过滤数据,以便列表框只根据文本框填充?我希望有一个简单的解决方案,比如修改代码的 SELECT *
查询部分。
这可能吗?或者有更好的方法吗?
正如我在问题评论中提到的,MS Excel 使用 Jet 数据库引擎。因此,您必须使用与该数据库引擎相对应的通配符。
因此,如果您想开发自定义 "search/find" 功能,您可以使用以下选项在表单上添加 Combobox 控件:All
、StartsWith
、Contains
和EndsWith
。示例代码应如下所示(将控件名称替换为您的名称):
Dim sName As String
Dim sSearchType As String
Dim sQry As String
sName = TextBox1.Text
sSearchType = ComboBox1.Value
sQry = "SELECT * FROM ListBoxData "
Select Case sSearchType
Case "All"
'do nothing; return all records
Case "StartsWith"
sQry = sQry & "WHERE Name Like '" & sName & "*'"
Case "Contains"
sQry = sQry & "WHERE Name Like '*" & sName & "*'"
Case "EndWith"
sQry = sQry & "WHERE Name Like '*" & sName & "'"
End Select
Set rs = db.OpenRecordset(sQry)
'other stuff
有关通配符的更多信息,您可以在此处找到:
Access wildcard character reference
Office: Wildcard Characters used in String Comparisons
我想根据在同一表单的文本框中输入的数据填充 Word 用户表单上的列表框。理想情况下,这将实时发生(使用我认为的更改事件),在文本框中输入的每个字符都会过滤出现在列表框中的项目。
数据源是使用 DAO 访问的 Excel "data base"。下面的代码有效,但它将整个数据库输入列表框(基于此 - Link)。
Private Sub UserForm_Initialize()
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim NoOfRecords As Long
'Open the database (Excel File)
Set db = OpenDatabase("C:\Users\T400\Documents\UserFormListTest.xlsx" _
, False, False, "Excel 8.0")
'Retrieve the recordset > Excel Range = "ListBoxData"
Set rs = db.OpenRecordset("SELECT * FROM ListBoxData")
' Determine the number of retrieved records
With rs
.MoveLast
NoOfRecords = .RecordCount
.MoveFirst
End With
' Set the number of Columns = number of Fields in recordset
ListBox1.ColumnCount = rs.Fields.Count
ListBox1.Column = rs.GetRows(NoOfRecords)
rs.Close
db.Close
Set rs = Nothing
Set db = Nothing
End Sub
如何过滤数据,以便列表框只根据文本框填充?我希望有一个简单的解决方案,比如修改代码的 SELECT *
查询部分。
这可能吗?或者有更好的方法吗?
正如我在问题评论中提到的,MS Excel 使用 Jet 数据库引擎。因此,您必须使用与该数据库引擎相对应的通配符。
因此,如果您想开发自定义 "search/find" 功能,您可以使用以下选项在表单上添加 Combobox 控件:All
、StartsWith
、Contains
和EndsWith
。示例代码应如下所示(将控件名称替换为您的名称):
Dim sName As String
Dim sSearchType As String
Dim sQry As String
sName = TextBox1.Text
sSearchType = ComboBox1.Value
sQry = "SELECT * FROM ListBoxData "
Select Case sSearchType
Case "All"
'do nothing; return all records
Case "StartsWith"
sQry = sQry & "WHERE Name Like '" & sName & "*'"
Case "Contains"
sQry = sQry & "WHERE Name Like '*" & sName & "*'"
Case "EndWith"
sQry = sQry & "WHERE Name Like '*" & sName & "'"
End Select
Set rs = db.OpenRecordset(sQry)
'other stuff
有关通配符的更多信息,您可以在此处找到:
Access wildcard character reference
Office: Wildcard Characters used in String Comparisons