筛选一个包含 MySQL 的列表框
Filter a ListBox that's filled with MySQL
我看到很多人使用 TextBox 或 ComboBox 过滤他们的 Userform 的 ListBox。
我希望它是我的,但与他们不同的是,我的列表框是使用 MySQL 记录集填充的,而他们使用的是 Excel 电子表格
这是我的实际代码,其中 SelectProduct 是我的用户窗体,ListRef 是我的列表框。
Requete = "SELECT Reference,Nom,Marque,PrixVente FROM Produits_Beta"
rs.Open Requete, oConnect
SelectProduct.ListeRef.Clear
SelectProduct.ListeRef.Column = rs.GetRows
列表框很快将显示 700 多个结果,我需要一种方法让我的用户过滤它们以找到他们需要的内容。
如果我使用电子表格获取列表框值,我的过滤器代码将如下所示。
(代码最初来自 Ralph)
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 table 粘贴到隐藏的电子表格中,而且,同样,我不知道该怎么做。
Worksheet.Visible属性有3个选项,如下:
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.
如果您要创建一个隐藏的 sheet 来接收此数据,您可以这样尝试:
假设您首先在工作簿中创建了一个名为 ws 的工作sheet (vba)。为了从此记录集中获取数据,您必须遍历其记录并将每个记录的值复制到一行:
'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
然后,如果您不想让用户访问您的 sheet,只需执行以下操作:
ws.visible = xlSheetVeryHidden
如果您打算刷新查询并再次获取数据,则必须事先清除您的工作sheet。
此外,最好在 SQL 查询中对数据进行排序,以便列表框按字母顺序填充,如果它适合您的需要。
过滤 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%'
匹配 Pomme
、Pomme de terre
和 Pomade
。
编辑 可以在LIKE中使用%pom%
。然而,事情是这样的:如果您的搜索词首先出现 %
,则 DBMS 无法使用索引查找来查找您的数据,因此搜索速度会变慢。要搜索一千行,这无关紧要。有数百万行,这很重要。
许多此类软件的开发人员大量使用查询来过滤他们的数据。 DBMS 就是为此而构建的。 DBMS 的全部意义在于允许软件有效地处理大量数据。
专业提示:请始终在查询中使用 ORDER BY
。如果您不这样做,数据库服务器可以自由地以目前认为最有效的任何顺序显示结果。这就是所谓的不稳定排序,它会让用户抓狂。
我看到很多人使用 TextBox 或 ComboBox 过滤他们的 Userform 的 ListBox。
我希望它是我的,但与他们不同的是,我的列表框是使用 MySQL 记录集填充的,而他们使用的是 Excel 电子表格
这是我的实际代码,其中 SelectProduct 是我的用户窗体,ListRef 是我的列表框。
Requete = "SELECT Reference,Nom,Marque,PrixVente FROM Produits_Beta"
rs.Open Requete, oConnect
SelectProduct.ListeRef.Clear
SelectProduct.ListeRef.Column = rs.GetRows
列表框很快将显示 700 多个结果,我需要一种方法让我的用户过滤它们以找到他们需要的内容。
如果我使用电子表格获取列表框值,我的过滤器代码将如下所示。 (代码最初来自 Ralph)
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 table 粘贴到隐藏的电子表格中,而且,同样,我不知道该怎么做。
Worksheet.Visible属性有3个选项,如下:
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.
如果您要创建一个隐藏的 sheet 来接收此数据,您可以这样尝试: 假设您首先在工作簿中创建了一个名为 ws 的工作sheet (vba)。为了从此记录集中获取数据,您必须遍历其记录并将每个记录的值复制到一行:
'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
然后,如果您不想让用户访问您的 sheet,只需执行以下操作:
ws.visible = xlSheetVeryHidden
如果您打算刷新查询并再次获取数据,则必须事先清除您的工作sheet。 此外,最好在 SQL 查询中对数据进行排序,以便列表框按字母顺序填充,如果它适合您的需要。
过滤 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%'
匹配 Pomme
、Pomme de terre
和 Pomade
。
编辑 可以在LIKE中使用%pom%
。然而,事情是这样的:如果您的搜索词首先出现 %
,则 DBMS 无法使用索引查找来查找您的数据,因此搜索速度会变慢。要搜索一千行,这无关紧要。有数百万行,这很重要。
许多此类软件的开发人员大量使用查询来过滤他们的数据。 DBMS 就是为此而构建的。 DBMS 的全部意义在于允许软件有效地处理大量数据。
专业提示:请始终在查询中使用 ORDER BY
。如果您不这样做,数据库服务器可以自由地以目前认为最有效的任何顺序显示结果。这就是所谓的不稳定排序,它会让用户抓狂。