Excel数据库中的多标准搜索返回多个结果



假定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 = 1IId = 3不是搜索字符串的一部分
  • 对于GId = 2CId = 2不是搜索字符串的一部分
  • 对于GId = 3,所有IId = (1, 2, 4)都是搜索字符串的一部分以及CId = 1
  • 对于GId = 4 IId = 1CId = 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

最新更新