在工作中,我被要求创建用于过滤数据的Excel文档。我遇到了某些过滤器的一些困难,如下所述。
基本上我有一份文件列出了某个游戏中所有可用的武器。每种武器都可以在游戏中的某个时刻获得,例如武器1可以在行动1的任务1中获得。我需要过滤这些数据以便搜索所需的所有武器,包括这个特定的任务或某些法案。所以如果我选择例如任务3 我需要为任务1 2和3 显示所有武器。行为的机制相同。我能够为涉及if
语句的行为创建可怕的解决方法,但我们在游戏中有大约30个任务,所以对任务执行相同操作会非常重复。
为了更好地解释我的问题,我创建了一个small Excel document with example data,它反映了我实施1比1的真实文档“机制”。
要打破它,打开它后你会看到三张纸:
过滤器 - 这是显示过滤结果的那个。
完整列表 - 这是我们想要过滤的整个武器列表。
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语句的情况下自动执行此操作。
答案 0 :(得分:2)
我使用您的示例工作簿创建了一个解决方案。请测试一下,看看它是否能达到您的目的: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