プロが教える店舗&オフィスのセキュリティ対策術

お世話になっております。
掲題の通り、飛び飛びのセルを計算しているIF条件があります。
具体式は以下

=ARRAYFORMULA(IF($H$9:$H$608=BR8,$G$9:$G$608,"")+IF($K$9:$K$608=BR8,$J$9:$J$608,"")+IF($N$9:$N$608=BR8,$M$9:$M$608,"")+IF($Q$9:$Q$608=BR8,$P$9:$P$608,"")+IF($T$9:$T$608=BR8,$S$9:$S$608,"")+IF($X$9:$X$608=BR8,$W$9:$W$608,"")+IF($AB$9:$AB$608=BR8,$AA$9:$AA$608,"")+IF($AF$9:$AF$608=BR8,$AE$9:$AE$608,"")+IF($AJ$9:$AJ$608=BR8,$AI$9:$AI$608,"")+IF($AN$9:$AN$608=BR8,$AM$9:$AM$608,"")+IF($AR$9:$AR$608=BR8,$AQ$9:$AQ$608,"")+IF($AV$9:$AV$608=BR8,$AU$9:$AU$608,"")+IF($AZ$9:$AZ$608=BR8,$AY$9:$AY$608,"")+IF($BD$9:$BD$608=BR8,$BC$9:$BC$608,"")+IF($BH$9:$BH$608=BR8,$BG$9:$BG$608,"")+IF($BL$9:$BL$608=BR8,$BK$9:$BK$608,"")+IF($BP$9:$BP$608=BR8,$BO$9:$BO$608,""))

【やりたいこと】
以下のようなセルが複数個所にあります。
 漢検第1回            漢検第2回  第三回…続く
 受験日 受験級 預り金額 受取月
 日付  2級  2000円 3月

具体的には検定各種+回数のセルが横並びになっている状態で、受取月(受験日と異なる場合があります)を参照して、預り金を別の受取計算式セルにSUMしたい、といった状態です。

計算自体は上手くいっているのですが、全体シートの重さから考えて、もう少し短い式にしたいです。

このような式をもう少し短くする方法はありませんでしょうか?
有識者の方いらっしゃいましたらよろしくお願いします。
どのあたりの関数を使った方がいいよ~などありましたらヒントをいただけるとこちらでこねくり回せたりするので、関数のヒントだけでも構いません。(具体式だとめんどくさそうなのは明らかなので…)

スプレッドシートの投稿カテゴリがありませんので、エクセルカテゴリで出題させていただいております。

質問者からの補足コメント

  • うれしい

    一緒に考えて下さりありがとうございます。
    補足しますと
    列G、列J、列M…の項目名は預り金です。受取月で横に足し算をしています。
    列H、列K、列N…の項目名は受取月です。(ここを後述のBR8のデータで集計して各月の合計としています)
    セルBR8のデータは別テーブルの受取月です。別テーブルがあり、受取月ごとに集計されます。

    Excelの手法でも構いません。
    もしかしたらスプレッドシートに実装されていない可能性もありますが、試してみる価値はあると思います。

    No.1の回答に寄せられた補足コメントです。 補足日時:2020/01/05 10:19
  • うーん・・・

    補足が分かりづらいようでしたので再補足です。

    受験日(F列) 預り金(G列) 受取月(H列)…
    と並んでいるのが5種類、
    受験日(U列) 受験級(V列) 預り金(W列) 受取月(X列)…
    と並んでいるのが3種×3種類です。

    また、各受取月の計算式合計として
    3月(BR列) 4月(BS列)……
    としてテーブルを用意しています。

    計算式用受取月(BR列:3月)を参照してH列などを見に行き、左隣にあるG列などを取ってくるIF文を一つずつ書きました。計算式用受取月と一致しない場合は空欄を返して、それぞれのIF文を足し算しているのが質問に書いた実例の式です。

    ですので、うまくいってないのがあり得ない、という回答自体があり得ないのですが…
    Excel上では動かない式なのでしょうか?グーグルスプレッドシートでは動いています。

    この記事の趣旨は「動くかどうか」ではなく「省略できるかどうか」です。

    No.2の回答に寄せられた補足コメントです。 補足日時:2020/01/05 14:13
  • うれしい

    アイデアありがとうございます!
    ExcelでいうところのVBA、スプレッドシートでいうところのGASですね。

    私も少しその方面で考えていました。
    アイデアをもとにいろいろ弄ってみます!

    No.3の回答に寄せられた補足コメントです。 補足日時:2020/01/06 10:10

A 回答 (3件)

確認させてください。



各列の項目名は、受験日、受験級、預り金額、受取月の5種類が横方向に隙間なく並んでいると?
列G、列J、列M、… の項目名は何ですか?
列H、列K、列N、… の項目名は何ですか?
セル BR8 のデータは何ですか?
Excel での手法で回答したら、貴方はそれを“スプレ”に応用できますか?
この回答への補足あり
    • good
    • 0

[No.1補足]へのコメント、


「各列の項目名は、受験日、受験級、預り金額、受取月の5種類が横方向に隙間なく並んでいると」として(何故なら私のその問に対する回答なしだったから。ただし、「5種類」は「4種類」の間違いでした)、かつ、「列G」が「預り金」額なら、列記号は此処の添つまり、「列G、列J、列M…の項目名は預り金」と仰ったのはデタラメでしょ?
なのに、提示された式が「計算自体は上手くいっている」のはアリエナーイ筈では?
「【スプレッドシート】飛び飛びのIF条件を」の回答画像2
この回答への補足あり
    • good
    • 0

こんにちは



スプレッドシートの関数は全く知らないのと、今、手元にエクセル環境がないので確認ができませんので、以下アイデアだけの回答になってしまいますが・・・

>第三回…続く
となっている列のセットがいくつあるのか不明ですが、少ない数であるなら、各セット毎の集計を加算するのが簡単そうに思えます。
例えば、最初のセットがA~D列として、D列を条件にC列の和を求めるなら、
 SUMPRODUCT((D:D=指定月)*C:C)
のような計算で得られますので、これをセットの数だけ連記して加算すれば良いことになります。

しかし、ご提示の式を見てみると、どうやら同じ考え方の式のようにも思えますので、セット数が多いのでこれを何とかしたいというご質問なのでしょうか?
式を簡単にするだけであれば、上記の式をセット数分(列方向に)一般化することで可能と考えられます。

エクセルの場合でも、配列計算の場合、2次元に対応してくれる関数とそうでないものがあるので、確認しないとどのような関数を選択するのが良いのかはっきりとしないのですが・・・
例えば、対象範囲がA1:P100とするなら
 SUM((MOD(COLUMN(D1:P100),4)=0)*(D1:P100=指定月)*C1:O100)
のような式(使用関数は変わるかも知れません)で算出できると思います。
簡単に説明するなら、4の倍数列でかつ指定月と同じセルの左隣の値を合計するという意味です。(条件に合致しないセルの場合は値が0を返す)

これにより、計算式自体はかなり短く簡潔にできるとは思いますが、計算が軽くなるかと言えば、むしろ逆効果となる可能性が高いです。
大抵の場合、式を一般化するほど計算量が増加する傾向にあり、無駄な計算が増加するからです。

計算効率を下げずに、かつ、式を簡略化したいのであれば、エクセルで言うところのユーザ関数的なものを作成して、それを利用する方法があったように思います。(確信がありませんが、できたような記憶があります)
スプレッドシートの制御はjavascriptで可能なはずですので、専用の関数を(効率よく)作成しておいてこれを利用する方式にしておけば、セル内の式も関数呼びだしだけの短い式ですむはずです。
この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!