我正在尝试找出最有效/最佳的方法来过滤我拥有的数据。数据见:
我的目标是使用下拉框来确定将在特定工作表上填充哪些数据。基本上我把它缩小到两种方式。两种方式都必须使用VBA。首先将使用excel的自动过滤功能。它会根据用户通过下拉框选择的条件过滤某些列,然后代码会将过滤后的表复制到另一个工作表。第二种方法是使用带有for循环的VLOOKUP来查看并获取数据。
哪个更优,为什么?同样,如果有一种方法我没有描述会更好,请告诉我。
答案 0 :(得分:0)
找到,找到你的答案,
FIND是excel最有效的匹配方式,我不知道为什么,但你应该尝试5种可能的方法并检查哪种方式更快。</ p>
我认为,从最慢到最快将是:
我相信WorkheetFunction不会在与VBA相同的线程中执行,但是在Worksheet和Range的一个共同线程中,某种方式会有更快的方法。
答案 1 :(得分:0)
我想知道你是否会以更好的方式看待这项任务。目前,您似乎正在谈论您希望运行查询的员工详细信息数据库,然后将结果输出到Excel。显然,这更适合真正的数据库应用程序,但您可以使用工作表作为数据存储,使用UserForm作为查询接口和VBA来管理数据处理,从而在Excel中模拟该任务。您的问题似乎只是想以有效的方式自动化一些Excel键击,而最好问一下VBA如何创建这个迷你数据库应用程序。
特别是,为了获得真正的效率,您确实需要避免对-bash: nvm: command not found
值的多次询问,例如Worksheet
,VLOOKUP
,FIND
等。阅读价值非常耗时。通常最好只将MATCH
数据库值读入数组,然后查询该数组。幸运的是,这些任务在VBA中非常直接。
所以......首先,我要为您要使用的每个过滤器创建一个Worksheet
UserForm
。在下面的示例中,我刚刚完成了三个,但如果您愿意,可以执行所有列。确保将ListBoxes
属性设置为MultiSelect
:
在1-fmMultiSelectMulti
后面的代码中,添加以下内容(如果您愿意,可以更改列表框的名称,但我使用了UserForm
,lboxCountry
和{{1 }}):
lboxState
现在只需将数据读取和数据过滤程序添加到lboxDept
中,如下所示:
Public Property Get Lbox(index As Long) As MSForms.ListBox
Select Case index
Case COUNTRY_ID: Set Lbox = lboxCountry
Case STATE_ID: Set Lbox = lboxState
Case DEPT_ID: Set Lbox = lboxDept
End Select
End Property
Private Sub btnProcess_Click()
Call OutputFilteredResults
End Sub
您可以更进一步,例如通过利用LINQ语法来简化查询代码,但是这个示例应该让您了解如何将VBA视为更多应用程序解决方案。