作成日: 2018/10/22 最終更新日: 2018/12/18
文書種別
不具合
状況
修正済み
詳細
■事象
SUMIFやCOUNTIFなどの条件付き集計関数でデータ連結しているセルを集計した時、正しい集計結果が得られません。
問題が発生する関数は、以下の通りです。
AVERAGEIF
AVERAGEIFS
COUNTIF
COUNTIFS
MAXIFS
MINIFS
SUMIF
SUMIFS
■サンプルコード(VB.NET)
■問題発生イメージ

SUMIFやCOUNTIFなどの条件付き集計関数でデータ連結しているセルを集計した時、正しい集計結果が得られません。
問題が発生する関数は、以下の通りです。
AVERAGEIF
AVERAGEIFS
COUNTIF
COUNTIFS
MAXIFS
MINIFS
SUMIF
SUMIFS
■サンプルコード(VB.NET)
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
' サンプルデータを作成します。
Dim dt As New DataTable("Test")
dt.Columns.Add("ItemB", GetType(Int32))
dt.Columns.Add("ItemC", GetType(Int32))
dt.Rows.Add(10000, 1)
dt.Rows.Add(2000, 2)
dt.Rows.Add(30000, 1)
dt.Rows.Add(4000, 2)
dt.AcceptChanges()
' 生成したデータをSPREADに連結させます。
FpSpread1.ActiveSheet.AutoGenerateColumns = False
FpSpread1.ActiveSheet.DataAutoCellTypes = False
FpSpread1.ActiveSheet.DataAutoSizeColumns = False
FpSpread1.ActiveSheet.DataSource = dt
FpSpread1.ActiveSheet.ColumnCount = 3
FpSpread1.ActiveSheet.BindDataColumn(1, "ItemB")
FpSpread1.ActiveSheet.BindDataColumn(2, "ItemC")
' 非連結列に集計関数(SUMIF)を設定します。
Dim strFunc As String = "TEXT(SUMIF(Sheet1!C:C,""=1"",Sheet1!B:B)-SUMIF(Sheet1!C:C,""=2"",Sheet1!B:B),""#,##0"")"
FpSpread1.ActiveSheet.Cells(0, 0).Formula = strFunc
End Sub
' サンプルデータを作成します。
Dim dt As New DataTable("Test")
dt.Columns.Add("ItemB", GetType(Int32))
dt.Columns.Add("ItemC", GetType(Int32))
dt.Rows.Add(10000, 1)
dt.Rows.Add(2000, 2)
dt.Rows.Add(30000, 1)
dt.Rows.Add(4000, 2)
dt.AcceptChanges()
' 生成したデータをSPREADに連結させます。
FpSpread1.ActiveSheet.AutoGenerateColumns = False
FpSpread1.ActiveSheet.DataAutoCellTypes = False
FpSpread1.ActiveSheet.DataAutoSizeColumns = False
FpSpread1.ActiveSheet.DataSource = dt
FpSpread1.ActiveSheet.ColumnCount = 3
FpSpread1.ActiveSheet.BindDataColumn(1, "ItemB")
FpSpread1.ActiveSheet.BindDataColumn(2, "ItemC")
' 非連結列に集計関数(SUMIF)を設定します。
Dim strFunc As String = "TEXT(SUMIF(Sheet1!C:C,""=1"",Sheet1!B:B)-SUMIF(Sheet1!C:C,""=2"",Sheet1!B:B),""#,##0"")"
FpSpread1.ActiveSheet.Cells(0, 0).Formula = strFunc
End Sub
■問題発生イメージ

回避方法
Service Pack 2(v11.0.4503.2012)で修正済み。
Service Pack 2を適用せずに対処する方法としては、FormulaArrayプロパティを使用して「配列数式」として集計する方法が有効です。
たとえば、「説明」に記載されたサンプルの場合、以下のような実装が有効です。
なお、FormulaArrayを使用する方法と***IF/IFSを使用する方法では、集計時の内部動作が異なるため、必ずしも同じ結果になるとは限りません。
また、データ連結しているセルを対象に集計する式をFormulaArrayに設定する時には、データ連結を行う前にあらかじめFormulaArrayを設定する必要があります。
Service Pack 2を適用せずに対処する方法としては、FormulaArrayプロパティを使用して「配列数式」として集計する方法が有効です。
たとえば、「説明」に記載されたサンプルの場合、以下のような実装が有効です。
FpSpread1.ActiveSheet.Cells(0, 0).FormulaArray = "SUM(IF(C1:C4=1,B1:B4,0))-SUM(IF(C1:C4=2,B1:B4,0))"
なお、FormulaArrayを使用する方法と***IF/IFSを使用する方法では、集計時の内部動作が異なるため、必ずしも同じ結果になるとは限りません。
また、データ連結しているセルを対象に集計する式をFormulaArrayに設定する時には、データ連結を行う前にあらかじめFormulaArrayを設定する必要があります。
旧文書番号
83310