2016-08-07 8 views
1

Excelで1つのIDに関連付けられた値を取得するという単純な解決策があるのではないかと不思議です。1つのIDに関連付けられた複数の値をExcelで取得する

私はリスト内の複数の値を検索するためにINDEXソリューションを検討しましたが、それは実際には動的ではなく、必要な水平方向ではなく垂直方向に結果をもたらします。 (以下、所望の結果を参照)

iを用いたサンプル関数であった。この

「= IF(ISERROR(SMALL(IF(IF(ISERROR(SEARCH($ A $ 9 $ A $ 1:$ A $ 7)) ($ A $ 1:$ C $ 7))、 ""、INDEX($ A $ 1:$ C $ 7、SMALL(IF(IF ROW($ C $ 1:$ C $ 7))、3))、ISERROR(SEARCH($ A $ 9、$ A $ 1:$ A $ 7)、FALSE、TRUE) "

*この例の参照は無視してください。

私は現在作業中の2枚のシートを持っており、基本的に「Numbers Sheet」から1つのIDに関連付けられた値を取得し、「マスターシート」に保存する必要があります。数式では、IDに関連付けられた後続の番号を見つけて、次に示すように後続の列に配置する必要があります。

*注:それは(単なる一例として3を示す)1-100の範囲であることができるので、任意のユーザーIDがチケットの任意の数を要求することができます

は、ここではエクセルマスターから任意の指導を感謝しています。私が考えることができる唯一の他の解決策は、各値を取得し、配列に格納し、配列から値を取得するために、VBAコードを使用することです。あなたの考えを聞かせてください!

ありがとうございます!

マスターシート:

enter image description here

番号シート:

enter image description here

結果が希望:

enter image description here

答えて

2

セルC2に次の式を入れて、[1]あなたのMaster Sheet

{=IFERROR(INDEX(Numbers!$A:$C,SMALL(IF(Numbers!$A$1:$A$1000=$A2,ROW(Numbers!$A$1:$A$1000)),INT((COLUMN(A:A)-1)/2)+1),MOD(COLUMN(A:A)-1,2)+2),"")} 

の[1]私はあなたが、残念ながら行番号を示していないので、それは行2であると仮定しています。

数式は配列式です。中かっこなしでセルに入力し、[Ctrl] + [Shift] + [Enter]を押して確定します。中かっこが自動的に表示されます。

次に、必要に応じて数式を右下に記入します。

+0

これはうまく動作します!これはありがとう!それは本当に簡単です! –

0

VBAでもおそらくありますこのためのルートを作って.Findと.FindNextを使って私が行く方法です。

添付されているのは一般的なFindAll関数なので、問題のIDを含むすべてのセルを探して、一度に1つのセルを処理できます。

Function FindAll(What, _ 
    Optional SearchWhat As Variant, _ 
    Optional LookIn, _ 
    Optional LookAt, _ 
    Optional SearchOrder, _ 
    Optional SearchDirection As XlSearchDirection = xlNext, _ 
    Optional MatchCase As Boolean = False, _ 
    Optional MatchByte, _ 
    Optional SearchFormat) As Range 

    'LookIn can be xlValues or xlFormulas, _ 
    LookAt can be xlWhole or xlPart, _ 
    SearchOrder can be xlByRows or xlByColumns, _ 
    SearchDirection can be xlNext, xlPrevious, _ 
    MatchCase, MatchByte, and SearchFormat can be True or False. _ 
    Before using SearchFormat = True, specify the appropriate settings for the Application.FindFormat _ 
    object; e.g. Application.FindFormat.NumberFormat = "General;-General;""-""" 

    Dim SrcRange As Range 
    If IsMissing(SearchWhat) Then 
     Set SrcRange = ActiveSheet.UsedRange 
    ElseIf TypeOf SearchWhat Is Range Then 
     Set SrcRange = IIf(SearchWhat.Cells.Count = 1, SearchWhat.Parent.UsedRange, SearchWhat) 
    ElseIf TypeOf SearchWhat Is Worksheet Then 
     Set SrcRange = SearchWhat.UsedRange 
    Else: Set SrcRange = ActiveSheet.UsedRange 
    End If 
    If SrcRange Is Nothing Then Exit Function 

    'get the first matching cell in the range first 
    With SrcRange.Areas(SrcRange.Areas.Count) 
     Dim FirstCell As Range: Set FirstCell = .Cells(.Cells.Count) 
    End With 

    Dim CurrRange As Range: Set CurrRange = SrcRange.Find(What:=What, After:=FirstCell, LookIn:=LookIn, LookAt:=LookAt, _ 
     SearchDirection:=SearchDirection, MatchCase:=MatchCase, MatchByte:=MatchByte, SearchFormat:=SearchFormat) 

    If Not CurrRange Is Nothing Then 
     Set FindAll = CurrRange 
     Do 
      Set CurrRange = SrcRange.Find(What:=What, After:=CurrRange, LookIn:=LookIn, LookAt:=LookAt, _ 
      SearchDirection:=SearchDirection, MatchCase:=MatchCase, MatchByte:=MatchByte, SearchFormat:=SearchFormat) 
      If CurrRange Is Nothing Then Exit Do 
      If Application.Intersect(FindAll, CurrRange) Is Nothing Then 
       Set FindAll = Application.Union(FindAll, CurrRange) 
      Else: Exit Do 
      End If 
     Loop 
    End If 
End Function 
+0

おかげ@Flephalを試すことができ、私はそれを試してみるとバック結果になります。 –

1

あなたはこのコード

Sub main()   
    Dim IdRng As Range, cell As Range, filtCell As Range 
    Dim i As Long 

    With Worksheets("Master Sheet") 
     Set IdRng = .Range("A1", .Cells(.Rows.Count, 1).End(xlUp)).SpecialCells(XlCellType.xlCellTypeConstants) 
    End With 

    With Worksheets("Numbers") 
     With .Cells(1, 1).CurrentRegion 
      For Each cell In IdRng 
       .AutoFilter field:=1, Criteria1:=cell.value '<--| filter it on current department value 
       If Application.WorksheetFunction.Subtotal(103, .Cells.Resize(, 1)) > 1 Then 
        For Each filtCell In .Offset(1, 1).Resize(.Rows.Count - 1, 1).SpecialCells(XlCellType.xlCellTypeVisible) 
         cell.End(xlToRight).Offset(, 1).Resize(, 2).value = filtCell.Resize(, 2).value 
        Next filtCell 
       End If 
      Next cell 
     End With 
     .AutoFilterMode = False 
    End With 

    With Worksheets("Master Sheet").Cells(1, 1).CurrentRegion.Rows(1) 
     .Insert 
     With .Offset(-1) 
      .Font.Bold = True 
      .Resize(, 2) = Array("ID", "Name") 
      For i = 1 To .Columns.Count - 2 Step 2 
       .Offset(, 1 + i).Resize(, 2) = Array("Description " & (i + 1)/2, "Number " & (i + 1)/2) 
      Next i 
     End With 
    End With 

End Sub 
+0

これを考える時間をとってくれてありがとうが、私は今答えとしてマークしている上記の単純な方法があります。 –

+0

あなたは大歓迎です。すべての方法には欠点があります:VBAの欠点は、コードを書いてどこかから呼び出す必要があることです(ボタン、ショートカット、Alt-F8 ...)。数式のアプローチの欠点は、数式でいっぱいになるほどセルが大きくなればなるほど、特に配列式ではファイルが大きく(バイト)大きくなります。私の貢献を感謝しなければならない、あなたはそれをupvoteしたいことがあります| – user3598756

+0

すでに2日前に:) –

関連する問題