假定follwing数据库结构:
GId IId CId EId
==================
1 1 1 1
1 2 1 1
1 3 1 1
2 2 2 2
3 1 1 1
3 2 1 1
3 4 1 1
4 1 3 2
现在,我想使用(如果可能的话)工作表函数来实现对数据库的查询:
**Search Criteria**
IIds: 1, 2, 4
CId: 1, 3
现在,我想检查表以查看是否有与此标准匹配的GId
。在这个意义上匹配,意味着在搜索字符串中所有IIds/CIds
发生的GId
。在此示例中,GId = 3, 4
是这种情况:
- 对于
GId = 1
,IId = 3
是不是搜索字符串的一部分 - 对于
GId = 2
,CId = 2
是不是搜索字符串的一部分 - 对于
GId = 3
,所有IId = (1, 2, 4)
都是搜索字符串的一部分以及CId = 1
- 对于
GId = 4
IId = 1
和CId = 3
是搜索字符串的一部分。
对于重要的是:GId
是分组ID。对于每个组,我可以具有多个成分ID(IId
)和一个条件ID(CId
)和 One 效果ID(EId
)。如果有帮助,我也可以考虑将桌子分成两个表:
GId IId | GId CId EId
============+=================
1 1 | 1 1 1
1 2 | 2 2 2
1 3 | 3 1 1
2 2 | 4 3 2
3 1 |
3 2 |
3 4 |
4 1 |
所以没有我的问题:我如何处理此查询?我应该写一个VBA函数,该功能通过所有GIds
循环,并检查所有相关的IIds
是此GId
的一部分,还是有解决区域公式的解决方案?
此解决方案使用AutoFilter
选择结果范围。它可以突出显示所得范围或将其提取到另一个范围。
Sub Data_Extract_1()
Dim aFieldCriteria As Variant
aFieldCriteria = Array("IId1,2,4", "CId1,3") 'change as required
Dim rDta As Range, rOutput As Range
Dim rArea As Range, rCll As Range, vItm As Variant
With ThisWorkbook.Sheets("DATA.2") 'change as required
If Not (.AutoFilter Is Nothing) Then .Cells(1).AutoFilter
Set rDta = .Range("B6").CurrentRegion 'change as required
End With
With rDta
For Each vItm In aFieldCriteria
vItm = Split(vItm, "")
vItm(0) = WorksheetFunction.Match(vItm(0), .Rows(1), 0)
.AutoFilter Field:=vItm(0), Criteria1:=Split(vItm(1), ","), Operator:=xlFilterValues
Next
Rem Higlights Results
.Offset(1).Resize(-1 + .Rows.Count).SpecialCells(xlCellTypeVisible).Interior.Color = RGB(224, 232, 248)
Rem Extracts Results
Set rOutput = .SpecialCells(xlCellTypeVisible)
Set rCll = .Offset(0, 3 + .Columns.Count) 'change as required
.AutoFilter
End With
For Each rArea In rOutput.Areas
With rArea
rCll.Resize(.Rows.Count, .Columns.Count).Value = rArea.Value2
Set rCll = rCll.Offset(.Rows.Count).Resize(1, 1)
End With: Next
End Sub