• ベストアンサー

VLOOKUP(SUMPRODUCT・・・の式ですが

 お世話になっています。  先日こちらでエクセルのセット料金の作り方を問合せした者ですが、このときに以下のような式を教えていただきました。 =VLOOKUP(SUMPRODUCT((C5:F5="○")*10^{3,2,1,0}),F13:G27,2,FALSE) (すみませんが下の表を参照願います。 顧客毎のセット料金を○のパターンで自動的に求めるという仕組みです)  教えていただいた当時、式の中身は理解できませんでしたが「本やネットで調べれば理解できるだろう」と考えて、質問を締め切ったのですが後で色々と考えたり調べてみたりしてもついに式の中身が理解出来ませんでした。 特にSUMPRODUCT((C2:f2="○")*10^{3,2,1,0})の辺りがもう全然分りませんでした。(VLOOKUPの検索値だと思っているのですが)  大変お手間をお掛けいたしますが再度ご教授下さいますようお願い致します。 

  • JU-BE
  • お礼率90% (30/33)

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

  • ベストアンサー
回答No.1

vlookupの検索値に使うコードを、○の組み合わせから生成する配 列式ですね。累乗を使うのは思いつかなかったなぁ。 たとえば山田さん。C5:F5は○,○,○,""なので、(C5:F5="○")は {TRUE;TRUE;TRUE;FALSE}となります。そこに、10^{3,2,1,0}という 配列をかけますが、まず四則演算でTRUEは1、FALSEは0として扱う ということと、10^3=1000、10^2=100...を思い出すと、結果の配列 は{1000;1000;10;0}となり、sumproduct関数は配列の要素を全部足 し算するので、1110という数値が出てきますね。 (C5="○")*10^3+(D5="○")*10^2+(E5="○")*10^1+(F5="○")*10^0 をスマートに書いたんだと思ってください。 で、vlookup関数は1110というコードを検索して、2番目の\11,000 を返すというわけです。

JU-BE
質問者

お礼

お手数をお掛け致しました。 なるほど、この式には「配列」という仕組みが使われていたのですね。 それすら判っていなかったので混乱しまくっていました。 丁寧なご説明、本当に有難うございました。

JU-BE
質問者

補足

ご回答いただきありがとうございます。 TRUEは1、FALSEは0だったのですか。知りませんでした。 「=TRUE+TRUE」と入力したら本当に「2」と出てきたので驚きました。 (VLOOKUP関数などでFALSEとか入力するのが面倒な時の省略に「0」を入れれば良い、位の認識しかありませんでした) さて、 =VLOOKUP((C5="○")*10^3+(D5="○")*10^2+(E5="○")*10^1+(F5="○")*10^0,$F$12:$G$26,2,FALSE) という風に置き換えてみるとようやく理解が出来たのですが、すみませんがまだSUMPRODUCT((C5:F5)*10^{3,2,1,0}という式が今ひとつ理解できません。 「*10^{3,2,1,0}」ということは、もしかして =VLOOKUP(SUMPRODUCT(((C5:F5="○")*10^3)*((C5:F5="○")*10^2)*((C5:F5="○")*10^1)*((C5:F5="○")*10^0)),F12:G26,2,FALSE) なのか?と思って入力しましたが、やはりエラーでした。 大変理解が悪くて申し訳ございません。(質問の内容も意味不明かもしれませんが) もし可能ならその辺をもう少し教えていただけますでしょうか。

その他の回答 (3)

  • _Kyle
  • ベストアンサー率78% (109/139)
回答No.4

#2です。#2の記述ですが、わたしの方こそ読み違えていました。  >結果の配列は{1000;1000;10;0}となり、 というのは、  【 10^{3,2,1,0} 】の「結果」ではなく、  【 (C5:F5="○")*10^{3,2,1,0} 】 の「結果」ということですね。 #1さまのご解説に瑕疵はありません。大変失礼しました。 ------------------------------------------------------------ なお、[数式の検証]風に書くとこんな感じになります。 SUMPRODUCT((C5:F5="○")*10^{3,2,1,0}) ↓ ※SUMPRODUCT((C5:F5="○")*{10^3,10^2,10^1,10^0}) ↓ SUMPRODUCT((C5:F5="○")*{1000,100,10,1}) ↓ SUMPRODUCT({TRUE,TRUE,TRUE,FALSE}*{1000,100,10,1}) ↓ ※SUMPRODUCT({TRUE*1000,TRUE*100,TRUE*10,FALSE*1}) ↓ SUMPRODUCT({1000,100,10,0}) ↓ 1000+100+10+0 ↓ 1110 ※をつけている部分は、計算の過程をイメージとして表したもので、 数式としては正しくありません。 ご参考まで。

JU-BE
質問者

お礼

数式の検証までしていただき本当に有難うございます。 SUMPRODUCT関数も中途半端な理解しか無かったところに配列とかが合わさってわけがわからなくなっていました。 エクセルって難しいですね(汗)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.3

解説は済んだ様なので、別のやり方を書きます。 料金が10^{3,2,1,0})のように規則性が無くても下記は大丈夫(料金表決定しだい)。 質問の例の「コード」列に注目した。 A2:G4 F列にコード列を作る。 AーーーーB----CーーーーーD----E----F----G 田中 ○ ○ ○ ○ 1111 12000 山田 ○ ○ ○ 1110 11000 山本 ○ ○ ○ 1011 10000 F2の式は=((B2="○")*1&(C2="○")*1&(D2="○")*1&(E2="○")*1)*1 *1は数値化するために、入れている。 TRUE、FALSEの数値化 数字文字だけの文字列の数値化 の2つの面で。 検索表は セット料金表のコードと料金列 J-ーーーーK列とする。 コード 料金 1111 12000 1110 11000 1011 10000 G列は平凡なVLOOKUP関数 G2は =VLOOKUP(F2,$J$2:$K$10,2,FALSE) 式を下方向に複写。 質問者はVLOOKUP関数の第2引数に$をつける癖をつけること。 ==== エクセルの関数で作業列を使うと、式が考えやすくなる例は、たびたび有る!

JU-BE
質問者

お礼

回答有難うございます。 この方法で表を作ってみました。 確かに作業列を置くと式の仕組みが分り易いようです。 >質問者はVLOOKUP関数の第2引数に$をつける癖をつけること。  はい。十分に気をつけたいと思います。 有難うございました。

  • _Kyle
  • ベストアンサー率78% (109/139)
回答No.2

■エクセルでセット料金表を作りたいのですが http://bekkoame.okwave.jp/qa5087371.html の#2、問題の数式を書いた「元凶」です(^^;;; #1さま、お手数をおかけして申し訳ありません。 #1さまのご解説で十分かと思い、票も入れたのですが、 行き掛り上出てまいりました。 ----------------------------------------- さて。  >(VLOOKUPの検索値だと思っているのですが) その通りです。 SUMPRODUCT((C2:f2="○")*10^{3,2,1,0}) の部分は、 「配列」という考え方(仕組)を利用して、VLOOKUPの検索値を作っています。 ■日経PC21 / エクセル「配列数式」講座 http://pc.nikkeibp.co.jp/pc21/special/hr/ ■配列研究室 http://www.clayhouse.jp/array/array.htm 基本的な考え方は#1さまが解説されている通り、  ・C列が○なら1000、○でなければ0  ・D列が○なら100、○でなければ0  ・E列が○なら10、○でなければ0  ・F列が○なら1、○でなければ0 として全部足し上げればコードになる、ということです。 1点のみ、これは単なるケアレスミスだと思いますけど、  >結果の配列は{1000;1000;10;0}となり、 10^0 = 1 ですから  >結果の配列は{1000;1000;10;1}となり、 ですね。 あのケースでは、素朴に  =VLOOKUP(SUMPRODUCT((C5:F5="○")*{1000,100,10,1}),F13:G27,2,FALSE) とした方が良かったかもしれません。 以上ご参考まで。 ----------------------------------------- なお、行き掛かり上出てきただけですので、 ポイント配分の際はご配慮ください。

この投稿のマルチメディアは削除されているためご覧いただけません。
JU-BE
質問者

お礼

この間は本当にお世話になりました。 今回もお手数を取らせることになりまして恐縮です。 補足説明、有難うございます。 これからがんばって「配列数式」を勉強しようと思います。

関連するQ&A

  • VLOOKUP SUMPRODUCT

    初心者なのですが、VLOOKUPとSUMPRODUCTの使い方を知りたいです。 表     A列   B列 行1 サーバ1  5 行2 サーバ2 4 行3 サーバ3 3 行4 サーバ1  2 行5 サーバ3  2 という表でサーバ1を検索後、その合計値(7)を求めたく思います。 WEBや参考書を見たところVLOOKUPとSUMPRODUCTの組合せで出来るようなのですが、うまくいきませんでした。 =SUMPRODUCT(VLOOKUP(C6,A1:B5,2,FALSE)) 正しい式を教えてご教授いただきたく思います。

  • VLOOKUP関数の範囲の値が増えない方法

    VLOOKUP関数の範囲の指定で、 G2のセルの内容 =VLOOKUP(F2,TBL01!A2:C701,2,FALSE) と入っているセルを下方向にコピーすると G3 =VLOOKUP(F3,TBL01!A3:C702,2,FALSE) G4 =VLOOKUP(F4,TBL01!A4:C703,2,FALSE) といったようになります。ここで、 G3 =VLOOKUP(F3,TBL01!A2:C701,2,FALSE) G4 =VLOOKUP(F4,TBL01!A2:C701,2,FALSE) といった様に下方向にコピーしたいのです。 比較される値のF?は増えていく必要があります。 なにか良い方法はないでしょうか?

  • エクセルのVLOOKUP関数について

    エクセルのVLOOKUP関数を使用しての集計に関する質問です。 以下の例のような場合の関数が分からず本当に困っております。 どなたかご享受いただけたら幸いです。 よろしくお願いいたします。 毎月サポート費としてお客様ごとに定額が振り替えられ、その集計表を作成しております。 その際振替に使用するプランが2パターンあり、その月どちらのプランになるかは月によってまちまちです。 (同じお客様でも3月はパターン1、4月はパターン2だったりします。) また、振替日は使用するパターンによって異なります。 SHEET1に、 A列 B列 C列 D列 顧客名 金額 振替日 パターン名 という表があり顧客ごとの過去2年分の振替履歴が、1000レコード程並んでいます。 SHEET2でSHEET1の月ごとの集計を出そうと考えております。 表自体は月ごとに分けて作成したいので、表の上部に該当期間をつけます。下記のような感じです。 B2セル C2セル D2セル ○月 開始日 末日 (ex2月) (ex.11/2/1) (ex.11/2/28) A列:顧客名 B列:パターン名 C列:振替日 D列:金額 と並べ、顧客名ごとに、その月のパターン名・振替日・金額を集計したいです。 金額に関しては、SUMIFS関数、振替日に関しては使用パターンさえ出せれば、IF関数で出せると考えています。 パターン名のところでつまづいてしまっています。 行いたいこととしては、SHEET1のA列からD列(顧客名からパターン名まで)の範囲で、顧客名が一致したときに、振替日を抜き取り、振替日がC2(月初日)より大きく、かつD2(月末日)より小さいときのパターン名を表示させたいです。 (1)---------------------------------------------------- =IF(VLOOKUP(A3,sheet1!$A$2:$D$1000,3,FALSE)>$C$2,IF(VLOOKUP(A3,sheet1!$A$2:$D$1000,3,FALSE)<$D$2,(VLOOKUP(A3,sheet1!$A$2:$D$1000,4,FALSE)),"")) といれると、表示されるきちんとパターン名が表示されるセルと空白が返ってきてしまうセルがあります。 空白が返ってきてしまうセルは、双方の顧客名の最後の1文字を消す、スペースを入れる、など何かしら手を加えるときちんと表示されます。 ------------------------------------------------------ その他、VLOOKUP関数、IF関数、ISNA関数などを組み合わせて色々と試してみましたが期間がうまく指定出来ていないようで、当月に振替履歴のない顧客の欄にもパターンが返ってきてしまいます。 下記を教えていただきたいです。 (1)(1)のような状態になる理由と解決法 (2)この場合に使用するのに最適な式 説明が長くなり、またうまく状況を説明できず申し訳ございません。 本当に困っています。ご回答よろしくお願いいたします。

  • SUMPRODUCT関数について

    Excelで=SUMPRODUCT(A1:F1*(MOD(COLUMN(A1:F1),2)=1))という式をIEで検索し使用していますが、なかなか意味がわかりません。 (MOD(COLUMN(A1:F1),2)=1)というところは、列を番号として2で割ったときに1余る列番号を求めているのはわかるのですが、 =SUMPRODUCT(A1:F1*というところが、なぜA1:F1を掛けているのか、どうしてそれで正常な奇数列の和が返ってくるのかがなかなか理解できません。どなたかわかりやすく教えていただけないでしょうか?

  • SUMPRODUCT関数の疑問

     ExcelでSUMPRODUCT関数を条件付きの合計を求めるのによく使っていますが、理解できない動作があります。  仮にA,B,Cが配列、b,cが定数として、A=aかつB=bの場合のCの合計を求めるものとします。 <式1>SUMPRODUCT((A=a)*(B=b)*C)→正しい計算結果 <式2>SUMPRODUCT((A=a)*(B=b),C)→正しい計算結果 <式3>SUMPRODUCT(A=b,B=b,C)→ゼロ <式4>SUMPRODUCT(1*(A=a),1*(B=b),C)→正しい計算結果  3つともすべて同じ計算結果が出てくると思いきや、<式3>だけが何故0になるのかが理解できません。  私は、理由が分からず、腑に落ちないまま<式1>の方法を使っています。  これは仕様上の問題なのか、詳しい理由が分かる方がいれば、解説をよろしくお願いします。  なお、私はExcel2000を使っていますが、Excel2002ではどうなるんでしょうか。

  • SUMPRODUCT関数について

    こんにちわ! 以前にSUMPRODUCT関数を教えていただいたのですが、またわからないポイントが出てきてしまいましてどなたかお教えください。 【例】     A列     B列    C列 1    担当者  オーダー日   カテゴリ 2   A子   2007/9/5   b a 3   B美   2007/9/6   cd 4   C男   2007/9/7   cg 5   D輔   2007/9/7   cv 6   E司   2007/9/5   ca 7   A子   2007/9/7   cv 8   ・      ・     ・ 9   ・     ・     ・ そして別の場所<A12>に 昨日のオーダー =TODAY()-1 という計算用の式を作成し、 次のような式を作成しました。 【式1】 SUMPRODUCT(($A$3:$A$10="A子")*((TEXT($B$3:$B$10,"ymd")=TEXT($A$12,"ymd"))*($C$3:$C$10="cv"))) さらに検索したい項目があり、最初次のように式をまず作成してみました。 【式2】 =SUMPRODUCT(($A$3:$A$10=""A子"")*((TEXT($B$3:$B$10,""ymd"")=TEXT($A$12,""ymd""))*($C$3:$C$10=""cv""))) +SUMPRODUCT(($A$3:$A$10=""A子"")*((TEXT($B$3:$B$10,""ymd"")=TEXT($A$12,""ymd""))*($C$3:$C$10=""ca""))) +SUMPRODUCT(($A$3:$A$10=""A子"")*((TEXT($B$3:$B$10,""ymd"")=TEXT($A$12,""ymd""))*($C$3:$C$10=""ba"")))" 『長い!』と思い、この式を短くしようと、 【式3】 SUMPRODUCT(($A$3:$A$10="A子")*((TEXT($B$3:$B$10,"ymd")=TEXT($A$12,"ymd"))*(OR(($C$3:$C$10="cv"),($C$3:$C$10="ca"),($C$3:$C$10="ba"))))) という式を作成したところ全然ダメでした。 【式2】を簡素化することは可能でしょうか? どうぞ宜しくお願いします。 余談として・・・ 更に、もし可能であれば、他の関数と組み合わせるにはどこに気を付けたらよいのでしょうか?たとえばAND・IF・VLOOKUPなど ・・・こちらはただの興味ですのでご返答は無くてもかまいません。

  • VLOOKUP関数が#N/Aで使えません

    こんにちは。 エクセルで表を作っています。 VLOOKUP関数を使いたいのですが、エラー#N/Aが出て使えません。とてもシンプルな式なのに、何がだめでできないのか全く解かりません。 式は、=VLOOKUP(C3&D3,A7:D12,4,FALSE)です。 ちなみに、=VLOOKUP(C2,B7:D12,3,FALSE)にはちゃんと反応して数値を返してくれます。違いは検索値だけなのですが、数字になっているので、文字列に指定もしました。違うセルで=C3&D3は返してくれています。 何がいけなくてできないのか、教えていただけると助かります。 よろしくお願いします。

  • VBAでVlookupを使って

    いつもお世話になっています。 VBAで現場検索登録シートと言うところに 一覧シートからVlookupを使って 表示させようと思い作りました。 エラーも何もでません。 ただ、表示されるものがちゃんと検索されるものと まったくされないものがあります。 Vlookupはマクロの記録から作ったものです。 原因がわかりません。 よろしくお願い致します。 '検索ボタン Private Sub CommandButton6_Click() '送り方 Range("C4:D4").Select ActiveCell.FormulaR1C1 = "=VLOOKUP(R2C5,一覧!R5C1:R2000C54,22,FALSE)" Selection.Value = Selection.Value '封筒 Range("C5:D5").Select ActiveCell.FormulaR1C1 = "=VLOOKUP(R2C5,一覧!R5C1:R2000C54,23,FALSE)" Selection.Value = Selection.Value '得意先名ふりがな Range("C6:F6").Select ActiveCell.FormulaR1C1 = "=VLOOKUP(R2C5,一覧!R5C1:R2000C54,6,FALSE)" Selection.Value = Selection.Value '得意先名 Range("C7:F8").Select ActiveCell.FormulaR1C1 = "=VLOOKUP(R2C5,一覧!R5C1:R2000C54,4,FALSE)" Selection.Value = Selection.Value '現場名ふりがな Range("C9:H11").Select ActiveCell.FormulaR1C1 = "=VLOOKUP(R2C5,一覧!R5C1:R2000C54,9,FALSE)" Selection.Value = Selection.Value '現場名 Range("C10:H11").Select ActiveCell.FormulaR1C1 = "=VLOOKUP(R2C5,一覧!R5C1:R2000C54,7,FALSE)" Selection.Value = Selection.Value End Sub エラーも何もなく、ちゃんと動くことは動きます。 検索結果が、検索コードによって違うのです。 よろしくお願い致します

  • EXCEL VBA で VLOOKUP的な機能

    お世話になります =VLOOKUP($G6,マスタ2!$A$2:$F$27,2,FALSE) で値を取得できる状況で それを$G6が変更されたイベントで値をセルにセットするようにしたいのですがどのようにすればいいでしょうか? 複数人でコピー&ペーストしたりするので セルに式を埋め込まずに実現したい事情があります。 よろしくお願いします。

  • VLOOKUP関数について

    VLOOKUP関数についてですが、検索値が複数ある場合 例) =VLOOKUP(c2,Sheet1!$A$3:$A$1687,3,FALSE) 例えば、検索値c2の箇所が複数あった場合は、範囲指定と同様に選択範囲で囲むとよいのでしょうか? またその時に、絶対参照(F4)をした方がよいのでしょうか? よろしくお願いいたします。

専門家に質問してみよう