• ベストアンサー

複数指定セル値と合致したセル値を返す

A,B,C列に添付の値が入力されておりセルE2の値とF2~F7の値が両方一致したものがA,B列にあればC列の値をG列に順々に入力していきたいのですが。 どなたか関数が解る方、欲をいえばVBAコードが解る方ご教授願います。

質問者が選んだベストアンサー

  • ベストアンサー
  • bunjii
  • ベストアンサー率43% (3589/8249)
回答No.6

回答No.5のコードを一部修正してください。 If Cells(i, 7) = "" Then Cells(i, 7) = Cells(j, 3) Else If InStr(Cells(i, 7), Cells(j, 3)) = 0 Then '重複併記防止のため追加する Cells(i, 7) = Cells(i, 7) & "," & Cells(j, 3) End If '追加されたIf文に対する締め括りのため追加する End If 'MsgBox i & " | " & Cells(i, 6) 'この行は処理過程のチェックようなので削除する

その他の回答 (7)

  • Chiquilin
  • ベストアンサー率30% (94/306)
回答No.8

バージョンどころかそもそも何のソフトウェアの質問かも書いて ないんだから 配慮する必要なんてないか。 Googleスプレッドシートなら =QUERY(SORT(FILTER(B$2:C,A$2:A=E$2,COUNTIF(F$2:F,B$2:B)>0),1,TRUE),"select Col2") これでおしまい。

kuma0220
質問者

お礼

ありがとうございます。

  • mt2015
  • ベストアンサー率49% (258/524)
回答No.7

関数でやってみました。 G列の名前の登場順はB列の日付が小さい順ですかね? I:J列を作業列として使用します。 I2セルに↓の式を入れてI13までコピー =COUNTIF(F$2:F$7,B2)*(E$2=A2)*B2+ROW()/10000 #条件に一致する行の日付を取り出します。また、同じ日付が複数回登場する可能性を考慮して行数/10000の小さな値を加算しています。 J1セルに↓を入れます。 =COUNTIF(I2:I13,"<1") #I列のデータの内値が1未満のデータ個数(=抜出条件に一致しないデータ個数) J2セルに↓の式を入れてJ13までコピーします。 =RANK(I2,I$2:I$13,1)-J$1 #条件に一致したデータの中で日付順に並べた場合の順位(1以上が対象) 最後にG2セルに↓の式を入れてG7までコピーします。 =IFERROR(OFFSET(C$1,MATCH(ROW()-1,J$2:J$13,0),0),"") #J列が1以上の値の行のC列の名前を表示しています。

kuma0220
質問者

お礼

ありがとうございます。

  • Chiquilin
  • ベストアンサー率30% (94/306)
回答No.5

見た目に古そうですが Excelだとしたらバージョンくらいは書き ましょう。バージョンによっては配列数式に行数制限があります。

kuma0220
質問者

お礼

ありがとうございます。

  • bunjii
  • ベストアンサー率43% (3589/8249)
回答No.4

回答No.3の追加です。 VBAのコードを提示します。 但し、E列とF列は予め入力されているものとします。 また、E2:E13はセル結合でE3:E13は値が入力できないものとします。 提示画像のA8とB8、A10とB10は同一値のためC8とC10の値を併記しました。 Sub check() Dim ri As Double, rs As Double, rn As Double rs = 2 rn = Range("A2").End(xlDown).Row For i = rs To rn If Cells(i, 6) = "" Then i = rn Else For j = rs To rn If Cells(j, 1) = Cells(rs, 5) And Cells(j, 2) = Cells(i, 6) Then If Cells(i, 7) = "" Then Cells(i, 7) = Cells(j, 3) Else Cells(i, 7) = Cells(i, 7) & "," & Cells(j, 3) End If MsgBox i & " | " & Cells(i, 6) End If Next j End If Next i End Sub

kuma0220
質問者

お礼

ありがとうございます。

  • bunjii
  • ベストアンサー率43% (3589/8249)
回答No.3

>A,B,C列に添付の値が入力されておりセルE2の値とF2~F7の値が両方一致したものがA,B列にあればC列の値をG列に順々に入力していきたいのですが。 F列はB列からの抽出でなくても良いですか? また、F4の201706に対するB列の該当はB6とB10にありますが何方を採用しますか? 更に、F5の201708に対してはB4が該当しますが例示の見落としですか? もう1つ、A13=E2ですがB13の201702は範囲外でしょうか? >どなたか関数が解る方、欲をいえばVBAコードが解る方ご教授願います。 関数、VBA共、上記の条件を補足して頂かないと回答し難いです。 仕様の漏れは結果に影響しますので漏れの無いようにしてください。 貼付画像は関数による処理です。 F2=IF(COUNTIF(A$2:A$13,E$2)>=ROWS(F$2:F2),SMALL(INDEX((A$2:A$13<>E$2)*MAX(B$2:B$13)+B$2:B$13,0),ROWS(F$2:F2)),"") G2=IF(F2="","",INDEX(C:C,LARGE(INDEX((A$2:A$13=E$2)*(B$2:B$13=F2)*ROW(G$2:G$13),0),COUNTIFS(A$2:A$13,E$2,B$2:B$13,F2)-COUNTIF(F$1:F1,F2)))) F2:G2セルを下へ13行目までコピーしました。

kuma0220
質問者

お礼

ありがとうございます。

  • msMike
  • ベストアンサー率20% (364/1804)
回答No.2

G2: =IFERROR(INDEX(C$2:C$13,SUMPRODUCT((A$2:A$13=E$2)*(B$2:B$13=F2)*ROW(A$2:A$13))-1),"")

kuma0220
質問者

お礼

ありがとうございます。

  • HohoPapa
  • ベストアンサー率65% (455/693)
回答No.1

B列とE列の値が日付属性であれば Function GetKigoName(Kigo As String, Hiduke As Date) As String  Dim LineCounter As Integer  With ThisWorkbook.Sheets(1)   LineCounter = 2   Do    If .Cells(LineCounter, 1).Value = "" Then     Exit Do    End If      If ((.Cells(LineCounter, 1).Value = Kigo) And _      (.Cells(LineCounter, 2).Value = Hiduke)) Then     GetKigoName = .Cells(LineCounter, 3).Value    End If    LineCounter = LineCounter + 1   Loop  End With End Function こんな関数を配置し G2セルに =GetKigoName(E2,F2)  といった計算式を埋め 以下、必要数、下方向に複写します。

kuma0220
質問者

お礼

ありがとうございます。