在工作中,我被要求创建Excel文档来过滤数据。我在使用某些过滤器时遇到了一些困难,如下所述。
基本上我有一个文件列出所有可用的武器在某个游戏。每种武器都是在游戏的某个点上获得的,例如武器1可以在第一幕的任务1中获得。我需要过滤这些数据,以允许搜索所需的所有武器,直至并包括此特定任务或特定行为。因此,如果我选择例如任务3,我需要显示任务1、2和3的所有武器。同样的机制也适用于行为。我能够为涉及if
语句的行为创造可怕的解决方案,但我们在游戏中有大约30个任务,所以为任务做同样的事情会非常重复。
为了更好地解释我的问题,我用示例数据创建了一个小的Excel文档,它反映了我实现的1对1的真实文档"机制"。
拆开来看,打开后会看到三张表格:
Filter—这是显示过滤结果的字段。
完整列表 -这是我们想要过滤的整个武器列表。
AM -这是游戏的行为和任务列表。
我使用这个宏来过滤行为(它在你点击过滤器行为按钮后开始):
Sub FilterActs()
Sheets("Filter").Select
Range("B10").Select
Range(Selection, Selection.End(xlToRight)).Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Clear
Sheets("Full list").Range("A1:H175").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:= _
Sheets("Full list").Range("P1:P4"), CopyToRange:=Sheets("Filter").Range("B10"), Unique:=True
Columns.AutoFit
Range("B10").Select
End Sub
由于IF语句,您可以在完整列表表中找到,P1:P4,因此它适用于行为。然而,我不知道如何在不使用gazilion IF语句的情况下自动执行任务。
我已经使用您的示例工作簿创建了一个解决方案。请测试一下,看看它是否达到了您的目的:http://excelhero.com/samples/roff_excelhero.xlsm
请注意,这个解决方案使用了不同的标准范围。
解决方案的相关代码在这里:
Public Sub Filter()
Dim rData As Range, rCrit As Range, rOut As Range
With Sheets("Full list")
Set rData = .[a1].CurrentRegion
Set rCrit = .[s1:t2]
End With
Set rOut = [b10:d10]
rOut(1).Select
rData.AdvancedFilter xlFilterCopy, rCrit, rOut
End Sub