Excel2003 ユーザー定義関数でSUBTOTALとSUMPRODUCTの複合計算ができますか?

このQ&Aのポイント
  • Excel2003のユーザー定義関数を使用して、SUBTOTALとSUMPRODUCTを複合計算することは可能ですか?
  • 具体的な条件として、フィールド「あ」が「a」または「b」であり、フィールド「う」が「p」または「r」である行のB列の合計を計算したいと考えています。
  • 提供されたVBAのコードではエラーが発生しているようです。
回答を見る
  • ベストアンサー

Excel2003 ユーザー定義関数 で SUBTOTALとSUMPRODUCTの複合できますか?(複数条件)

こんばんは。お願いします。 まず、セルA2、B2、C2にそれぞれフィールド名"あ"、"い"、"う"があるとします。 この2列目以下にオートフィルターを使います。 A列のA3,A4…には文字列"a","b","c"または"d"がランダムに並んでいて、 B列のB3,B4…にはランダムに数値(整数)が入っていて、 C列のC3,C4…には文字列"p","q",または"r"がランダムに並んでいるとします。 このとき、セルB1にVBAで作成した関数を入れたいと思っています。 Excel2003です。 その関数は、以下の条件を満たします。 (1)フィールド「あ」が、たとえば"a"または"b"である場合のみ、その行のB列の数値の合計を計算するように引数を設定した場合、 (2)オートフィルタを用いて、フィールド「あ」に"a"または"b"または"c"のフィルタをかけて、さらにフィールド「う」にも"p"または"r"のフィルタをかけても、B列の、可視セルの、フィールド「あ」が"a"または"b"の行の数値だけの合計を計算する (添付の図の例で言うと2+3+1+3= 9 が正解となる) (3)作業列は使えません。 そこで、自分で作成してみたのがこれです。 Function SubIf(c) Dim i As Long For i = 3 To Range("A3").End(xlDown).Row If Rows(i).Hidden = False Then If Cells(i, 1).Value = "a" Or Cells(i, 1).Value = "b" Then c(i) = Range("B" & i) End If End If Next i SubIf = WorksheetFunction.Sum(c) End Function が、SubIf(B3:B11)の結果は、#VALUE!に終わりました。 何か、根本的に間違っていますでしょうか。 とにかく、可視セルのうち、条件にあうもののみ足し算したい、ということです。 もしこのようなことがワークシート関数でもできるのであれば、それで構いません。 どうぞ、よろしくお願いいたします。

noname#200395
noname#200395

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

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

こんにちは。 まず、ユーザー定義関数のコードは、まだVBAの基本的な知識がありませんね。 Function プロシージャとユーザー定義関数とは、似ていても作業が違います。 図があるというのですが、ありませんね。 簡単に行うには、オートフィルタのオプションではなくて、フィルタ・オプションで行えばよいのではないかと思います。 文章で分かりにくいのは、数学の「または(or)」というのは、「両方とも(plus)」という意味で、英語ネイティブの文章でも、時々問題になりますが、日本語でも「または」と書かれると、どちらか一方(either)という意味もありますので、混乱してしまいます。 たぶん、前回の質問とあわせると、可視セルを合計する、SUBTOTAL(9,範囲)の範囲の中に条件を設けたい、言い換えれば、SUMIF(範囲,検索条件,合計範囲) の可視セルだけの計算をしたいということだと思います。 もし、そういう意味だとすると、数式ですと、以下のような数式になるかと思います。 =SUMPRODUCT(SUBTOTAL(3,OFFSET(A3,ROW(A3:A23)-3,0))*(A3:A23={"a","b"})*B3:B23) このようにするか、 ユーザー定義関数ですと、以下のようになります。 検索条件は、ワイルドカードが使えます。 '---------------------------------------------------------------------------------- '注意:検索範囲と合計範囲のセルの数や範囲の形状が違っている場合のエラー処理はされていません。 '------------------------------------------- '標準モジュール '------------------------------------------- Public Function SUBTOTALIF(検索範囲 As Range, 合計範囲 As Range, ParamArray 検索条件() As Variant)   'SUBTOTALIF(検索範囲,合計範囲,検索条件)   Dim rng1 As Range   Dim rng2 As Range   Dim k() As Variant   '-------------------------------------------   '2byte 変数の切り替え   Set rng1 = 検索範囲   Set rng2 = 合計範囲   k() = 検索条件()   '-------------------------------------------   Dim i As Long   Dim c As Range   Dim dSum As Double   Dim v As Variant   For Each c In rng1     i = i + 1     If c.Rows.Hidden = False Then       For Each v In k '複数の条件         If c.Text Like v Then           If VarType(rng2.Cells(i).Value) = vbDouble Then             dSum = dSum + rng2.Cells(i).Value           End If         End If       Next v     End If   Next c   SUBTOTALIF = dSum   Set rng1 = Nothing   Set rng2 = Nothing End Function '------------------------------------------- ユーザー定義関数の入力 = SUBTOTALIF(検索範囲,合計範囲,検索条件) セルに =SUBTOTALIF(A3:A23,B3:B23,"a","b") '-------------------------------------------

noname#200395
質問者

お礼

ありがとうございます。 完全に解決しました。非常に感謝しております。 SUBTOTALIFは汎用性のある、すごく便利な関数です。 SUMPRODUCTの使い方もすごいです。Function プロシージャはおろか、配列がどういうものか、まだよくわかっていない気がします。勉強させていただきます。

その他の回答 (1)

  • xls88
  • ベストアンサー率56% (669/1189)
回答No.1

ユーザー定義関数そのものが良いかどうかは分かりませんが 下記で試してみてください。 Function SubIf(c) Dim i As Long Dim t as Variant For i = 3 To Range("A3").End(xlDown).Row If Rows(i).Hidden = False Then If Cells(i, 1).Value = "a" Or Cells(i, 1).Value = "b" Then t = t + Range("B" & i) End If End If Next i SubIf = t End Function

関連するQ&A

  • Excel2003 ユーザー定義関数 で SUBTOTALとSUMPRODUCTの複合できますか?(複数条件)

    こんばんは。お願いします。 まず、セルA2、B2にそれぞれフィールド名"あ"、"い"があるとします。 この2列目以下にオートフィルターを使います。 A列のA3,A4…には文字列"a","b","う",または"かき"が入っていて、 B列のB3,B4…には数値(整数)が入っているとします。 このとき、セルB1にVBAで作成した関数を入れたいと思っています。 Excel2003です。 その関数は、以下の条件(1)と(2)を同時に満たします。 (1)A列が"a"または"かき"である場合のみ、その行のB列の数値の合計を計算する(SUMIF関数で可能) (2)オートフィルターを用いて抽出したら、表示されているB列の数値だけの合計を計算する(SUBTOTAL関数で可能) (3)作業列は使えません。 要するに、表示されているセルのうち、条件にあうもののみ計算したい、ということです。 もしこのようなことがワークシート関数でもできるのであれば、それで構いません。 どうぞ、よろしくお願いいたします。

  • EXCEL関数教えて下さい。

    A1、B1にランダムに変化する数があります、C列に適応した数を自動表示させたいです。 A1 総数 B1 1箱単位の数 C列表示ラベル  と=IF($A$2-($B$2*(ROW()-1))>=$B$2,$B$2,IF($A$2-($B$2*(ROW()-1))<1,"",$A$2-($B$2*(ROW()-1)))) と言う事で他の方から教えて頂きましたC列には順番に表示されました同じ内容でランダムなセルG7,I7,G12,I12,G17,I17にも表示させるには、どうしたら宜しいでしょうか教えてください宜しくお願いします。

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

    Excel2000です。 添付画像のような表があります。 A列、B列に数値、C列に文字列です。 A列の数値は単なる数値ではなく、計算式で求められています。 したがって表内A列の何も表示されていないセルは、計算の結果 ="" になったものです。 B列の数値は直接入力した単なる数値です。 この表で仮に、C列がAの場合のA列合計を求めるため、D6に =SUMPRODUCT((A1:A5)*(B1:B5)*(C1:C5="A")) としてみましたが、="" を乗じているためVALUEエラーになります。 =""を排除しようと、 =SUMPRODUCT((A1:A5<>"")*(A1:A5)*(B1:B5)*(C1:C5="A")) としてみましたが、やはりVALUEエラーになります。 こういう場合はどうしたらよいのでしょうか? ="" を =0 に変えるという回答以外でお願いいたします。

  • 「excel」 条件の関数について

    条件付きの関数についての質問をさせてください。 A1~A500までのセル中に「goo山goo太郎」という名前が あった場合→B2セルに数値「1」を、 ない場合→B2セルに数値「0」をかえしたい時 IF関数を使うのが正しいのでしょうか? その場合、B2セルに =IF($A$1:$A$500>goo山 goo太郎,"1","0") と入力してみたのですが、反映されませんでした。。 独学でトライ&エラーでやってますが、わかりません。 ご教授よろしくお願いします。

  • Excel関数の使い方、条件と選択

    エクセルを用いて以下のようなことをしたいです。 まず条件として1は1000、2は2000、3は3000、4は4000。 つぎにAさん、Bさん、Cさんなどに条件、1、3、4などを割り振りその結果、1000、3000、4000などの数値を出したいです。 A列 B列 1 1000 2 2000 3 3000 4 4000      ↓この1000、3000、4000などを数式で表したい。 Aさん 1 1000 Bさん 3 3000 Cさん 4 4000 Aさん・・・・や1,3・・・などは自分で手入力します。その右セルの1000・・・などを数式で表して結果を表示させたいです。 Choose、Indrect、If、など調べてみたのですがどの関数を使ったらよいかわかりません。 もっと具体的に言うと、Aさん、Bさんなどそれぞれに数字の条件を割り振り、その時のお金の金額を計算したいです。 以上、よろしくお願いいたします。

  • 複数シート、複数条件でのSUMPRODUCT関数について

    こんにちわ。 SUMPRODUCT関数に挑戦していて上手くいかない点があるので教えていただけると助かります。 複数のシート(A,B,C)のそれぞれ同じセル範囲の中から、集計するシート内と一定条件に合致したものを抽出したいので、 =IF($A19=0,0,(SUMPRODUCT(($A19=A!$A$723:$A$769)*(A!$C$723:$AG$769))))+IF($A19=0,0,(SUMPRODUCT(($A19=B!$A$723:$A$769)*(B!$C$723:$AG$769))))+IF($A19=0,0,(SUMPRODUCT(($A19=C!$A$723:$A$769)*(C!$C$723:$AG$769)))) という式を作りました。3シート目位までは結果が正しく戻るのですが、途中でエラーが出てしまいます。全部で12シート分の条件にあったセルを合計したいのですが。 長すぎるのか、括弧のつけ方とかがあるのかと思うのですが、短くする方法がいまいちわからず困っています。 宜しくお願いします。

  • オートフィルターで抽出後の集計 ユーザー定義関数

    以下のようなテーブルがあったとします。(図参照) A列 ID B列 数値A C列 数値B D列 抽出A E列 抽出B フィルターでD列E列で抽出した後に、B列の数値、例えば数値が1~3あるとします。 それぞれ1~3のC列の数値の合計の式をユーザー定義関数で作ることは出来ますでしょうか? コードかけません宜しくお願いします。 式1 フィルター抽出後のB列の1という数字のみのC列の数値の合計 式2 フィルター抽出後のB列の2   同様 式3 フィルター抽出後のB列の3   同様 VBAの知識はあまりありませんが、モジュールの追加とコードを貼り付ける作業は出来ます。 エクセル2013 64bitです。 宜しくお願いします。

  • Excel関数:SUBTOTALとSUMIFを組み合わせる?

    下記のような場合の集計ができる関数を教えて下さい。 SUBTOTALとSUMIFを組み合わせようと思ったのですが、うまくいきませんでした。 よろしくお願いします。 <表の内容> ・セルA1:「ランク」 ・セルA2~A50:「A」or「B」or「C」を入力している ・セルB1:「金額」 ・セルB2~B50:各金額を入力している <集計方法> ・セルB51に「ランクが"A"」の金額合計を表示したい ・ただしオートフィルターを使って他の条件で抽出もおこなっているのでSUBTOTAL関数のように、表示されている行の値のみを合計したい

  • SUMPRODUCT関数で複数条件適用されない

    Sheet1 A列:日付 B列:注文番号 C列:品名 D列:整理番号 E列:数量 集計 A列:品名 B~AF列:日付(1~31日) 【集計】B~AF列の日付、A列の品名が 【Sheet1】A列の日付、C列の品名と一致したら 【Sheet1】E列の数量を【集計】の該当するセルに抽出する 式をSUMPRODUCT関数で作成しました。 例)10/1 りんご 20 【集計】B3セルに以下の数式を入れましたが なぜか数量が「0」のままになります。 =SUMPRODUCT('Sheet1'!$A$3:$A$200='集計'!B$2)*('Sheet1'!$C$3:$C$200="りん ご")*('Sheet1'!$E$3:$E$200) 特に数式のミスはないと思うのですが どうしても正しい値が入りません。 数式に間違いがあればご指摘いただけませんでしょうか。 また、他に良き方法があればご教示いただけるとありがたいです。

  • EXCEL関数について

    EXCEL関数について Sheet1、A1~A1000セルに「1~10」までの値がランダムに入力されております。 数字は「グループ1」、「グループ2」・・・という意味です。 B列、B1~B1000セルには「1~4」までの値がランダム入力されております。 B列については、空白のセルもあります。 Sheet2、A1~A10セルに、「1~10」までの値、「グループ1」~「グループ10」までが順に入力されております。 ここで、Sheet2、B列~E列、それぞれの1~10セルを使用し、、 それぞれの「グループ」がSheet1にて「1~4」の値をいくつずつ選んでいるか算出したいのです。 「グループ1」について、「1」のカウントはB1セル、「2」のカウントはC1のセルに返します。 同じように「グループ2」はB2~E2のセルに、「グループ3」はB3~E3のセルに値を返したいのです。 「COUNTIF」等の関数でいろいろと試してみたのですがうまく反映されません。 拙文乱文、大変恐縮ですが、ご教示頂きたく何卒宜しくお願い致します。

専門家に質問してみよう