Skip to content

Commit 5bb2d0d

Browse files
authored
#1593 Fixed an issue with MATCH function when range is sorted in descending order (#1594)
1 parent e57e92b commit 5bb2d0d

File tree

3 files changed

+42
-4
lines changed

3 files changed

+42
-4
lines changed

src/EPPlus/FormulaParsing/Excel/Functions/RefAndLookup/LookupUtils/LookupBinarySearch.cs

+8-3
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,12 @@ internal static int BinarySearch(object lookupValue, IRangeInfo lookupRange, boo
139139
return asc ? SearchAsc(lookupValue, lookupRange, comparer, direction) : SearchDesc(lookupValue, lookupRange, comparer);
140140
}
141141

142+
internal static int GetMaxIndex(IRangeInfo returnArray)
143+
{
144+
return returnArray.Size.NumberOfRows > returnArray.Size.NumberOfCols ?
145+
returnArray.Size.NumberOfRows : returnArray.Size.NumberOfCols;
146+
}
147+
142148
internal static int GetMatchIndex(int ix, IRangeInfo returnArray, LookupMatchMode matchMode, bool asc)
143149
{
144150
if (ix > -1) return ix;
@@ -150,9 +156,8 @@ internal static int GetMatchIndex(int ix, IRangeInfo returnArray, LookupMatchMod
150156
else if (matchMode == LookupMatchMode.ExactMatchReturnNextLarger)
151157
{
152158
var adjustment = asc ? 0 : -1;
153-
var max = returnArray.Size.NumberOfRows > returnArray.Size.NumberOfCols ?
154-
returnArray.Size.NumberOfRows : returnArray.Size.NumberOfCols;
155-
result = result >= max ? result : result + adjustment;
159+
var max = GetMaxIndex(returnArray);
160+
result = result >= max ? max : result + adjustment;
156161
}
157162
return result;
158163
}

src/EPPlus/FormulaParsing/Excel/Functions/RefAndLookup/Match.cs

+2-1
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,8 @@ public override CompileResult Execute(IList<FunctionArgument> arguments, Parsing
6464
{
6565
return CompileResult.GetErrorResult(eErrorType.NA);
6666
}
67-
return CreateResult(index + 1, DataType.Integer);
67+
var max = LookupBinarySearch.GetMaxIndex(lookupRange);
68+
return CreateResult(index >= max ? index : index + 1, DataType.Integer);
6869
}
6970
/// <summary>
7071
/// If the function is allowed in a pivot table calculated field

src/EPPlusTest/FormulaParsing/Excel/Functions/RefAndLookup/MatchTests.cs

+32
Original file line numberDiff line numberDiff line change
@@ -134,5 +134,37 @@ public void MatchShouldWorkWithSingleCell()
134134

135135
Assert.AreEqual(1, formulaCell.GetValue<int>());
136136
}
137+
138+
[TestMethod]
139+
public void MatchTest_GreaterThanOrEqual_ShouldReturnIndexOfLast()
140+
{
141+
_worksheet.Cells["G3"].Value = 1d;
142+
_worksheet.Cells["G4"].Value = 0.75;
143+
_worksheet.Cells["G5"].Value = 0.5;
144+
_worksheet.Cells["G6"].Value = 0.27;
145+
_worksheet.Cells["G7"].Value = 0.1;
146+
147+
_worksheet.Cells["A1"].Formula = "MATCH(0.01,G3:G7,-1)";
148+
149+
_worksheet.Calculate();
150+
151+
Assert.AreEqual(5, _worksheet.Cells["A1"].Value);
152+
}
153+
154+
[TestMethod]
155+
public void MatchTest_GreaterThanOrEqual_ShouldReturnIndexOfSecondLast()
156+
{
157+
_worksheet.Cells["G3"].Value = 1d;
158+
_worksheet.Cells["G4"].Value = 0.75;
159+
_worksheet.Cells["G5"].Value = 0.5;
160+
_worksheet.Cells["G6"].Value = 0.27;
161+
_worksheet.Cells["G7"].Value = 0.1;
162+
163+
_worksheet.Cells["A1"].Formula = "MATCH(0.11,G3:G7,-1)";
164+
165+
_worksheet.Calculate();
166+
167+
Assert.AreEqual(4, _worksheet.Cells["A1"].Value);
168+
}
137169
}
138170
}

0 commit comments

Comments
 (0)