- 締切済み
<Excel>複数列を条件に別表から値を拾う方法
教えてください。 図G-K列(下の表)のような標準値を与える表があります。 (実際は150行程度、順番は完全にランダムです) 別表で、図A-C列(上の表)のような「地質」「樹種」「年齢」が、 実測値で手入力されたデータがあります。 (1000行程度) この上表の各行に既存の3つの条件(「地質」「樹種」「年齢」)に対応した「生長量」「糖度」を、 標準値の表から拾ってきたい場合、どのような関数を指定すればよいでしょうか。 (たとえば、図だとD9には850、E9には4が入るようにしたい) VLOOKUP関数を試しましたが、複数の参照列がある場合は適当でないようでした。 やはりデータベース関数でしょうか? 浅学な質問で申し訳ありませんが、よろしくご教授ください。
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- imogasi
- ベストアンサー率27% (4737/17069)
エクセルの複数条件での抜き出しや参照は関数式が長くなって、式の理解も難しい。既に回答があるとおり。 興味があれば、Googleででも「imogasi方式」で照会すれば、過去の抜き出し問題と回答のタイプが判る。 ーー そういう事情で、エクセルでそれが出来るのは、データーフィルターフィルタオプションの設定しかない。 他にはデータベースのSQLなど使わないと複雑になる。 ただしフィルタオプションの操作は、1条件に1件分しか出来ない。これをVBAで連続作業処理をするようにしてみた。 ーー 例データ Sheet1 地質 樹種 年令 成長量 a b c d e f j jk l kk mm aa 成長量の列にSheet2を参照した値を入れるのが目的 Sheet2 検索表 地質 樹種 年令 成長量 a b c 23 d e f 2 g h i 3 j jk l 4 kk mm aa 45 ーー Sheet2 G1:I2 条件をセットするセル範囲 地質 樹種 年令 kk mm aa <-仮の値。空白でセル良い。 ーー G5:J6 結果をセットするセル範囲 地質 樹種 年令 成長量 kk mm aa 45 <--仮の値。空白セルで良い。 結果はVBA実行後、Sheet2のJ6セルにセットされる ーーー 標準モジュールに Sub Macro4() '--シートの定義 Dim sh1, sh2 Set sh1 = Worksheets("Sheet1") Set sh2 = Worksheets("Sheet2") '--シート1の最下行をとらえる d1 = sh1.Range("A65536").End(xlUp).Row MsgBox d1 For i = 2 To d1 'シート1の最下行まで各行で繰り返し '--シート2へ条件の値を、シート1の行からセット sh2.Range("G2") = sh1.Cells(i, "A") sh2.Range("H2") = sh1.Cells(i, "B") sh2.Range("I2") = sh1.Cells(i, "C") '---フィルタオプションの設定をシート2で実行。マクロの記録から sh2.Range("A1:D12").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=sh2.Range( _ "G1:I2"), CopyToRange:=sh2.Range("G5:J10"), Unique:=False '--結果をシート1のD行にセット sh1.Cells(i, "D") = sh2.Range("j6") Next i End Sub マクロの記録で、出るコードを一部修正した程度のもの。 ーー 結果 Sheet1 のD列に求めるものが出る。 地質 樹種 年令 成長量 a b c 23 d e f 2 j jk l 4 kk mm aa 45 成長量のほかに他項目も1度に取りたいときはコードの修正追加・シート2のK列の項目見出しの追加が必要。略。 ーー 本件で3列((「地質」「樹種」「年齢」)を文字列結合して、その列でVLOOKUP関数を使うのが考えやすいかも。
- MackyNo1
- ベストアンサー率53% (1521/2850)
数式入力セルが多くなると動きが重くなるのであまりお勧めできませんが、例示のレイアウトなら以下のような数式をD3セルに入力して方向にオートフィルすれば該当データを表示できます。(エラー処理はしてありません) =INDEX(J$3:J$1000,MATCH($A3&$B3&$C3,INDEX($G$3:$G$1000&$H$3:$H$1000&$I$3:$I$1000,),0)) #Officeソフトはバージョンによって使用できる機能(Excelの場合は関数など)や操作方法が大きく異なりますので、質問の際には必ずバージョンを明記するようにしましょう。
- kagakusuki
- ベストアンサー率51% (2610/5101)
作業列を使用しない方法としては次の様なものがあります。 まず、D3セルに次の数式を入力して下さい。 =IF(AND($A3<>"",$B3<>"",$C3<>"",SUMPRODUCT(($G$2:INDEX($G:$G,MATCH("゛",$H:$H,-1))=$A3)*($H$2:INDEX($H:$H,MATCH("゛",$H:$H,-1))=$B3)*($I$2:INDEX($I:$I,MATCH("゛",$H:$H,-1))=$C3))=1),INDEX(J:J,SUMPRODUCT(ROW($H$2:INDEX($H:$H,MATCH("゛",$H:$H,-1)))*($G$2:INDEX($G:$G,MATCH("゛",$H:$H,-1))=$A3)*($H$2:INDEX($H:$H,MATCH("゛",$H:$H,-1))=$B3)*($I$2:INDEX($I:$I,MATCH("゛",$H:$H,-1))=$C3))),"") 次に、D3セルをコピーして、E3セルに貼り付けて下さい。 次に、D3~E3の範囲をコピーして、同じ列の4行目以下に貼り付けて下さい。 以上です。 尚、I列~K列の値が、必ず数値データのみである場合には、D3セルに入力する数式を次の様なものとする事も出来ます。 =IF(AND($A3<>"",$B3<>"",$C3<>"",SUMPRODUCT(($G$3:INDEX($G:$G,MATCH(9^99,$I:$I))=$A3)*($H$3:INDEX($H:$H,MATCH(9^99,$I:$I))=$B3)*($I$3:INDEX($I:$I,MATCH(9^99,$I:$I))=$C3))=1),SUMPRODUCT((J$3:INDEX(J:J,MATCH(9^99,$I:$I)))*($G$3:INDEX($G:$G,MATCH(9^99,$I:$I))=$A3)*($H$3:INDEX($H:$H,MATCH(9^99,$I:$I))=$B3)*($I$3:INDEX($I:$I,MATCH(9^99,$I:$I))=$C3)),"")
- tom04
- ベストアンサー率49% (2537/5117)
- reoreo111
- ベストアンサー率33% (3/9)
一つ列を追加して、3つの項目をつなげた値を作るのはどうですか? 一つの項目になればvlookupが使えると思いますし。