• ベストアンサー

この関数式の改良法について教えてください。

旅費精算の事務をしているものでして、以下のような状況で急行券の代金を算出するために次の関数式を作りました。 H22繁忙・閑散:日にちが行でグループ分けして書いてあります。 運賃表:繁閑によってプラス200、マイナス200の調整をする駅の名称、路程、乗車賃、急行券等が書いてあります。 運賃表(2):繁閑によってプラス400、マイナス400駅の名称、路程、乗車賃、急行券等が書いてあります。 I列:出発日です。 L列:到着駅です。 =IF(I5="","",IF(COUNTIF(H22繁忙・閑散!$A$1:$H$24,I5)>=1,IF(COUNTIF(運賃表!$A$2:$N$286,L5)>=1,VLOOKUP(L5,運賃表!$A$2:$N$286,5,0)-200,IF(COUNTIF(運賃表(2)!$A$2:$N$286,L5)>=1,VLOOKUP(L5,運賃表(2)!$A$2:$N$286,5,0)-400,"")),IF(COUNTIF(H22繁忙・閑散!$A$25:$H$46,I5)>=1,IF(COUNTIF(運賃表!$A$2:$N$286,L5)>=1,VLOOKUP(L5,運賃表!$A$2:$N$286,5,0),IF(COUNTIF(運賃表(2)!$A$2:$N$286,L5)>=1,VLOOKUP(L5,運賃表(2)!$A$2:$N$286,5,0),"")),IF(COUNTIF(H22繁忙・閑散!$A$47:$H$67,I5)>=1,IF(COUNTIF(運賃表!$A$2:$N$286,L5)>=1,VLOOKUP(L5,運賃表!$A$2:$N$286,5,0)+200,IF(COUNTIF(運賃表(2)!$A$2:$N$286,L5)>=1,VLOOKUP(L5,運賃表(2)!$A$2:$N$286,5,0)+400,"")))))) この関数でできることを変えずに、短くすることはできるでしょうか? そして、2列に分けて処理せずにこの関数式から出された数字が200以下だった場合に、算出しているセルに何も表示させないようにするには、どうすればいいでしょうか? officeのバージョンが2003なのでこれ以上長くするのには限界があるのです。(上記関数式(ここではAAAとします。)とすると、 IF(AAA<200,"",AAA)というような感じで入力しようとしましたが、長すぎてだめでした。) 詳しい方、アドバイスお願いいたします。

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

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

> 意味を教えていただけるとありがたいです。 =if(I5*countif(運賃表!$A$2:$O$286,L5), vlookup(L5,運賃表!$A$2:$O$286,5,0) +vlookup(L5,運賃表!$A$2:$O$286,15,0)*(countif(H22繁忙・閑散! $A$1:$H$24,I5)-countif(H22繁忙・閑散!$A$47:$H$67,I5)), "") まずは =COUNTIF(H22繁忙・閑散!$A$1:$H$24,I5) -COUNTIF(H22繁忙・閑散!$A$47:$H$67,I5) 同じ日付が何度も現れるようなドジを踏んでない限り、繁忙期なら COUNTIF(H22繁忙・閑散!$A$1:$H$24,I5)が1でCOUNTIF(H22繁忙・閑 散!$A$47:$H$67,I5)が0、閑散期ならその逆、通常期ならどちらも 0。ここまでは判りますか。そうすると、COUNTIF(H22繁忙・閑散! $A$47:$H$67,I5)のところはマイナスになっているので、全体では 私の最初の回答に書いた通り、「繁忙期は1、閑散期は-1、通常期 は0」となるわけで、O列に書いてある調整額にかけ算するんです。 =if(I5*countif(運賃表!$A$2:$O$286,L5), vlookup(L5,運賃表!$A$2:$O$286,5,0) +調整額*(繁忙期は1、閑散期は-1、通常期は0), "") vlookup(L5,運賃表!$A$2:$O$286,5,0) これは運賃表で乗車賃を検索しているだけだからいいですね。 =if(I5*countif(運賃表!$A$2:$O$286,L5), 乗車賃+調整額*(繁忙期は1、閑散期は-1、通常期は0), "") if(I5*countif(運賃表!$A$2:$O$286,L5), I5は日付です。excelでは日付は基準日から何日目かという数値に ほかなりません。また、何も入力されてないセルを四則演算に使う と、ゼロとして扱います。countif(運賃表!$A$2:$O$286,L5)はもち ろん運賃表に該当する駅があれば1でなければ0ですね。するとこの かけ算は、日付が入力されていて行き先の駅が運賃表に載っている ときだけ「ゼロではない値」になり、どちらか一方でも欠けるとゼ ロになるんです。そしてExcelの関数では、if関数の条件式などの 論理値TRUE/FALSEがあるべきところに数値を入れた場合、ゼロなら FALSEでそれ以外はTRUEとして扱うことになっています。よってこ こは「日付が入力されていて行き先の駅が運賃表に載ってれば」と いう条件式を不等号もand関数も使わずに書いたんです。 =日付が入力されていて行き先の駅が運賃表に載ってれば, 乗車賃+調整額*(繁忙期は1、閑散期は-1、通常期は0), "") というような式でした。

qazxcvfr4
質問者

お礼

すばらしいですね。 できました。 ありがとうございました。

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

その他の回答 (5)

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.5

こんばんは! 色々アドバイスが出ていますので 重複すると思いますが・・・ 数式を見させてもらうと他の方々が仰っていらっしゃるように「名前定義」すれば数式はもっと短くなると思います。 まず、運賃表Sheetの$A$2:$N$286セルを範囲指定し、 → メニュー → 挿入 → 名前 → 定義 → 仮に「運賃表1」と名前定義します。 (範囲指定後、名前ボックスに直接入力しても構いません) 同様に、運賃表(2)Sheetの$A$2:$N$286セルを範囲指定し、「運賃表2」と名前定義会います。 そして、数式内の「>=1」は省いても同じ結果になると思いますので、 質問そのままの数式は =IF(I5="","",IF(COUNTIF(H22繁忙・閑散!$A$1:$H$24,I5),IF(COUNTIF(運賃表1,L5),VLOOKUP(L5,運賃表1,5,0)-200,IF(COUNTIF(運賃表2,L5),VLOOKUP(L5,運賃表2,5,0)-400,"")),IF(COUNTIF(H22繁忙・閑散!$A$25:$H$46,I5),IF(COUNTIF(運賃表1,L5),VLOOKUP(L5,運賃表1,5,0),IF(COUNTIF(運賃表2,L5),VLOOKUP(L5,運賃表2,5,0),"")),IF(COUNTIF(H22繁忙・閑散!$A$47:$H$67,I5),IF(COUNTIF(運賃表1,L5),VLOOKUP(L5,運賃表1,5,0)+200,IF(COUNTIF(運賃表2,L5),VLOOKUP(L5,運賃表2,5,0)+400,"")))))) と、少しですが短くできると思います。 また、検証したわけではありませんが、 IF関数の真の欄にIF関数をネストされていますので、 IF関数の関数の引数ダイアログボックスの理論式の欄に 「AND」を使用すればもう少し短くなるかと思います。 具体的に実際の表がどのようになっているか判断しかねますので この程度しか書けませんが No.3さんが仰っているように作業列を使い、200・400等を返すような感じにすれば もっと簡素化できるような気がします。 この程度でごめんなさいね。m(__)m

qazxcvfr4
質問者

お礼

丁寧な記述ありがとうございます。 ANDの使用も考えたのですが、ややこしくなって断念しました。 参考にさせていただきます。

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

>officeのバージョンが2003なのでこれ以上長くするのには限界があるのです。(上記関数式(ここではAAAとします。)とすると、 IF(AAA<200,"",AAA)というような感じで入力しようとしましたが、長すぎてだめでした。) 数式の長さやネストの制限にかかるような場合は、数式そのものを名前定義することで制限をこう得ることができます。 今回のケースでしたら、「AAA」にあたる部分を「挿入」「名前」「定義」で「AAA」という名前で元の式を定義して、数式を「=IF(AAA<200,"",AAA)」のようにしてみてください。 今回のように、同じ数式の中で何回も繰り返し出てくる数式や条件は、その数式部分を名前定義すると可読性がよく、式の修正がしやすい数式になります。

qazxcvfr4
質問者

お礼

ありがとうございます。 そういう手があったのですね。

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

まず、運賃表を二つに分けるのをヤメます。で、運賃表にO列を新設 して、200または400と書いておきます。この列に、繁忙期は1、閑散 期は-1、通常期は0をかけ算して足せばいいわけですね。 で、繁忙・閑散表が適切に作ってあれば、countifの結果は0か1にし かなりません。かけ算のためのパラメータは =COUNTIF(H22繁忙・閑散!$A$1:$H$24,I5)-COUNTIF(H22繁忙・閑散!$A$47:$H$67,I5) で求められます。 さらに、空白を返す条件(日付が入力されてない or 到着駅が運賃表 に載ってない)のチェックをまとめます。 =if(I5*countif(運賃表!$A$2:$O$286,L5), vlookup(L5,運賃表!$A$2:$O$286,5,0) +vlookup(L5,運賃表!$A$2:$N$286,15,0)*(countif(H22繁忙・閑散!$A$1:$H$24,I5)-countif(H22繁忙・閑散!$A$47:$H$67,I5)), "") こんな雰囲気になりますね。

qazxcvfr4
質問者

お礼

ありがとうございます。 しかし、 =if(I5*countif(運賃表!$A$2:$O$286,L5), vlookup(L5,運賃表!$A$2:$O$286,5,0) +vlookup(L5,運賃表!$A$2:$N$286,15,0)*(countif(H22繁忙・閑散!$A$1:$H$24,I5)-countif(H22繁忙・閑散!$A$47:$H$67,I5)), "") が理解できませんでした。 =COUNTIF(H22繁忙・閑散!$A$1:$H$24,I5)-COUNTIF(H22繁忙・閑散!$A$47:$H$67,I5) の部分も理解できません。 意味を教えていただけるとありがたいです。

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

対象を範囲名にしたら?。

qazxcvfr4
質問者

お礼

ありがとうございます。

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

>この関数でできることを変えずに、短くすることはできるでしょうか? ⇒条件がよくわかりませんが、条件をn×n表で整理してみては如何でしょうか。 >数字が200以下だった場合に、算出しているセルに何も表示させないようにするには ⇒単純に未表示にするならば、セルの書式設定→表示形式→ユーザ定義で[<200]"";G/標準で如何でしょうか

qazxcvfr4
質問者

お礼

ありがとうございます。 しかし、ただの表示の問題ではないです。

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

関連するQ&A

  • エクセルの関数の直し方

    現在、画像のような表を作成しておりますが、 1行目の前の行に5行挿入したいと考えております。 下の表からデータを製番・区分ごとに合計して上の表に表示されるようになっています。 5行挿入してタイトル等入れたいと思い、挿入してみると、 今まで下の表からの合計が上の表に表示されなくなってしまいます。 セル番号等確認はしてみたのですが、 どこがいけなくてうまく表示されないのかがわからなくて困っています。 どのように直したらいいかをご教示お願いいたします。 現在入っている関数は以下の通りです。 A2=IF(COUNT(Sheet1!$L$14:$L$38)<ROW(A1),"",INDEX(Sheet1!$B$14:$I$38,MATCH(SMALL(Sheet1!$L$14:$L$38,ROW(A1)),Sheet1!$L$14:$L$38,0),MATCH(A$1,Sheet1!$B$13:$I$13,0))) B2=IF(COUNT(Sheet1!$L$14:$L$38)<ROW(B1),"",INDEX(Sheet1!$B$14:$I$38,MATCH(SMALL(Sheet1!$L$14:$L$38,ROW(B1)),Sheet1!$L$14:$L$38,0),MATCH(B$1,Sheet1!$B$13:$I$13,0))) C2=IF(COUNT(Sheet1!$L$14:$L$38)<ROW(C1),"",INDEX(Sheet1!$B$14:$I$38,MATCH(SMALL(Sheet1!$L$14:$L$38,ROW(C1)),Sheet1!$L$14:$L$38,0),MATCH(C$1,Sheet1!$B$13:$I$13,0))) D2=IF(A2="","",SUMIFS(Sheet1!$G$14:$G$38,Sheet1!$B$14:$B$38,A2,Sheet1!$H$14:$H$38,B2)) E2=IF(C2="","",IF(ISERROR(VLOOKUP(C2,list!$S$3:$T$6,2,0)),"",VLOOKUP(C2,list!$S$3:$T$6,2,0))) H14=IF($E14="","",IF(ISERROR(VLOOKUP($E14,INDIRECT($J14),3,FALSE)),"",VLOOKUP($E14,INDIRECT($J14),3,FALSE))) I14=IF($E14="","",IF(ISERROR(VLOOKUP($E14,INDIRECT($J14),4,FALSE)),"",VLOOKUP($E14,INDIRECT($J14),4,FALSE))) J14=IF(ISBLANK(B14),"",IF(B14<="J121100144","旧","新")) K14=IF(AND(B14<>"",H14<>"-"),B14&"_"&H14,"") L14=IF(AND(K14<>"",COUNTIF(K$14:K14,K14)=1),COUNTIF($K$14:$K$38,"<"&K14)+1,"")

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

    =IF(ISERROR(VLOOKUP(B2,$E$1:$F$296,2,FALSE)),"",VLOOKUP(B2,$E$1:$F$296,2,FALSE)) という関数を入れて、品番をセルに入力して元表から品名を導く表を作成しました。うまく使えています。 これを元に =IF(ISERROR(VLOOKUP(B2,$F$1:$I$1000,2,FALSE)),"",VLOOKUP(B2,$F$1:$I$1000,2,FALSE)) という関数に直して、同じような表を作ろうとしたのですが、うまくいきません。 何が悪いのか分かりません。 どうすればうまくいきますでしょうか?

  • VLOOKUP関数について教えてください。

    航空運賃の料金計算という問題をしています。 (1)行先番号と時期番号を入力すると、自動的に運賃が計算できる計算表を完成しなさい。 (2)さらに事前割引表を元に、割引ができる表に改めなさいという問題になります。 (1)はMATCH関数とVLOOKUP関数で、なんとかできたのですが(2)がさっぱりわかりません。 (1)の時点ではこんな感じで数式を入れています。 H       I        J 出発地   東京(固定です。) 行先番号            =MATCH(I5,C6:F,0) 時期 料金              =VLOOKUP(I4,C6:F33,J,FALSE) (B2:E4の形で横に表にしたかったのですが、上手くMATCH関数を入れられず横に新たに作って考えています。) *行先・金額の表はこのような形で入力しています。 B    C    D      E    F 行先  番号  通常期   多客期  閑散期 札幌  1   24050    25250   21500 沖縄  27   34400    40660   37660  時期分類表  番号 1 通常期 7/1~7/31、8/21~11/30、2/1~3/31    2 多客期 8/1~8/20、12/27~1/6    3 閑散期 12/1~12/26、1/7~1/31  事前割引表 4週間前 運賃50%引き       3週間前 運賃30%引き       2週間前 運賃22%引き (2)の問題をとくには、まずI5にいつの時期かを判定?する数式を入れないとダメなのでは?、と思うのですがわかりません。 ちょうど7つだしIFのネストは7つまでできたから、と思ったのですが7/1~7/31どう入力すればいいのかわからず挫折。 次にこの日付を全部入力横の列に番号を入力、日付を検索値にして1~3をVLOOKUPで引っ張り出せばと思ったのですが上手くいきません。 (検索地が日付で数値でないからでしょうか?) 4週間前というのは1月前と考えて、3週間前は3×7日と考えて21日と考えるのかな?と思ったのですが、そこまでしか思いつきませんでした。 すみませんがこの問題の解き方、教えてください。 どうぞよろしくお願いします。

  • 急いでます。エクセルの関数教えて下さい

    =VLOOKUP(E4,B4:C7,2) という式があって、 #N/Aを表示させたくないときに=IF関数を使うのはわかるのですが、 このIFと VLOOKUPの式のつなげ方ってどうやるんでしょうか? よろしくお願い致します

  • LibreOfficeの関数について

    IF($H5="","",IF(L5="データA","",VLOOKUP($H5,$B$5:$F$10,2+(L5="データB"),0)&"")) IF($H5="","",IF(L5="データB","",VLOOKUP($H5,$B$5:$F$10,3-(L5="データA"),0)&"")) という式を重複と漢字に対応させるにはどうしたらよいでしょうか? 例えばデータA、Bというところを収入や支出としできれば重複データに対応させたいです。

  • (エクセル)2つの関数の式について。

    【=IF(A1=1,VLOOKUP(検索値,範囲1,列番号),IF(A1=2,VLOOKUP(検索値,範囲2,列番号),""))】 の式は2つの関数を混ぜてあるのですが、どのように指定すればいいいのでしょうか?fxをクリックしてIF関数を選び、論理式でA1=1をいれ、真の場合のところにVLOOKUP(検索値,範囲1,列番号)をいれてOKするとエラーになります。式の指定の仕方が分かりません。

  • Excel、関数に付いての質問です。

    Excel、関数に付いての質問です。 度々の質問で申し訳ありません。 添付のエクセル表で、F4に価格を出したいのですが、どのようにしたら良いでしょうか? (A4の商品名をB4に「1」があるとき、D4の購入場所区分「1」の価格表から価格を出したい) A商店のみで購入する場合は「=IF(B4=1,VLOOKUP(A4,$H$4:$I$8,2,0),"")」で出していたのですが…。 INDEXや、MATCH関数の使い方の本も読んでみたのですが、完敗してしまいました。 分かりにくかったら申し訳ありません。補足させていただきます。 宜しくお願いします。

  • エクセル関数

    =IF(COUNTIF($C$40:$C$55,$B3),"休館日",VLOOKUP(WEEKDAY(B3),{1,"";2,"";3,"";4,"休館日";5,"";6,"";7,""},2,0)) 上記の関数を入力するとエクセル2003では、#N/A とメッセージが出てしまうのですが、 また、質問しました 年間の指定した日と毎週水曜日の両方を休館日にするには、上記の関数を 入力したのでは、表示されません。 ご回答お待ちしております。

  • エクセル2010 関数

    こんにちは。詳しい方お教えください。 添付の画像の黄色部分の関数は =IF(VLOOKUP($A3,$A$15:$C$19,2)="収入の",VLOOKUP($A3,$A$15:$C$19,3)*H3,IF(VLOOKUP($A3,$A$15:$C$19,2)="月額固定",VLOOKUP($A3,$A$15:$C$19,3), IF(VLOOKUP($A3,$A$15:$C$19,2)="年額固定",VLOOKUP($A3,$A$15:$C$19,3)/12,""))) という事がわかったのですが この場合の $15:$C$19,2 や 19,3って何を指すものでしょうか? すみません、勉強不足なのは重々承知の初心者です。 この関数を基に、同じような書類を作りたいと考えたのですが そこがわからず進みません。 よろしくお願い申し上げます。

  • 【OpenOffice】vlookup関数を条件式として使う

    【OpenOffice】vlookup関数を条件式として使う タイトルどおりなんですが A2に書いた値がE2からE200の表内の値と一致するかどうかを条件にif文を以下のように =IF($A2=VLOOKUP($A2;$E$2:$E$200;1;0);OK;NG) 作ったんですがTRUEでない場合、NGが表示されず空白を示す#N/Aが表示されてしまうんです ちゃんとNGが表示されるようにするにはどうすればいいのでしょうか? どなたか教えていただけませんでしょうか、よろしくお願いします。

専門家に質問してみよう