- ベストアンサー
IF関数で複数の答えを用意するには??
こんにちは。ただ今EXCEL2000である表を作っています。 そこでAの条件であればA'を表示し、Bの条件であればB'、Cの条件であれば… という風にIFに対する答えを幾通りも作りたいのです。 そしてその条件は16個もあるのですが1つのセルに収めるにはどうしたらよいでしょうか。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
長くなるので例として、xで4通り、yで3通りを書いてみました。内容は無茶苦茶です。 If ・・・ Then ・・・ ElseIf ・・・ Else ・・・ End If と Select Case Case ・・・ Case ・・・ End Select を例示しています。 ユーザー定義関数の名前に使った『Hantei』に判定(処理)結果が入ります。 8×16通りでも長くなるだけで特に問題はないと思います。要は場合分けを完全に書くことでしょうか。 ツール→マクロ→Visual Basic Editor でVBE画面に移り、 挿入→標準モジュールで標準モジュールを挿入し、 Public Function ユーザー定義関数名<自分で決めます>(引数1,引数2) のように書いていきます。 シートで使う時は、例では、=Hantei(-2,0) や =Hantei(A1,B1) 、 =Hantei(A1+A2,B1) のようにして使います。 詳しくはHelp等を参照して下さい。 Public Function Hantei(x As Double, y As Double) As Double Application.Volatile '自動再計算関数にする(作り手の選択です) If x < 0 Then Select Case True 'Case の次の判別式が成立すれば次を行う Case y < 0: Hantei = x + 101 Case y = 0: Hantei = 10 * x + 102 Case 0 < y: Hantei = 1000 * x + 103 End Select ElseIf x = 0 Then Select Case True Case y < 0: Hantei = 201 Case y = 0: Hantei = 202 Case 0 < y: Hantei = 203 End Select ElseIf 0 < x And x <= 1 Then Select Case True 'この場合はElseでも同じ Case y < 0: Hantei = x - y + 301 Case y = 0: Hantei = 302 Case Else: Hantei = x + 10 * y + 303 End Select Else Select Case True Case y < 0: Hantei = x ^ 2 + y ^ 2 + 401 Case y = 0: Hantei = 402 Case Else: Hantei = x ^ 2 - y ^ 2 + 403 End Select End If End Function
その他の回答 (5)
- himehime
- ベストアンサー率37% (133/354)
回答じゃないんですが。 関数のネストは、7レベルまで、 引数は、30個までと決まっています。 それから、こういった、はっきりと、 「限度があってできそうもない」とわかっている場合には、 一つのセルに数式を納めよう、 と、考える方がそもそもまちがいだと思いますよ。 複数のセルを利用して、計算式作った方がいいとおもいます。 で、その複数のセルを利用して、 計算式を利用するように発想した方がいいです。 どうしても、一つのセルに納めようとするから、無理が生じます。 一つのセルに納めなければ、 計算式や、値をひっぱってくる方法は、いくらだってありますよね。
- nishi6
- ベストアンサー率67% (869/1280)
Aの条件、Bの条件がどのような内容かで解決方法も色々ありそうです。 (1)連続数値が条件の場合 =Choose(・・・)や 対応テーブルを作って =Index(・・・)を利用 (2)ある範囲に含まれる時に対応する値を返す場合 対応テーブルを作って =VLookUp(・・・) を利用 (3)各条件が複雑な場合や複数の値を条件にする場合 これを1つのセルで行うにはユーザー定義関数が考えられます。 (3-1)場合分けが規則的に分岐していく場合 If (条件A) Then If (条件A-1) Then としたほうが分かりやすい場合もあります。 (3-2)場合分けが値や連続的な場合 Select Case 値 Case 値1: 処理1 Case 値2: 処理2 : のように書けます。(1)のVBA版ですね (3-3)場合分けが複雑な場合 当然、If ・・・ Then ・・・ Else ・・・ で書けます。(2)のVBA版。他に、 Select Case True Case 条件1: 処理1 Case 条件2: 処理2 : のように書けます。Ifよりも分かりやすくなることが多いと思います。 (4)判定をする目的が区分分けして集計したりする目的の場合は、ピボットテーブルや集計機能、フィルタ機能を使えば簡単になる場合があります。 ご参考に。では。
補足
すみません。条件が不足していました。 条件は2つあってこれをAとBで表すと、Aには8通り、Bには16通りあるのです。 だからAかつBでその答えが8×16=128通りの答えを用意しなくてはなりません。 (その答えには数値も計算式もあります) 皆さんの言うようにIFのネストだと数が限られてくるので ユーザー定義の関数を作るのが一番いいのでしょうが これまで挑戦したことがないので不安があります。 日にちもあまりないのでうまく解決できるものか…。 知恵を貸してください。
- kougasha
- ベストアンサー率32% (34/105)
たしか関数のネストは8くらいだったと思う。 それに関数が長くて見づらくなるので、 自分でFunctionを作成して、それをセルで 使いましょう。 Function 多数分岐(値 As Variant) Select Case (値) Case 1 多数分岐 = "壱" Case 2 多数分岐 = "弐" Case 3 多数分岐 = "参" Case Else 多数分岐 = "あてはまらん" End Select End Function 条件や値をメンテナンスする必要が 無いならこれが簡単。
IF(A,A',IF(B,B',IF(C,C',D'))) このようにIFの中にIFを入れ、その中にまたIFを入れる、こういうやり方をネストすると言い、しばしば使われる手法です。上の例は3つネストしていると言います。 ただし、ネストには限界が有るのですが、ヘルプで確かめられると思いますよ。
複数作る場合は以下のように続ければ良いと思います。 =if(セル)=A,A',if(セル)=B,B'・・・・ 式が非常に長くなるのでLOOKUPの方が良いのではないでしょうか?
お礼
ありがとうございました。 少し希望の光が見えてきた気がします。 今からこの例を参考に作ってみたいと思います。 何かまたありましたら補足に助けるかもしれませんが よろしくお願いします。