2016-12-16 8 views
0

はfollwingデータベース構造を仮定しますExcelデータベースにマルチ基準検索は、複数の結果を返す

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 = 3GId = 2ためCId = 2GId = 3ための検索文字列
  • ない一部である検索文字列
  • ない一部でありますすべてIId = (1, 2, 4)は検索文字列の一部であり、CId = 1
  • ​​58126321 0 IId = 1およびCId = 3は検索文字列の一部です。

重要な点:GIdはグループIDです。各グループについて、いくつかの成分ID(IId)と1つを持つことができます。条件ID(CId)とエフェクト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 | 

だから私の質問をNO:どのように私はこのクエリに近づくshoudl?すべてGIdsをループし、すべてIIdsがこのGIdの一部であるかどうかをチェックするVBA関数を記述するか、またはエリア式を扱うソリューションがありますか?

+0

アクセスのSQLクエリがこれよりExcelの方がよいと思われます。あなたはおそらくvbaでより良い運を持っています。 –

+0

ええ、私はSQLの行で何かを考えていました。ただし、AccessはExcelユーザーが使用する必要があり、Accessバックエンドに依存することはできないため、オプションはありません。とにかくExcelでSQLをどのように使用することができますか? – thothal

答えて

0

このソリューションでは、AutoFilterを使用して結果の範囲を選択します。結果の範囲を強調表示したり、別の範囲に抽出することができます。

Sub Data_Extract_1() 
Dim aFieldCriteria As Variant 
aFieldCriteria = Array("IId\1,2,4", "CId\1,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 
関連する問題