- ベストアンサー
Excel2003 ユーザー定義関数でSUBTOTALとSUMPRODUCTの複合計算ができますか?
- Excel2003のユーザー定義関数を使用して、SUBTOTALとSUMPRODUCTを複合計算することは可能ですか?
- 具体的な条件として、フィールド「あ」が「a」または「b」であり、フィールド「う」が「p」または「r」である行のB列の合計を計算したいと考えています。
- 提供されたVBAのコードではエラーが発生しているようです。
- みんなの回答 (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") '-------------------------------------------
その他の回答 (1)
- xls88
- ベストアンサー率56% (669/1189)
ユーザー定義関数そのものが良いかどうかは分かりませんが 下記で試してみてください。 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
お礼
ありがとうございます。 完全に解決しました。非常に感謝しております。 SUBTOTALIFは汎用性のある、すごく便利な関数です。 SUMPRODUCTの使い方もすごいです。Function プロシージャはおろか、配列がどういうものか、まだよくわかっていない気がします。勉強させていただきます。