@@ -46,12 +46,14 @@ public override CompileResult Execute(IEnumerable<FunctionArgument> arguments, P
46
46
{
47
47
ValidateArguments ( arguments , 2 ) ;
48
48
var argRange = ArgToRangeInfo ( arguments , 0 ) ;
49
- var criteria = arguments . ElementAt ( 1 ) . ValueFirst != null ? ArgToString ( arguments , 1 ) : null ;
49
+
50
+ // Criteria can either be a string or an array of strings
51
+ var criteria = GetCriteria ( arguments . ElementAt ( 1 ) ) ;
50
52
var retVal = 0d ;
51
53
if ( argRange == null )
52
54
{
53
55
var val = arguments . ElementAt ( 0 ) . Value ;
54
- if ( criteria != default ( string ) && _evaluator . Evaluate ( val , criteria ) )
56
+ if ( _evaluator . Evaluate ( val , criteria ) )
55
57
{
56
58
var sumRange = ArgToRangeInfo ( arguments , 2 ) ;
57
59
retVal = arguments . Count ( ) > 2
@@ -71,12 +73,39 @@ public override CompileResult Execute(IEnumerable<FunctionArgument> arguments, P
71
73
return CreateResult ( retVal , DataType . Decimal ) ;
72
74
}
73
75
74
- private double CalculateWithSumRange ( ExcelDataProvider . IRangeInfo range , string criteria , ExcelDataProvider . IRangeInfo sumRange , ParsingContext context )
76
+ private IEnumerable < string > GetCriteria ( FunctionArgument criteriaArg )
77
+ {
78
+ var criteria = new List < string > ( ) ;
79
+ if ( criteriaArg . IsEnumerableOfFuncArgs )
80
+ {
81
+ foreach ( var arg in criteriaArg . ValueAsEnumerableOfFuncArgs )
82
+ {
83
+ criteria . Add ( arg . ValueFirstString ) ;
84
+ }
85
+ }
86
+ else if ( criteriaArg . IsExcelRange )
87
+ {
88
+ foreach ( var cell in criteriaArg . ValueAsRangeInfo )
89
+ {
90
+ if ( cell . Value != null )
91
+ {
92
+ criteria . Add ( cell . Value . ToString ( ) ) ;
93
+ }
94
+ }
95
+ }
96
+ else
97
+ {
98
+ criteria . Add ( criteriaArg . ValueFirst != null ? criteriaArg . ValueFirst . ToString ( ) : null ) ;
99
+ }
100
+ return criteria ;
101
+ }
102
+
103
+ private double CalculateWithSumRange ( ExcelDataProvider . IRangeInfo range , IEnumerable < string > criteria , ExcelDataProvider . IRangeInfo sumRange , ParsingContext context )
75
104
{
76
105
var retVal = 0d ;
77
106
foreach ( var cell in range )
78
107
{
79
- if ( criteria != default ( string ) && _evaluator . Evaluate ( cell . Value , criteria ) )
108
+ if ( _evaluator . Evaluate ( cell . Value , criteria ) )
80
109
{
81
110
var rowOffset = cell . Row - range . Address . _fromRow ;
82
111
var columnOffset = cell . Column - range . Address . _fromCol ;
@@ -95,12 +124,12 @@ private double CalculateWithSumRange(ExcelDataProvider.IRangeInfo range, string
95
124
return retVal ;
96
125
}
97
126
98
- private double CalculateSingleRange ( ExcelDataProvider . IRangeInfo range , string expression , ParsingContext context )
127
+ private double CalculateSingleRange ( ExcelDataProvider . IRangeInfo range , IEnumerable < string > expressions , ParsingContext context )
99
128
{
100
129
var retVal = 0d ;
101
130
foreach ( var candidate in range )
102
131
{
103
- if ( expression != default ( string ) && IsNumeric ( candidate . Value ) && _evaluator . Evaluate ( candidate . Value , expression ) && IsNumeric ( candidate . Value ) )
132
+ if ( IsNumeric ( candidate . Value ) && _evaluator . Evaluate ( candidate . Value , expressions ) && IsNumeric ( candidate . Value ) )
104
133
{
105
134
if ( candidate . IsExcelError )
106
135
{
0 commit comments