配列関数を使って判定数字に基づいてOKを返す方法

このQ&Aのポイント
  • 配列関数を使用して、判定数字に基づいて「OK」を返す方法を教えてください。
  • 現在、セル"O1"に以下の式を入力しています: =IF(OR(LEFT(C1,4)="0004",LEFT(C1,4)="0010",LEFT(C1,4)="0044",LEFT(C1,4)="0061"),"OK","")。この判定数字が増減する可能性があるため、参照する場所を変える方法を知りたいです。
  • P2以降の2行目に0004、0010、0044、0061などの判定数字を配置し、「OK」を返す方法を教えてください。
回答を見る
  • ベストアンサー

配列関数を教えてください

セル"O1"(オー列1行目)に =IF(OR(LEFT(C1,4)="0004",LEFT(C1,4)="0010",LEFT(C1,4)="0044",LEFT(C1,4)="0061"),"OK","") と入れています。 C列の先頭4バイトが 0004、0010、0044、0061 の時に「OK」を返したいのです。 今後、この判定数字が増えたり減ったりするので どこかに置いておいてそこを参照する形式に変えたいです。 配列を使えば何とかなると思うのですが、 どうすればよいのですか? 置く場所は P2以降の2行目です。 P2に0004 Q2に0010 R2に0044 S2に0061 ・ ・ ・ Z2 といった具合です Z2 まで入ることを前提に教えてください。

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

  • ベストアンサー
  • maruru01
  • ベストアンサー率51% (1179/2272)
回答No.3

こんにちは。maruru01です。 あるなしだけなら、COUNTIFでいいと思います。 =IF(COUNTIF($P$2:$Z$2,LEFT(C1,4)),"OK","") ちなみに、P2以降への入力は、予めセルの表示形式を「文字列」にしておかないと、頭の「0」が取れたり、数値として入力されてしまって、うまく検索出来ないことがありますよ。

harukabcde
質問者

お礼

出来ました ありがとうございます。 countifで、カウントする方法とは気づきませんでした。 注意事項もありがとうございます。 しかも、$付きで書いてくださって。 助かりました!!

その他の回答 (2)

  • moon_piyo
  • ベストアンサー率60% (88/146)
回答No.2

=IF(ISERROR(MATCH(LEFT(C1,4),P2:Z2,0)),"","OK")

harukabcde
質問者

お礼

出来ました。 ありがとうございます MATCHかぁ なるほど。

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

HLOOKUPかな? =IF(ISERROR(HLOOKUP(LEFT(C1,4),P2:Z2,1,FALSE))=FALSE,"OK","") 関数の詳細はヘルプを見てください。

harukabcde
質問者

お礼

出来ました。 ありがとうございます HLOOKUPで検索する方法とは、気づきませんでした。 なるほど。

関連するQ&A

  • エクセルの配列関数の制限について

    エクセルの配列関数の制限について V列にX列・Y列・Z列・AA列・AB列・AC列・AE列・AG列・P列を参照した配列関数を 下のように入力しています。 {=SUM((Y$1:Y$500=F7)*(Z$1:Z$500=H7)*(AA$1:AA$500)*(P7="○"),(AB$1:AB$500=F7) *(AC$1:AC$500=H7)*(AE$1:AE$500=H7)*(AG$1:AG$500)*(P7="×"))} このY列・Z列・AA列・AB列・AC列・AE列・AG列は、ぞれぞれ200行くらいしか 文字が入力されていない場合には、配列関数の結果がうまく表示されました。 これらのセルの200行以降から300行・400行と項目を増やしていったところ、 配列関数の結果がうまく表示されないセルが出てきました。 これは、配列関数の参照するセルに制限があるということでしょうか?

  • sumif関数とif関数と配列の使い方

    例えば、下記のように9行×3列のデータがあり、1列目が123かつ2列目がcであるものについて3列目を合計したいのですが(つまり300+600で900を算出する)、1セルに値を算出する方法があれば教えてください。 sumif関数とif関数と配列を使えばできそうな気がするんですが、やり方がよくわかりません。よろしくお願いします。 123  a  100 123  b  200 123  c  300 456  a  1000 456  b  2000 456  c  3000 123  a  400 123  b  500 123  c  600

  • ExcelのVLOOKUP関数でわからないことが・・・

    N   ┃O       ┃P     ・・・   X   ┃    Y┃ Z 車番 ┃乗務員コード┃運転手 ・・・乗務員CD┃運転手┃車番 上記のような構成の表を作ってあります。 O列に数字を入力した時点で、N列・P列の両方がいっぺんに出るような関数を入れたいと言うのが目標です。隣のX列~Z列はその参照する表です。P列に =IF(O3="","",IF(O3=VLOOKUP(O3,$X$1:$X$202,1),VLOOKUP(O3,$X$1:$Y$203,2),#REF!)) と言う関数により片方はできました。Oに数字を入力した時点でP列には運転手の名前がちゃんと出ます。問題は隣の車番でして、同じようにO列の乗務員CDを参照させてVLOOKUP関数を設定したのですが、値を返してくれないどころか、Enterを押すと数式がそのままセルに表示された状態になってしまいます。ちなみにN列に打った関数は =IF(O3="","",IF(O3=VLOOKUP(O3,$X$1:$Y$202,2),VLOOKUP(O3,$X$1:$Z$203,3),#REF!)) です。しかももっとわからないことに、他にも同じ作業をさせているセルがいくつかあるのですが、唯一ココだけができないと言うことです。これはどうすれば良いのでしょうか? 下手な質問で申し訳ありませんが、これでわかる方がいましたら、是非、是非力を貸してください! よろしくお願いします。

  • 関数のパラメータに配列を渡すときは、非参照型が普通なんですか?

     LippmanのC++プライマー(第4版)を勉強中です。 p.274以降に、配列に作用する関数の定義法と使用法に関する解説があり、p.275に以下の記述があります。 ■配列アーギュメント  配列パラメータも参照型と非参照型がある。  普通、配列は非参照型にする  非参照型パラメータは対応するアーギュメントのコピーで初期化される。配列アーギュメントはその配列の先頭要素へのポインタであり、そのポインタがパラメータにコピーされる。関数はアーギュメントのポインタを変更することはないが、パラメータのポインタを使って配列要素を変更することはできる。 ■配列を参照で渡すこと  配列パラメータを配列への参照にすることもできる。パラメータが配列への参照である場合、コンパイラは配列アーギュメントをポインタに変換しない。配列への参照そのものを渡す。この場合、配列の大きさはパラメータの型の一部である。コンパイラは配列アーギュメントの大きさがパラメータの大きさに一致するかどうかチェックする。 しかしp.268の「ヒント」には以下のように記されています。 ヒント:  Cの素養があるC++プログラマはアーギュメントにアクセスするためにポインタを渡すことに慣れている。 C++では、参照パラメータを使うのが安全かつ自然である。  配列パラメータも参照で渡したほうが、ポインタをコピーしないですむし、配列の大きさを越えてアクセスすることによる実行時エラーも抑止できるので、いいように思いますが、なんで「普通、配列は非参照型にする」んでしょうか?

  • IF関数で出来ないのかな?

    E13のセルにa,i,u,e,oが入力されたら、AA2:AA28から参照してZ2:Z28を現す事は以下の式でやっとこさ出来ました。 =IF(E13="a",(LOOKUP(E13,AA2:AA28,Z2:Z28)),IF(E13:E13="i",(LOOKUP(E13,AA2:AA28,Z2:Z28)),IF(E13="u",(LOOKUP(E13,AA2:AA28,Z2:Z28)),IF(E13="e",(LOOKUP(E13,AA2:AA28,Z2:Z28)),IF(E13="o",(LOOKUP(E13,AA2:AA28,Z2:Z28)),""))))) が!!! 今度はその逆でE13のセルにa,i,u,e,o以外が入力されたらAA2:AA28から参照してZ2:Z28を現す事が出来ません!! NOT関数で出来ると思って以下の式を作ったんですけど、 =IF(NOT(E13="a"),(LOOKUP(E13,AA2:AA28,Z2:Z28)),IF(NOT(E13="i"),(LOOKUP(E13,AA2:AA28,Z2:Z28)),IF(NOT(E13="u"),(LOOKUP(E13,AA2:AA28,Z2:Z28)),IF(NOT(E13="e"),(LOOKUP(E13,AA2:AA28,Z2:Z28)),IF(NOT(E13="o"),(LOOKUP(E13,AA2:AA28,Z2:Z28)),""))))) これだと何故かa,i,u,e,oを含め全てで参照して表してしまいます。 また他にも IF(C13="i",IF(C13="u",IF(C13="e",IF(C13="o","",(LOOKUP(C13,AA2:AA28,Z2:Z28))),(LOOKUP(C13,AA2:AA28,Z2:Z28))),(LOOKUP(C13,AA2:AA28,Z2:Z28))),(LOOKUP(C13,AA2:AA28,Z2:Z28))), (LOOKUP(C13,AA2:AA28,Z2:Z28))) というようにNOT関数を使わずに"真"と"偽"逆にしてみたんですけど 結果はNOT関数と同じでした。 なぜ?分らない・・・。 とりあえずa,i,u,e,o以外が入力されたらAA2:AA28から参照してZ2:Z28を現す方法を教えて下さい。 そして余裕があれば、NOT関数と"真"と"偽"逆にした時に全てで参照して表してしまうのかも教えて欲しいっす!! ちなみにE13=MID(B3,2,1)となっていて、B3にある文字列から一文字抜いた状態です。

  • エクセル関数 Vlookupと配列数式(とsumif)の違い、利点不利点

    以下のような設定でvlookupと配列数式とifを組み合わせた場合の結果が異なる(ことがある?)んですが、原因を教えていただけないでしょうか。あと、配列数式のここが便利!(このvlookupの類似機能に限ったことではない)というものがあれば付随して教えてくださると助かります。 A1:A3 に順に1,2,3と(参照される側の)インデックスが入力されている。 B1:B3 はa,b,cと文字が入力されている C1:C3 には2,2,3と(参照する側の)インデックスが入力されている。 C列のインデックスにより、A列のインデックスに対応するB列の文字列を引いてきたいとき、普通はvlookupで、 <セルD1>=vlookup(C1,A1:B3,2,0)などとすると思います。 これを配列数式を用いて、 <セルD1:D3>= if(C1:C3=A1:A3,B1:B3,0) として同じことをしようとしても、何故かD1セルのみ=0となってしまいます。何故でしょうか?配列数式にそれほどくわしくありませんが、利用価値が非常に高そうなのでわからないことを解明したいのです。 (sumifもタイトルにいれたのは、B1:B3が文字列ではなく数値ならば、同じことをsumifで表現できるから、それだけの理由です) 宜しくお願いします。

  • Excelで関数同士のネストのやり方について

    Excel2003で下記のようなことがしたいのですが インターネット等を見たりしていますが どうしても分からないので質問します。 -------------------------------------        B列    C列   D列 1行目  0.978205321 成功  97 2行目  0.886081752 成功   87 3行目  0.553482324 失敗  56 4行目  0.05331816 失敗    6 5行目  0.562187845 失敗  1 ------------------------------------- 上記表にて IF関数でD列、1~5行目の中に1がある場合、 1のあるセルの隣(左側) 左列のC列の"失敗"と表示させたい場合 「IF関数とレフト関数を組み合わせてネストすれば 良いのでしょうか? その場合入れ子のやり方はどうしたら良いのでしょうか? =IF(D5:D9=1,LEFT(C:C,2))だと計算式自体意味不明となってしまうので、 関数もしくはVBAを使うとどのようなネスト関数/プログラムになるのか 教えていただけませんか? なにとぞ説明不足なこんな愚かで無知な私どもに ご教授宜しくお願いします。

  • 複数の条件を満たすセル数の合計は配列関数を使う?

      A列 B列 ------------- 1  1  2 2  1  1 3  3  5 4  1  7 5  4  8 6  1  4 7  7  5 8  5  6 9  1  1 10  9  3 上記の表でA列もB列も“1”であるセルの数を数えたいのです。 C列の1~10行目に   =IF(A1=1,IF(A1=B1,1,0),0) と計算式を入力・コピーしその合計を求めることができますが、 計算用の列を作らず、別のシート上のセルに 計算結果のみ表示させたいと思っています。 {=SUM(IF(Sheet1!A1:A10=1,IF(Sheet1!B1:B10=1,1,0),0))} 上記の計算式で一応計算できているようなのですが、 配列関数というのがなんなのか良く分からないのです。 これで大丈夫なのでしょうか? お詳しい方ご助言をお願いします。

  • Excel2003、配列から、複数の条件一致する行のデータを取り出す方

    Excel2003、配列から、複数の条件一致する行のデータを取り出す方法 配列は最大で10行、10列程度ですが、このデータはリアルタイム(0.5秒間隔)で更新されますので、 分類等はできません。 A列のデータがZ1のセルのデータと一致し、かつ、B列は、特定の”文字列”と一致し、かつ、C列は数量で、0より大きい(負のデータは無いが、""はあり得る)という条件に合致した行があったら、その行のD列の値をZ2のセルに格納したい。 条件に合致する行は複数あり得るが、そのときは最初に条件が合致した行のデータが必要。 いくつかの関数を調べましたが、つまづいています。

  • 行ごとに判定するマクロについて教えて下さい

    行ごとに判定するマクロについて教えて下さい。 下記のようなマクロで、添付ファイルのように、行ごとで E列からN列で違った数値がないか、入力されていないセルがないかを調べ 4つすべてのセルが同じ数値でない場合は塗りつぶしはされず O列にOKを表示しないようなマクロを組みたいのですが 現在のマクロだと、行ごとではなく、E3~N102セルまでの中で 同じ数値がないかを判断してしまっているため K11セルやK15セルのように数値が入力されていないにも関わらずO列の部分にOKが出てしまいます。 他の行に同じ数値が入っているのは関係なしにして 11行目なら11行目だけで 15行目なら15行目だけで、というように行ごに判定していくには どのようにすればいいでしょうか? Sub 判定マクロ回転() Dim i As Integer, j As Integer Range(Cells(3, 15), Cells(102, 15)).ClearContents For i = 3 To 102 For j = 5 To 14 Cells(i, j).Interior.ColorIndex = 0 If WorksheetFunction.CountIf(Range("E3:N102"), Cells(i, j)) > 3 Then If Cells(i, j).Row Mod 2 = 1 Then Cells(i, j).Interior.ColorIndex = 6 Cells(i, 15) = "OK" Else If Cells(i, j).Row Mod 2 = 0 Then Cells(i, j).Interior.ColorIndex = 40 Cells(i, 15) = "OK" End If End If End If Next j Next i If WorksheetFunction.CountIf(Range("O3:O102"), "OK") > 99 Then MsgBox "データチェックOK(^O^)b" End If End Sub

専門家に質問してみよう