• ベストアンサー

エクセル関数で

ある特定のセルに、そのセルが存在する行の一番右端の特定の記号(たとえば「○」印)を特定して、そのセルが存在する列の上に存在する特定のセルの値を表示させる方法をおしえて下さい。 12        ↑ セル→→→→→○ ・・・一番右端(○は複数存在) ↑ (12)と表示させたい。

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

  • ベストアンサー
  • shiotan99
  • ベストアンサー率68% (140/203)
回答No.7

No.5です。 > △や×は無視して、いちばん右の○の場合でしたので、 ‥ということは、この式↓の説明をすればいいのでしょうか? =IF(COUNTIF(B4:K4,"○"),INDEX($B$3:$K$3,,MAX(IF(B4:K4="○",COLUMN(B4:K4)-1,""))),"") COUNTIF 関数や INDEX 関数はご存知だという前提で要点だけ説明します。 ★ 試しに新規シートに次のように入れてみてください。 B1セルに 2005/11/1 と入力して、F1セルまで右にフィルコピー 2行目は C2 と E2 セルだけに ○を入力 B3セルに =IF(B2="○",COLUMN(),"") と入れて、F3セルまで右にフィルコピー 結果は、C3に 3、E3に 5‥つまり2行目に ○を入力した C列とE列だけに数字が入ります。 COLUMN 関数は指定したセルの列番号を返す関数です。列番号というのは、A列が1、B列が2、C列が3‥なので、=COLUMN(A1) なら 1が、=COLUMN(C1) なら 3が返ります。 =COLUMN() のように( )内の引数を省略すれば、COLUMN関数を入力したセルの列番号が返ります。 C3に 3、E3に 5と表示される理由がおわかりになりましたでしょうか? 2行目のいちばん右にある○の位置は、3行目の数値の最大値( 上の例では 5 ) が取得できればわかります。 あとは INDEX関数を使って、B1:F1の日付のうち、5番目の日付を参照すればいいわけですが、5番目というのは A列から数えて 5番目ですから、そのままでは 1コずれてしまいます。 5 から 1を引いて 4番目‥B列から数えて 4番目の E1セルの日付を参照すればいいことになります。 ★ A2セルに =INDEX(B1:F1,,MAX(B3:F3)-1) と入れてみてください( フツーに Enterです )。3行目のデータを利用して、いちばん右に○が入っている列の日付を表示します。 このように作業用に1行使えば、これだけの数式で目的の日付を表示させることができます。 ★ 下の A3セルに =INDEX(B1:F1,,MAX(IF(B2:F2="○",COLUMN(B2:F2)-1,""))) と入れて、これは配列数式ですから Ctrl+Shiftキーを押しながら、Enterで確定してみてください。3行目のデータは使っていませんが、A2セルの数式と同じ結果になるはずです。 ◆ 前置きがすごく長くなりましたが、配列数式なら作業用の行を使わなくても、上の 3行目でやっているようなことを、エクセル内部でやってくれるということです。 IF(B2:F2="○",COLUMN(B2:F2)-1,"") の部分で B2 が ○なら COLUMN(B2)-1 つまり 1、○でなければ空白("")、 C2 が ○なら COLUMN(C2)-1 つまり 2、○でなければ空白("")、 ・ F2 が ○なら COLUMN(F2)-1 つまり 5、○でなければ空白("")、 というデータを、B2:F2まで順に見て、エクセル内部のメモリに格納しています。 上の例では C2 と E2セルにしか ○は入っていないので、{"",2,"",4,""} という配列データが格納され、その中の最大値4 を MAX関数で取得します。 あとは( くり返しになりますが )、INDEX関数を使って、B1:F1の中の 4番目の日付を参照しています。 ◆ 配列数式について詳しくは↓の参考URLをご覧ください。 わかりやすく解説してあります。

参考URL:
http://pc21.nikkeibp.co.jp/special/hr/
ryu1961
質問者

お礼

今PCで実際に例題をやってみました。配列の考え方がとても良く理解できました。感動しました! 本当に、どうもありがとうございました。

ryu1961
質問者

補足

ものすごくよく分かりました。shiotan99さんは、ものを教えることの天才ですね!!shiotan99は、エクセル関数をどのような教科書で学ばれたのですか?もし差し支えなければ教えて頂けませんでしょうか・・・。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (7)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.8

こんばんは。 #6のWendy02です。私が書いたのは、そのご質問を明らかにしたいわけで、サンプル図を載せて、自分の理解が合っているのか確かめたかったからです。 それが結果的に、数式が合っているかどうかも、分るわけです。式の解説をいくらお話しても、それは、結果如何でしかありません。元が間違えば、何もなりません。 #7さんで解説がありますので、直接の内容には触れませんが、「配列数式」については、私個人としては、VBAの基礎レベルよりも、はるかにむつかしいと思います。 多くの人の発見や多くの経験から導き出された定石のようなものから組み立てる数式だと思います。ただ、伝家の宝刀のような配列数式も、有効なようでいて、配列数式は、その割には、限られたスペースの掲示板の中だけで、実務上は、あまり使う必要がないテクニックかとも思います。私は、VBAが中心ですが、ここらあたりは、隔靴掻痒というところですね。VBAで同じことは出来ます。しかし、VBAでは、どんなにがんばっても、組み込み関数を越えることは出来ませんからね。 >どの点で異なるのでしょうか? ひとつだけ大きく違うのは、配列確定をしない、ということです。配列確定は、仮想メモリをそのセルに取り、計算領域を作ります。私のも構造的には同じですが、それをアプリケーション側に直接渡さないで、もう一度、Index関数のバッファを作って、そこで計算しなおしています。

ryu1961
質問者

お礼

Wendy02さん、こんばんわ。 サンプル図は、まさに私の質問の内容そのものです。丁寧な解説、どうもありがとうございました。私の印象ではVBAは最強で、なんでもできると思っていました。VBAも配列もどちらも難しくまるで違う世界のもののようです。また分からないことがありましたらよろしくお願い致します。ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.6

こんにちは。 回答者さんたちが、そのつど確認しているようですが、元のご質問の内容に具体性が乏しいようです。もう少し、具体的で正確な情報を与えるようにすれば、正解に早く至るような気がしますね。 #2の回答に対する補足 >上側の特定のセルのデータは日付データです。 質問事項は、後だしではなくて、最初に出してくださいね! 表例:(IE画面は広げてご覧ください)   A   B    C     D    E    F    G 1    11/01  11/02  11/03  11/04  11/05  11/06・・ 2 11/5       ○        ○    ○ 3 11/4                ○ 4          △        × 5 11/6   ○                     ○ 6 11/5       ○    ○    ×    ○ 7 11/3            ○   ↑  書式は、日付書式を使ってください。 (掲示する時のレイアウトの調整は、全角空白「 」を使ってください。) A2の式は、 =IF(COUNTIF(B2:AF2,"*○*"),INDEX($B$1:$AF$1,,MAX(INDEX(COUNTIF(OFFSET($A2,,ROW($A$1:$A$31)),"*○*")*ROW($A$1:$A$31),,))),"") ということになるかなって思います。 ※「*○*」 は、入力時に空白などなければ、「○」でよいです。

ryu1961
質問者

補足

ご回答ありがとうございます。また、質問の内容が具体的でなく申し訳ありません。今後注意致します。 勉強のためにおしえて頂きたいのですが、NO5の方の式(=IF(COUNTIF(B4:K4,"○"),INDEX($B$3:$K$3,,MAX(IF(B4:K4="○",COLUMN(B4:K4)-1,""))),""))とはどの点で異なるのでしょうか?レベルが低くて申し訳ありません。よろしくお願いします。

全文を見る
すると、全ての回答が全文表示されます。
  • shiotan99
  • ベストアンサー率68% (140/203)
回答No.5

こんにちは~ 同じ行に○は複数あるんですよね。 ○が複数ある場合、No.4さんの数式だとうまくいかないと思うのですが‥ ( 右端ではなく、左端の○を検索しますから ) それと、同じ行に △とか×も混在していますが、○だけが対象なのでしょうか? 要は↓が不明です。 ・記号が○とか△に関係なく、いちばん右端の記号を検索するのですか? それとも、△とか×は無視して、いちばん右の○を検索するのですか? ・記号はすべて手入力ですか、それとも数式を使って表示しているのですか? ********** 日付データが B3:K3、記号が B4:K4の範囲内にあるとします。 下の中から該当する数式を A4セルに入れてみてください。 ( コピー&ペーストしてください ) ********** ■ ○とか△に関係なく、いちばん右端の記号の場合 ◆記号は手入力 =INDEX($B$3:$K$3,,MATCH("*",B4:K4,-1)) または、記号が1つも入力されていない場合のエラーを非表示にするなら =IF(COUNTA(B4:K4),INDEX($B$3:$K$3,,MATCH("*",B4:K4,-1)),"") ◆記号は数式を使って表示させている( 空白は、数式の"" を使っている場合 ) =INDEX($B$3:$K$3,,MAX(INDEX((LEN(B4:K4)>0)*COLUMN(B3:K3)-1,0))) または、記号が1つも表示されていない場合のエラーを非表示にするなら =IF(COUNTIF(B4:K4,"*?"),INDEX($B$3:$K$3,,MAX(INDEX((LEN(B4:K4)>0)*COLUMN(B4:K4)-1,0))),"") ★ COLUMN(B2:K2)-1 の -1は、データが B列から始まっている場合です。C列から始まっていれば -2、D列から始まっていれば-3、‥のようにしてください。 ********** ■ △や×は無視して、いちばん右の○の場合 =IF(COUNTIF(B4:K4,"○"),INDEX($B$3:$K$3,,MAX(IF(B4:K4="○",COLUMN(B4:K4)-1,""))),"") と入れて、配列数式ですので Ctrl+Shiftキーを押しながら、Enterで確定してください。 数式が{ }で囲まれたらOK ★ 囲まれなかったら NGですので、F2キーを押して編集モードにしてから、もう一度Ctrl+Shiftキーを押しながら、Enterで確定してください。 ( 配列数式はこの式だけで、これ以外はフツーに Enterで確定です ) ★ COLUMN(B2:K2)-1 の -1は、データが B列から始まっている場合です。C列から始まっていれば -2、D列から始まっていれば-3、‥のようにしてください。 いずれの数式も、必要なだけそのまま下にフィルコピーすればOKです。 数式を入れたセルの表示形式は、《日付》にしてください。 範囲は、実際の表に合わせて変更してください。 補足される場合は、できるだけ具体的にお願いします。 データがどの列からどの列まであるのか、など。 また、上記数式でうまくいかなかった場合、どの数式を入力したのか、そのままコピーして提示してください。

ryu1961
質問者

補足

どうもありがとうございました。△や×は無視して、いちばん右の○の場合でしたので、そのまま試してみましたところうまくいきました。向学のために簡単に解説をいただけないでしょうか?よろしくお願い致します。

全文を見る
すると、全ての回答が全文表示されます。
  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.4

#3の補足に答えて A4:K20までの範囲に○が1行あたり、1つ入っているとします B3:K3まで日付けが入っているとします。 L4に =IF(ISERROR(MATCH("○",A4:K4,0)),"",INDEX($A$3:$K$3,0,MATCH("○",A4:K4,0))) と入れて、L20まで式を複写します。 L4:L20に○の列の第3行目の日付が入ります。 MATCHで○の第何列数(仮にX)を求め、INDEXで、だい3行目(0)の第X列のセルの値をとってきてます。

全文を見る
すると、全ての回答が全文表示されます。
  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.3

特定の記号を「○」と仮定します。 >セルが存在する列の上に存在する特定のセルの値 を直上(同列の接してすぐ上)のセルと解します。 例データ F1=あ、F2=○ E2=い、E3=○ 第4行目=空白 C5=う、C6=○ とします データはK列までしか入らないとして L2セルに式 =IF(ISERROR(MATCH("○",A2:K2,0)),"",(INDEX($A$1:$K$20,ROW()-1,MATCH("○",A2:K2,0)))) と入れて、下方向に式を複写します。 L2=あ、L3=い、L4=空白、L5=空白、L6=う となりました。 こういうので良いでしょうか。

ryu1961
質問者

補足

凄いですね。こういう感じです。ただ、あ、い、う、は、○の直上ではなくて、○のあるセルの列の三行目という指定にしたいのですが(あ、い、う、は日付で右一列に並んでいます)。また、表示は左側にするのですが、どこを変えればいいのでしょうか?

全文を見る
すると、全ての回答が全文表示されます。
  • odessa7
  • ベストアンサー率52% (101/192)
回答No.2

 ご質問で確認したいことがあるのですが、下記のようなことをしたいという意味でよろしいのでしょうか?   10 5 7 22 10 12 P △ × × ◎ △ ○  ↑この例で言うと、Pの場所に「6」を表示させる。  もし、上記の意味の場合、最後の○の左側のすべてのセルには、必ず何かの記号が入力されていますか?

ryu1961
質問者

補足

補足させて頂きます。 お示しの例の場合で、Pの場所に、一番右側の○について、その上側の特定のセルの値を示したいのです。上側の特定のセルまでは何も記号がない場合もあります。また、最後の○の左側のセルには記号が入力されていない場合があります。 ちなみに、上側の特定のセルのデータは日付データです。   1 2 3 4 5 6 7 8 9 A D P __△_○__○ F ___×____○ 上の例では、Pの上のデータの8、Fの上のデータの9をひょうじしたいのです。よろしくお願い致します。

全文を見る
すると、全ての回答が全文表示されます。
  • hanada087
  • ベストアンサー率64% (115/177)
回答No.1

うーん。文章だけだとキツイですね。(^^; 取り敢えず自分だったらこう↓します。 ■ まず、=right(セル,1) ってすると、そのセルの文字列の一番右の1文字だけ抜き出せます。これを邪魔にならない行に入れてズラーっとコピーします。(これを仮に「セルB」とします) >>この段階で、セルの右端が○なら”○”って表示させることができます。 ■次に、また邪魔にならないところに、 =if(セルB="○",[12が入ったセル],"") って入力します。[12が入ったセル]のところは絶対参照にしておきます。例えばA1っていうセルなら、$A$1って入れます。そうやっといてからズラーっとコピーすれば、参照先は全部A1になります。 どうだろうなぁ。(^^; いろいろ応用して探ってみて下さい。頑張ってね。(^^

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • エクセルの関数(抽出)について

      1  2   3   4  5 A   あ   ko   ▲ ■  B   か   sa C   もへ  we D   あ   ty E   てろ   lii F   ぎ   loer G   か   ttg H   あ   rer 上のような表があったときに、A4のセル(▲)に「あ」と入れると、 A5のセル(■)に『rer』と入るような関数(又はそれに代わる方法)を ご教示ください。 やりたいこと: 2列目の中に、▲と完全一致する値(又は文字列。以下同じ。)が存在するとき、 同じ列の3列目の値を返したい。 ただし、2列目には完全一致する値が何度も登場する可能性があり、 2列目に▲と完全一致する値が複数存在する場合は、その内一番下の行 のものを選び、同じ行の3列目の値を■に返したい。 条件: ・可能であれば、2列目をキーにした並び替えなどは行いたくない。 ・現状のデータは、3000行程度のデータ量であるが、今後じょじょに増えていく。 以上です。 説明が明瞭でなく、イメージがお伝えできていないかも知れませんが、 どうかご教示頂きたく、なにとぞよろしくお願い致します。

  • エクセルVBAのコードの書き方を教えてください

    エクセルVBAの初心者です。 下記①-⑲のようなコードを書きたいのですが、どなたかお分かりになる方がいましたら、 ご教示いただけますと幸いです。 ① オートフィルターでシート[list]のA列に"●"がある特定の行だけを以下作業の対象にしたい ② ①で特定した行のE列セルの値を、シート[output]のB9セルにコピペする ③ ①で特定した行のF列セルの値を、シート[output]のB12セルにコピペする ④ ①で特定した行のG列セルの値を、シート[output]のB15セルにコピペする ⑤ ①で特定した行のH列セルの値を、シート[output]のB18セルにコピペする ⑥ ①で特定した行のI列セルの値を、シート[output]のB21セルにコピペする ⑦ ①で特定した行のJ列セルの値を、シート[output]のB24セルにコピペする ⑧ ①で特定した行のK列セルの値を、シート[output]のB27セルにコピペする ⑨ ①で特定した行のL列セルの値を、シート[output]のB30セルにコピペする ⑩ ①で特定した行のM列セルの値を、シート[output]のB33セルにコピペする ⑪ ①で特定した行のN列セルの値を、シート[output]のB36セルにコピペする ⑫ ①で特定した行のO列セルの値を、シート[output]のB39セルにコピペする ⑬ ①で特定した行のP列セルの値を、シート[output]のB42セルにコピペする ⑭ ①で特定した行のQ列セルの値を、シート[output]のB45セルにコピペする ⑮ ①で特定した行のR列セルの値を、シート[output]のB48セルにコピペする ⑯ ①で特定した行のS列セルの値を、シート[output]のB51セルにコピペする ⑰ ①で特定した行のT列セルの値を、シート[output]のB54セルにコピペする ⑱ ①で特定した行のU列セルの値を、シート[output]のB57セルにコピペする ⑲ シート[output]のB3:B59をテキストファイルを呼び出してコピペする ※このとき、上記②-⑱で記述したB9からB57のセルには改行が含まれる場合が  あるため、テキストファイルへのペースト時に""が表示されてしまうが、  もし可能であれば、この""が表示されないようにしたい。

  • エクセル関数について

    エクセル関数について質問です。 簡単に説明すると特定のセルに特定の数値を入力するとその行の別のセルの数値を別のセルに表示させたい。 たとえば     A      B       C 1  100            2  200      1      100 3  300      1      300 4  400 5  合計            400 上記の様になっていた場合 A列は定数で固定です。B列のセルに1と入力(1でなくてもよい)した行のA列の数値を Cに表示したいのですが、 C列にどの様な関数を使ったらいいんでしょうか?宜しくお願い致します。

  • エクセルの関数についての質問です。

    エクセルの関数についての質問です。 画像のように横に1、2、3…(100くらいまで続きます)縦にA、B、Cの行があります(端が切れちゃってますが、A2にA、A3にB、A4にCです) B2から横の列にはそれぞれ☆や○等いろいろな記号が入ります。 そしてこの記号には特定の値が決められています。☆=10、○=5、△=3 B3から横には、B2の記号にそった数字が入ります。(10やら5等) そこまではIF関数で式を作ったのですが、ここからが問題でして… B2から横に1から100まで、記号(B3から横に数字)を入力していった時のB3列の合計が仮に212とします。 合計した値が200を越えてしまった場合、B4からの列に数字を入力するようにしたいのです。 (200ギリギリ前くらいまではB3の列で、それを越える時からB4の列に入力します。その際、B3列に入る数字は消えます) なおかつ可能であれば、このB4からの列に入るのはランダムにできるといいのですが…(画像では○の数字を下ろしていますが、☆の数字をおろしても良いし、△の数字をおろしても良い) ●計算式によって入力された数字(B3列)を特定の数字を越えた場合、別の枠(B4列)に移す関数はありますでしょうか?? ●また、それをランダム(関数)で選ぶことは可能でしょうか?? よろしくお願いします。

  • エクセルの関数を教えて下さい。

    シート1の38列目のセルに、○(丸)印が入力されていて、シート2のセルに、シート1のそのセルが○印なら「合格」、空白なら「空白」と表示させたいです。 ちなみにシート2の他のセルには =VLOOKUP($A$10,"シート1の範囲",56,FALSE)と入力していて、そこはそれでOKなので、同じくVLOOKUPの検査値はA10のままで、○印なら「合格」、空白なら「空白」と表示させるやり方を教えて下さい。 シート1とシート2の行に番号をふって、その番号から検索できるようにしたいです。 分かりにくい文章で申し訳ありません。 どうぞ、よろしくお願い致します。

  • エクセルの関数についての質問です

    エクセルの関数についての質問です 独学でエクセルを勉強しておりますが以下のような表の中から該当する値を返すことは可能でしょうか。 方法はどのようなものでもアドバイスをいただければトライしてみようと思います。 以下のような元データの中から、行の条件と列の条件を満たすセルに表示されている値(%)を 表示させる関数。そもそも関数での解決は不可能かもしれませんが、もし方法があれば ご教示お願いします。       0000~1000  1001~2000  2001~3000 000~100    5%      5%      4% 101~200    4%      4%      3% 201~300    3%      2%      1% 行と列の値を入力するとその交差した値が表示させたい。 例)行の検索したい数値を110、列の検索したい数値を1200と指定した場合、表示させたい数値は"4%"。 ぜひぜひよろしくお願いいたします。

  • エクセル関数で教えてください。

    例えば、A列の1行目からA列の100行目まで社員の名前が重複せずに100人分あります。B列1行目からW列100行目までにランダムに数字が入っています。数字は重複していません。この、数字(例えば5という数字)のセルの場所を特定したいのですが、関数でこの場所を特定する方法を教えていただけませんか? 結果的に必要なのは、5という数字が何行目にあるかだけですので、それだけ分かれば良いのですが。良い方法が見つかりません。 今回はマクロは一切使わない条件です。よろしくお願いいたします。

  • エクセル関数を教えてください

    日時が一致した列の指定したセルの値を 別セルに表示   A    B   C   D 1 7/1 7/2 7/3 7/4 2 256  264 273  286 3   8   7   13 4 5 6 7/3 7 ? A6(日付)と一致した列の3行目をA7に表示させる関数を教えてください。 勉強不足ですみませんがよろしくお願いします。

  • EXCELの関数?について

    セルA1の値と等しい値がB列のセルにあり,セルA2にA1と等しいB列のセルと同じ行にあるC列の値を表示させたいのですが可能でしょうか? わかりにくい説明で申し訳有りませんが・・ 例:下記の場合 A1の内容とB3の内容が等しいため,A2にC3の内容”Z”を表示させたいのですが,A2はどのように設定すればいいのでしょう?  |  A  |  B  |  C  | ---------------------- 1| AAA | AA  |  X  | 2|     | A   |  Y  | 3|     | AAA |  Z  | 4|     |     |     |

  • エクセルでこんな関数は?

    A2:B30に表1があります。 使用者がこのシートに入力するさまざまな条件により、A列がTRUEかFALSEになります。 表1ではA列がTRUEのとき、B列に文字列が表示されるようにB列に式が入れてあります。 A列がすべてTRUEになることはありません。したがってB列の文字列の表示は飛び飛びというか歯抜けのような表になっています。 このB列に表示された文字列を、表2(別シート)に上から歯抜けが無いように2行目以降に順番で表示させたいのです。 考えたのはどこかのセルに =B2&B3&B4&~略~&B30 として文字列をまとめ、(文字列の区切りがわかるように、それぞれの文字列の頭に※印をつけておく)、さらにこれを※印を目標に分割する関数はないか?ということなのですがわかりません。 あるいは他の方法でもかまいません。ただし、表1をおもてに出したくないので表1をソートするやりかたは使えません。 どうかお教えください。お願いします。

専門家に質問してみよう