• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Excel2003 ユーザー定義関数 で SUBTOTALとSUMPRODUCTの複合できますか?(複数条件))

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

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

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

  • ベストアンサー
  • 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

専門家に質問してみよう