• ベストアンサー

HLOOKUPで複数の結果を取得する方法

元データ 1  2  4  2  2  2  3  3  3  2  1 A B  C D E  F  G  H  I  J  K から、以下のように、 1を入力すると、A と K が、 3を入力すると、G と H と I が右のセルに表示される、といったものを 作成しているのですが、なかなかうまくいきません・・・。 ↓入力データ 1  A   K 2  B   D   E   F   J 3  G   H   I 4  C   ↑   ↑ここから右、HLOOKUPで引っ張れないデータ   ↑HLOOKUPで引っ張れるデータ HLOOKUP関数を駆使すれば、なんとかなりそうな気もするのですが・・・ どなたかご教授願えないでしょうか??

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

  • ベストアンサー
noname#52504
noname#52504
回答No.9

#3です。 ん~っと、私の式はデータや表示位置が違う場合もあらかじめ考慮していたつもりなんですが…。 私が提示した式は  B5:=IF(COLUMN()-COLUMN($A5)>COUNTIF($A$1:$K$1,$A5),"",INDEX($A$2:$K$2,MATCH(LARGE(($A$1:$K$1=$A5)/COLUMN($A$1:$K$1),COLUMN()-COLUMN($A5)),1/COLUMN($A$1:$K$1),0))) でしたね  ・$A5 ⇒ $E43  ・$A$1:$K$1 ⇒ $D$1:$N$1  ・$A$2:$K$2 ⇒ $D$4:$N$4 と置き換えるだけです。(Excel2003で動作確認済)  F43:=IF(COLUMN()-COLUMN($E43)>COUNTIF($D$1:$N$1,$E43),"",INDEX($D$4:$N$4,MATCH(LARGE(($D$1:$N$1=$E43)/COLUMN($D$1:$N$1),COLUMN()-COLUMN($E43)),1/COLUMN($D$1:$N$1),0))) 他の方の式については、データや表示位置がA列からあることを前提にしていらっしゃるようなので、 直接数字を差し引きして調整する必要があるかと思います。

pureone
質問者

お礼

ありがとうございます!無事、出来ました! ※置き換えしていたのですが、今、式を見直してみたら  置き換えに漏れがありました・・・。  当方の初歩的なミスのせいで お手数をおかけしてしまい、  申し訳ありませんでした。

その他の回答 (10)

  • maron--5
  • ベストアンサー率36% (321/877)
回答No.11

>¥=A44を例にとると、「B,D,E,F,J」と表示させたい ★F44ではないでしょうか? F44=IF(COLUMN(A1)>COUNTIF($D$1:$N$1,$E43),"",INDEX($D$4:$N$4,SMALL(INDEX(SUBSTITUTE(($D$1:$N$1=$E43)*1,0,9^9)*COLUMN($A:$K),),COLUMN(A1)))) ★右と下にコピー

noname#204879
noname#204879
回答No.10

[ANo.8この回答への補足]に対するコメント、 1.セル F43 に次の配列数式を入力して、Shift+Ctrl+Enterで確定   (数式バー上では式の左端と右端にそれぞれ { と } が付加される)   =OFFSET($D$4,0,SMALL(IF($D$1:$N$1=$E43,COLUMN($A1:$K1),""),COLUMN(A1))-1) 2.同セルに次の[条件付き書式]を設定     数式が    =ISERROR(F43)     フォント色  白 3.セル F43 を右方にズズーッと(セル P43 まで)ドラッグ&ペースト 4.範囲 F43:P43を下方にズズーッとドラッグ&ペースト

noname#204879
noname#204879
回答No.8

元データ(Sheet1)   A B C D E F G H I J K 1 1 2 4 2 2 2 3 3 3 2 1 2 A B C D E F G H I J K 入力データ(Sheet2)   A B C D E F G H I J K L 1 1 A K 2 2 B D E F J 3 3 G H I 4 4 C 1.Sheet2 のセル B1 に次の配列数式を入力して、Shift+Ctrl+Enterで確定   (数式バー上では式の左端と右端にそれぞれ { と } が付加される)   =OFFSET(Sheet1!$A$2,0,SMALL(IF(Sheet1!$A$1:$K$1=$A1,COLUMN($A1:$K1),""),COLUMN(A1))-1) 2.同セルに次の[条件付き書式]を設定     数式が    =ISERROR(B1)     フォント色  白 3.同セルを[コピー]して範囲 B1:L4 に[貼り付け]

pureone
質問者

補足

ご回答ありがとうございます! これを、実際のデータ位置に置き換えて反映させてみようとしたのですが、 うまくいきませんでした・・・。 実際の元データの位置は、 D1~N1と、D4~N4で、 参照のためのデータを入力する位置は、 E43~、 データ表示位置は、 F43~ となります。 (以下参照)   A B C D E F G H I J K L M N 1 @ @ @ 1 2 4 2 2 2 3 3 3 2 1 2 @ @ @ @ @ @ @ @ @ @ @ @ @ @  3 @ @ @ @ @ @ @ @ @ @ @ @ @ @ 4 @ @ @ A B C D E F G H I J K 5 6 7 8 : 43 \ @ @ @ 1 A K 44 \ @ @ @ 2 B D E F J 45 \ @ @ @ 3 G H I 46 \ @ @ @ 4 C 47 \ @ @ @ 5 48 \ @ @ @ 6 49 \ @ @ @ 7 50 \ @ @ @ 8 : @=任意のデータ ¥=A44を例にとると、「B,D,E,F,J」と表示させたい。 申し訳ありませんが、引き続きご教授願えないでしょうか?

  • ka_na_de
  • ベストアンサー率56% (162/286)
回答No.7

関数の質問でしたが、難しくて挫折しました。 VBAで作ってみましたので、ご参考までに 1)データが入力されると該当する値を横に表示する例 2)新規シートにデータを並べ替えてしまう例  注)いずれも、元データはA1セルを基点に入力されている前提です。 1)の例 <A5セルに入力データを書き込む場合です。> '==============ワークシート・モジュールに記述=================== Private Sub Worksheet_Change(ByVal Target As Range)  Dim c As Long    If Target.Address <> "$A$5" Then Exit Sub  Range(Target.Offset(, 1), Cells(Target.Row, Columns.Count)).ClearContents    For c = 1 To Cells(1, Columns.Count).End(xlToLeft).Column   If Cells(1, c).Value = Target.Value Then    Cells(Target.Row, Columns.Count).End(xlToLeft).Offset(, 1).Value = Cells(2, c).Value   End If  Next c   End Sub 2)の例 (新規シートに並べ替えた一覧表を表示する例です。) '=================標準モジュールに記述========================== Sub test()  Dim r As Long  Dim LastRow_A As Long  Dim LastCol_r As Long  Dim LastCol_1 As Long  Application.ScreenUpdating = False    'データを新規シートに行列変換して貼り付け  Range("A1").CurrentRegion.Copy  Sheets.Add  Range("A1").PasteSpecial Transpose:=True     '番号順に並べ替え  Columns("A:B").Sort Key1:=Range("A2"), Order1:=xlAscending       '同一番号データを横方向へ移動(複数列にも対応)  LastCol_1 = Cells(1, Columns.Count).End(xlToLeft).Column  LastRow_A = Cells(Rows.Count, "A").End(xlUp).Row  For r = LastRow_A To 2 Step -1   LastCol_r = Cells(r, Columns.Count).End(xlToLeft).Column   If Range("A" & r).Value = Range("A" & r - 1).Value Then     Range("A" & r).Resize(, LastCol_r - 1).Offset(, 1).Copy _      Destination:=Cells(r - 1, LastCol_1 + 1)     Rows(r).Delete   End If  Next r    Application.ScreenUpdating = True End Sub

  • maron--5
  • ベストアンサー率36% (321/877)
回答No.6

◆こんな方法もありますよ(少し、式が短くなりました) B5=IF(COLUMN(A1)>COUNTIF($A$1:$K$1,$A5),"",INDEX($A$2:$K$2,SMALL(INDEX(SUBSTITUTE(($A$1:$K$1=$A5)*1,0,9^9)*COLUMN($A:$K),),COLUMN(A1)))) ★右と下にコピー

pureone
質問者

補足

ご回答ありがとうございます! これを、実際のデータ位置に置き換えて反映させてみようとしたのですが、 うまくいきませんでした・・・。 実際の元データの位置は、 D1~N1と、D4~N4で、 参照のためのデータを入力する位置は、 E43~、 データ表示位置は、 F43~ となります。 (以下参照)   A B C D E F G H I J K L M N 1 @ @ @ 1 2 4 2 2 2 3 3 3 2 1 2 @ @ @ @ @ @ @ @ @ @ @ @ @ @  3 @ @ @ @ @ @ @ @ @ @ @ @ @ @ 4 @ @ @ A B C D E F G H I J K 5 6 7 8 : 43 \ @ @ @ 1 A K 44 \ @ @ @ 2 B D E F J 45 \ @ @ @ 3 G H I 46 \ @ @ @ 4 C 47 \ @ @ @ 5 48 \ @ @ @ 6 49 \ @ @ @ 7 50 \ @ @ @ 8 : @=任意のデータ ¥=A44を例にとると、「B,D,E,F,J」と表示させたい。 申し訳ありませんが、引き続きご教授願えないでしょうか?

  • maron--5
  • ベストアンサー率36% (321/877)
回答No.5

◆少し、式が長いですがこんな方法もありますよ     A   B   C   D   E   F   G   H   I   J   K 1   1    2   4    2   2    2   3   3   3   2    1 2   A   B   C   D   E   F   G   H   I   J   K 3 4 5   1   A   K 6   2   B   D   E   F   J 7   3   G   H   I 8   4   C B5=IF(COLUMN(A1)>COUNTIF($A$1:$K$1,$A5),"",INDEX($A$2:$K$2,SUMPRODUCT(LARGE(($A$1:$K$1=$A5)*(COLUMN($A$1:$K$1)),1+COUNTIF($A$1:$K$1,$A5)-COLUMN(A1)))))

  • telescope
  • ベストアンサー率54% (1069/1958)
回答No.4

=HLOOKUP(INDIRECT("A"&ROW()),A$1:A$2,2,0) と入力してフィルハンドルを右方向にL列までドラッグします。 そのまま下方向にドラッグします。 該当のないセルには「#N/A」とエラー値が表示されます。 「編集」-「ジャンプ」で「セル選択」ボタンを押し、 [数式]を選択して、[エラー値]以外のチェックをはずします。 [エラー値]の入ったセルが選択されます。 右クリックで「削除」で「左方向にシフト」を選択して「OK」ボタンを押します。 コピーして「形式を選択して貼り付け」で[値]のみ貼り付けます。 先に[値]のみ貼り付けた場合は、 [定数]を選択して、[エラー値]以外のチェックをはずします。 ちょっと面倒ですが、HLOOKUP関数を使ってやるならこんな方法でできそうです。

noname#52504
noname#52504
回答No.3

HLOOKUPは"最初にHITしたもの"しか返しませんから、 2番目にHITしたもの、3番目にHITしたもの、というふうに返すのは、 HLOOKUPをどう駆使しても難しいと思われます。 #2さんがおっしゃるように、まずユニークなコードを生成してそれを使って引くのが大原則です。 例えば、元のデータがA1から1行目と2行目に、「入力データ」の部分がA5から下方に入っているとして、 まず、  A3:=COUNTIF($A1:A1,A1)&"-"&A1 として右方にフィル。これが「N番目の□」というユニークなコードになります。 次に、  B5:=IF(COUNTIF($A$1:$K$1,$A5)<COLUMN()-COLUMN($A$5),"",INDEX($A$2:$K$2,MATCH(COLUMN()-COLUMN($A5)&"-"&$A5,$A$3:$K$3,0))) として、下方・右方にフィルすればご要望のような結果が返ります。 略解  ・自セルの列位置N【COLUMN()-COLUMN($A5)】を取得する。  ・第1行について、検索値と等しい値がNより少なければ空白を返す。  ・Nと検索値を組み合わせて検索用のコードを生成する。  ・そのコードを第3行から探して位置Mを取得する。  ・第2行について、M番目の値を返す。   一発でやろうとするならば、  B5:=IF(COLUMN()-COLUMN($A5)>COUNTIF($A$1:$K$1,$A5),"",INDEX($A$2:$K$2,MATCH(LARGE(($A$1:$K$1=$A5)/COLUMN($A$1:$K$1),COLUMN()-COLUMN($A5)),1/COLUMN($A$1:$K$1),0))) を配列数式として入力し、下方・右方にフィル。 ※通常の数式は、数式を入力した後Enterキーで確定しますが、  これは配列数式なので、CtrlとShiftを押しながらEnterで確定してください。 略解  ・第1行について、検索値と等しければ列番号の逆数、でなければ0を返した配列を生成する。  ・それらのうち、N番目に大きい値の位置Mを検索する。  後は上記と一緒です。

pureone
質問者

補足

ご回答ありがとうございます! これを、実際のデータ位置に置き換えて反映させてみようとしたのですが、 うまくいきませんでした・・・。 実際の元データの位置は、 D1~N1と、D4~N4で、 参照のためのデータを入力する位置は、 E43~、 データ表示位置は、 F43~ となります。 (以下参照)   A B C D E F G H I J K L M N 1 @ @ @ 1 2 4 2 2 2 3 3 3 2 1 2 @ @ @ @ @ @ @ @ @ @ @ @ @ @  3 @ @ @ @ @ @ @ @ @ @ @ @ @ @ 4 @ @ @ A B C D E F G H I J K 5 6 7 8 : 43 \ @ @ @ 1 A K 44 \ @ @ @ 2 B D E F J 45 \ @ @ @ 3 G H I 46 \ @ @ @ 4 C 47 \ @ @ @ 5 48 \ @ @ @ 6 49 \ @ @ @ 7 50 \ @ @ @ 8 : @=任意のデータ ¥=A44を例にとると、「B,D,E,F,J」と表示させたい。 申し訳ありませんが、引き続きご教授願えないでしょうか?

  • shintaro-2
  • ベストアンサー率36% (2266/6244)
回答No.2

>HLOOKUP関数を駆使すれば、なんとかなりそうな気もするのですが・・・  思想として、コード入力をすると表から対応するものをもってくるというのは、  コードがユニークであることが前提だと思うのです。  ですので、もとのデータが、例えば3のセルの下に、GHIと3文字入っていないと引っ張れないのではないでしょうか?  もし、この表で解決するとしたら  3列目は参照する元の表を、2列目のデータをピックアップしたところから右側にずらすという操作が必要ではないでしょうか?

回答No.1

まず、横のデータを持ってくるのであればHLOOKUPじゃなくてVLOOKUPですね。 で、2と入力するとBDEFJと出したいのであれば =VLOOKUP(A6,A1:C4,2,0)&VLOOKUP(A6,A1:C4,3,0)&VLOOKUP(A6,A1:C4,4,0)& .... というようにVLOOKUPの3つめの数字を1つづつ増やしていって &で繋げればよいかと思います。 もちろんBDEFJと最大何個までと分かっている場合だけですが。 延々と続く可能性があるのであれば無理っぽいですね。

関連するQ&A

  • ツリー情報のデータをSQLで取得したい

    SQLServer 2008 です。 以下のツリーデータの場合に A ┬C │├D ┬H ││ ├I ││ └J │└E B ┬F ┬I  │ └L  └G 次のようなデータを登録しています。 ┌──┬──┬──┐ │OYA │KO │Data│ ├──┼──┼──┤ │A │C  │"C" │ ├──┼──┼──┤ │A  │D  │"D" │ ├──┼──┼──┤ │A  │E  │"E" │ ├──┼──┼──┤ │B  │F  │"F" │ ├──┼──┼──┤ │B  │G  │"G" │ ├──┼──┼──┤ │D  │H  │"H" │ ├──┼──┼──┤ │D  │I  │"I" │ ├──┼──┼──┤ │D  │J  │"J" │ ├──┼──┼──┤ │F  │I  │"I" │ ├──┼──┼──┤ │F  │L  │"L" │ └──┴──┴──┘ 引数OYA="A"でSQLを実行した場合に 以下のような この引数を含むそれ以下のツリーに関する データを取得する方法を教えてください。 ┌──┬──┬──┐ │OYA │KO │Data│ ├──┼──┼──┤ │A │C  │"C" │ ├──┼──┼──┤ │A  │D  │"D" │ ├──┼──┼──┤ │A  │E  │"E" │ ├──┼──┼──┤ │D  │H  │"H" │ ├──┼──┼──┤ │D  │I  │"I" │ ├──┼──┼──┤ │D  │J  │"J" │ └──┴──┴──┘

  • エクセル マクロでセルを自動移動

    例1のようになっているエクセル表があります。 データは右方向、下方向へ増えます。 Cの列以降は4つ単位でしかデータは増えません。 それを例2の表のように列A,Bのデータはそのままに Cの列以降の4つのセルを区切りに下の行に移動して、 空白の列まで言ったらA2の行以降を最後の行まで繰り返しするという マクロを書くことは可能でしょうか。 出来ましたらそのマクロを教えてください。 例1 A1 B1 C1 D1 E1 F1 G1 H1 I1 J1 K1 L1 M1 N1 A2 B2 C2 D2 E2 F2 G2 H2 I2 J2 A3 B3 C3 D3 E3 F3 G3 H3 I3 J3 K3 L3 M3 N3 例2 A1 B1 C1 D1 E1 F1 A1 B1 G1 H1 I1 J1 A1 B1 K1 L1 M1 N1 A2 B2 C2 D2 E2 F2 A2 B2 G2 H2 I2 J2 A3 B3 C3 D3 E3 F3 A3 B3 G3 H3 I3 J3 A3 B3 K3 L3 M3 N3

  • excel  複数行をまとめる 一括変換

    データ整理で困っております。 皆様のお知恵を拝借したくお願いいたします。 EXCELシートで次のようなデータがあります。   A B C D E F G H I J K 1 1 あ い 2  う え 3  お か 4  き く 5  け こ 列はA,B,Cのみにデータがあります。 行は1~5にあります。 A1は連番で数字があります。 この5行のデータが400近くあります。(約2,000行) このシートが10ほど存在します。 これらのシートを次のように1行に変換したいのです。   A B C D E F G H I J K 1 1 あ い う え お か き く け こ 2  3  4  5  行2~5はブランクのままでもかまいません。 何卒よろしくお願いいたします。

  • 2つエクセルデータを比較し、必要な情報を抽出する方法は?

    sheet1        sheet2      sheet3 19000001 a    19000001 a   19000001 aa 19000001 aa   19000002 b    19000005 ee 19000002 b    19000003 c 19000003 c    19000004 d 19000004 d    19000005 e 19000005 e    19000006 f 19000005 ee   19000007 g 19000006 f    19000008 h 19000007 g    19000009 i 19000008 h    19000010 j 19000009 i    19000011 k 19000010 j    19000012 l 19000011 k 19000012 l sheet1にあるデータから sheet2にはないデータをsheet3に抜き出したい できるだけ簡単な方法を教えてください

  • EXCELの表で縦横の入れ替え方法

    EXCELの表で 縦軸と横軸を入れ替える方法ってありますか? つまり A B C D E F G H I J K L っていう表を A E I B F J C G K D H L にしたいのです。

  • VBA

    1 a;b;c;d; 2 e;f;g;h; 3 i;j;k;l; をVBAで   1 a;   2 e;   3 i;   1 b;   2 f;    3 j;   1 c;   2 g;   3 k;   1 d;   2 h;   3 l; としたいのですが、どうしたらいいですか?

  • エクセルの関数HLOOKUPについて教えてください

     A B C D E F G H I J 1          4       2      4 3AA このような表があり、F1に今回は4ですが10だったり8だったりランダムに数字が入ります。その時2行目にもランダムに数字が入るのですがF1に入った数字と同じ数字を感知してF1を拠点に左に行くと+右に行くと-といった具合で、この場合D2なので+2です。 +3以上なら3A、+2ならAA、+1、+-0ならA、-1ならBA、-2ならB、-3以上はCといった具合に、A3に答えがくるようにしたいのですが、どうしたらいいのでしょうか?教えてくださいおねがいします。

  • エクセルでのセル番地の取得方法がわかりません

    3時間ほどネットで調べても分からず、困っています。 教えてくださいませm(_ _)m ------------------------------------------------------ 検索対象データ群: A, B, C, E, F, G, H, I, J, K (セル範囲:A1~K1) 入力数値(任意): G の場合のセル番地は当然【G1】なのですが、 関数で求める方法はありますでしょうか? ------------------------------------------------------ よろしくお願いします。

  • Excelで飛び飛びのセル(列)を参照したいのですが…その2

     ある「sheet1」で、G1="A",H1="B",I1="C",J1="D",K1="E",L1="F",M1="G",N1="H",O1="I",P1="J",Q1="K",・・というように文字が入力されているとすると、5列飛びの値A,F,K・・・(G1,L1,Q1・・・)が欲しいのです。そして、その値が「sheet2」に、C5=A,D5=F,E5=K,F5=P・・・となるようにしたいのです。ただ数値が5ずつ増加するのではなく、そのセルに入力されている文字列を参照したいのです。  それをまた、「sheet1」の、G2="A",H2="B",I2="C",J2="D"・・・の値でも同じ事をしたいのですが・・・。  よろしくお願いします。

  • 2行のセルの入れ替え。

     初めまして、よろしくお願いします。  セルに A B C D E F G H I J K L 1 a b c d e f 2 g h i j k l 3 m n o p q r 4 s t u v w x 5 " ・ " ・ " ・ " 100 "  という表があります。これを A B C D E F G H I J K L 1 a b c d e f g h i j k l 2 m n o p q r s t u v w x 3 " 4 " 5 " ・ " ・ " ・ " 100 "  という風に、偶数行のデーターを奇数行の後ろにつけるようにしたいと思います。無理ならば奇数行だけのデーター、偶数行だけのデーターとなるように、何かよい方法を教えて頂きたく、よろしくお願いします。

専門家に質問してみよう