过滤填充了 MySQL 的列表框



我看到很多人使用文本框或组合框过滤用户窗体的列表框。

我希望它做我的,但与他们不同的是,我的列表框是使用 MySQL 记录集填充的,而他们使用的是 Excel 电子表格

这是我的实际代码,其中SelectProduct是我的Userform,ListRef是我的Listbox。

Requete = "SELECT Reference,Nom,Marque,PrixVente FROM Produits_Beta"
rs.Open Requete, oConnect

SelectProduct.ListeRef.Clear
SelectProduct.ListeRef.Column = rs.GetRows

列表框很快将显示 700+ 结果,我需要一种方法让我的用户过滤它们以找到他们需要的内容。

如果我使用电子表格获取列表框值,我的筛选器代码将如下所示。 (代码最初来自拉尔夫(

Dim i As Long
Dim arrList As Variant
Me.ListeRef.Clear
If TheoricalSheet.Range("A" & TheoricalSheet.Rows.Count).End(xlUp).Row > 1 And Trim(Me.TXBoxFilter.Value) <> vbNullString Then
arrList = TheoricalSheet.Range("A1:A" & TheoricalSheet.Range("A" & TheoricalSheet.Rows.Count).End(xlUp).Row).Value2
For i = LBound(arrList) To UBound(arrList)
If InStr(1, arrList(i, 1), Trim(Me.TXBoxFilter.Value), vbTextCompare) Then
Me.ListeRef.AddItem arrList(i, 1)
End If
Next i
End If
If Me.ListeRef.ListCount = 1 Then Me.ListeRef.Selected(0) = True

我可以,但我需要一种方法将所有MySQL表粘贴到隐藏的电子表格中,而且,同样,我不知道该怎么做。

筛选 SQL 数据以进行显示的规范方法是在查询中使用WHERE子句。 当您有七、七百或七百万行时,这将起作用。

您可以尝试这样的事情:

SELECT Reference,Nom,Marque,PrixVente 
FROM Produits_Beta 
WHERE Produit LIKE CONCAT('filter value', '%')
ORDER BY Produit
LIMIT 100

如果您为filter value提供一个空字符串,您将获得前一百行;您的用户将很快看到过滤器是必要的。

如果没有筛选器值,则WHERE Produit LIKE '%'不筛选。使用Pom作为过滤器值,您将获得WHERE Produit LIKE 'Pom%'例如,匹配PommePomme de terrePomade

编辑您可以在 LIKE 中使用%pom%。但是,事情是这样的:如果您的搜索词%排在第一位,则DBMS无法使用索引查找来查找您的数据,因此搜索速度会变慢。有一千行要搜索,这无关紧要。对于数百万行,它很重要。

这种软件的许多开发人员大量使用查询来过滤他们的数据。DBMS 就是为此而构建的。DBMS的全部意义在于允许软件有效地处理大量数据。

专业提示:始终在查询中使用ORDER BY。如果不这样做,数据库服务器可以自由地以它目前认为最有效的任何顺序显示结果。这就是所谓的不稳定排序,它让用户发疯。

Worksheet.Visible 属性有三个选项,如下所示:

xlSheetVisible 'The usual visible worksheet.
xlSheetHidden 'Worksheet that is hidden but may be turned visible by the user.
xlSheetVeryHidden 'Worksheet that is hidden but may only be turned visible via VBA.

如果要创建一个隐藏工作表来接收此数据,则可以尝试这样做: 假设您首先在工作簿 (vba( 中创建了一个名为 ws 的工作表。为了从此记录集中获取数据,您必须遍历其记录并将每个记录的值复制到一行中:

'Header
With ws
.Cells(1,1) = "Reference"
.Cells(1,2) = "Nom"
.Cells(1,3) = "Marque"
.Cells(1,4) = "PrixVente"
End With
'Rows
Dim i as Long: i = 2
with Requete
If not (.EOF and .BOF) then
.movefirst
Do until .EOF                
ws.Cells(i,1) = .Fields("Reference")
ws.Cells(i,2) = .Fields("Nom")
ws.Cells(i,3) = .Fields("Marque")
ws.cells(i,4) = .Fields("PrixVente")
.MoveNext
i=i+1
Loop
End If
End With

然后,如果您不希望用户访问您的工作表,只需执行以下操作:

ws.visible = xlSheetVeryHidden

如果计划刷新查询并再次提取数据,则必须事先清除工作表。 此外,最好在 SQL 查询中对数据进行排序,以便列表框按字母顺序填充,如果它符合您的需求。

最新更新