2016-04-08 13 views
2

私は本当にオンラインでこの答えを見つけるのに苦労しています。私は実際にこの問題のVBAソリューションを見つけました。 。唯一の血液型を選択O.VBAなしのセルの値に基づいてすべての行を抽出

のための非常に単純に上記の私は、この範囲を再作成したいデータセットが、フィルタから

PROBLEM

BLOOD NAME AGE GENDER 
A David 18 Male 
B Sarah 22 Female 
O Lucy 32 Female 
AB Steven 23 Male 
O John 11 Male 
B Mike 25 Male 
AB Paul 24 Male 
O Amy 23 Female 
B Drake 22 Female 
O Linda 11 Female 

MYしようとスタート

しかし、最初に出現したときに停止するVLookupテーブル。その後、行numの位置を特定しようとしているMATCHオペランドにIF/THEN/ELSEロジックを組み込みました配列に出力する。 (私の失敗した試みを投稿するつもりはありません)オンラインで似たような問題を見つけましたが、ROW(A1)、ROW(A2)などを使って手動で範囲を参照して解決しました。

Excel式のみを使用して、このタイプの反復選択を行う方法を本当に知りたいです。たとえこのタイプの問題についてもっと学ぶことができるリソースに向かって問題を解決しないとしても、依然として高く評価されます。

+2

オートフィルタに問題がありますか? – findwindow

+3

[詳細検索](https://www.youtube.com/watch?v=_KGqJLXJvgY)をご覧ください。 –

+0

特定のワークフローを自動化しようとすると、自動フィルタを使用することは必ずしも適切ではありません。私は人々がオートフィルターなしでこのリクエスト機能をしているのを見て、どのように学びたいのですか? –

答えて

2

ここでは、配列の公式を使用した解があります。それは非常にゆっくりと計算され、正直なところVBAはずっと良い解決策です。数式を入力した後で「Ctrl + Shift + Enter」を押すと、これらの配列数式をExcelに伝える必要があります。これにより、式の周りに{}が追加されます。最後に、「O」血液型を有する第1の「X」結果を表示するために配列数式を下にドラッグ:「血液」の

第1セル式 - >を血液がシート1 {=IFERROR(INDEX(Sheet1!$A:$D,SMALL(IF(Sheet1!$A:$A="O",ROW(Sheet1!$A:$A)),ROW(1:1)),1,1),"")}

の列A内にあるとみなされ「名前」のための最初のセルの数式 - >年齢はSheet1の {=IFERROR(INDEX(Sheet1!$A:$D,SMALL(IF(Sheet1!$A:$A="O",ROW(Sheet1!$A:$A)),ROW(1:1)),3,1),"")}

最初のセルの列cであると仮定し - >は名前がSheet1の の列Bに{=IFERROR(INDEX(Sheet1!$A:$D,SMALL(IF(Sheet1!$A:$A="O",ROW(Sheet1!$A:$A)),ROW(1:1)),2,1),"")}

である「時代」のための最初のセルの数式を前提としてい「Gen」の式 - DER」>男女を想定しているが、シート1の列Dで {=IFERROR(INDEX(Sheet1!$A:$D,SMALL(IF(Sheet1!$A:$A="O",ROW(Sheet1!$A:$A)),ROW(1:1)),4,1),"")}

結果である:

BLOOD NAME AGE GENDER 
O  Lucy 32 Female 
O  John 11 Male 
O  Amy  23 Female 
O  Linda 11 Female 
+1

これは、小さなデータセットに対して機能します。数百以上のものがあれば、それは優れた性能を発揮します。また、FWIWでは、配列の式を使用する際に、不要な計算を強制するため、完全な列参照を避ける必要があります。 –

+0

ありがとう、本当にあなたの時間の友達に感謝! –

4

これは、配列数式を使用しませんが、ヘルパー列を使用して行います。

=IF(A2="O",1+MAX($E$1:E1),"") 

とダウンコピーします:E2にcolsの通じD、中のデータを仮定すると、入力し

enter image description here
O行の各

が簡単なシーケンシャル値でマークされ。これにより、通常のMATCH()/ INDEX()メソッドが簡単になります。

他のいくつかのセルを選択し、入力します

=IFERROR(INDEX(A:A,MATCH(ROWS($1:1),$E:$E,0)),"") 

とを横切って上下両方このセルをコピー:

enter image description here

+0

この例は本当に面白いですが、ありがとうございました! –

+0

@JeffPalsonあなたは大歓迎です...このテクニックは、表から特定の行を抽出する必要がある多くのケースに適用できます。*ヘルパー列*は作成できます複数の列から複数の基準を処理する –

2

次の配列式は(どこカラムから2行目に入れることができますE以降)、3列にまたがって必要な限りコピーします。

=IFERROR(INDEX(A:A,SMALL(IF(ISNUMBER(SEARCH("O",$A$2:$A$11)),ROW($A$2:$A$11),""),ROW()-1)),"")

これは、 + を入力して、固定された配列(A2:A11)を使用していますはCtrl +Shiftキーを使用して入力されます。何が起こっている

=IFERROR(INDEX(A:A,SMALL(IF(ISNUMBER(SEARCH("O",INDIRECT("$A2:$A"&COUNTA(A:A)))),ROW(INDIRECT("$A2:$A"&COUNTA(A:A))),""),ROW()-1)),"")

:あなたの配列のサイズを変更しようとしている場合は、動的な、それは常にのようなので、範囲を、使用包含するようにINDIRECTCOUNTAを使用して、それへの参照を行うことができます。いかなる「O」が見つからなかった場合、「O」は見出されず、何もした場合

SEARCH機能はIF返す行番号次いで、「O」Sを探しています。

SMALL関数は= ROW()-1NSEARCH関数によって返される結果のN番目のインスタンスを探しています。 A、B:B、等、N = SMALL関数によって返される行の数

INDEX関数は、N番目アレイAから値を返します。

IFERROR関数は必須ではありませんが、よりクリーンなデータセットを作成するためのもので、何も返されなかった数式を代わりに空白に置き換えるだけです。

+0

うわー、これが大好き!この魅力的な発見の説明に感謝し、そこから負荷を学ぶことができました!!乾杯! 1つのことですが、血液型Aのタイプを探すときに検索コマンドを使用すると、フィルタにタイプABも含まれています。それにもかかわらず、とにかくこれはまだ愛された! –

+0

これは制限です。はい。他のものに "AB"の値を代入して "A"が部分文字列ではなくなるようにすると、それを回避できます。このように、 '= IFERROR(INDEX(A:A、A:A)、C: "))、ROW() - )、)")。今すぐ "AB"の結果を返すには、 "C"を検索することを忘れないでください。ちょっとハッキリですが、知られている小さなリストの場合(血液型の場合のように)、それは仕事をします。 – CactusCake

関連する問題