Excel - WorksheetFunction.max 中的 Visual Basic

Visual Basic in Excel - WorksheetFunction.max

当被比较的值相等时,此函数的行为是什么? 如果

Cell1 = 10
Cell2 = 11

Debug.Print WorksheetFunction.max(Cell1,Cell2)

将return Cell2。但是如果

Cell1 = 10
Cell2 = 10

它 returns Cell1.

我在这里错过了什么?

更新:

我在 Offset(0,-3) 处有一个标签 如果一个值更大,那么我会得到适当的标签。 当值相等时,我会特别贴上标签。 由于我没有定义值相等时的结果,我想知道我错过了什么 关于此函数的行为,以便当它们相等时它将选择一个值而不是另一个值。 我认为还需要多少编码?

Function testWinner(rng As Range) As String
  testWinner = WorksheetFunction.Index(rng, WorksheetFunction.Match(WorksheetFunction.max(rng), rng, 0)).Offset(0, -3)
End Function

WorksheetFunction.Max 不 return 一个 cell/range。它 return 是一组值中的最大值。

顺便说一句:如果两个值相等 (10,10),MinMax平均函数将是相同的:10.

如果说函数的行为是指它的工作原理,它会对数据进行排序并获得最高值。因此,在一组值的情况下:{10, 10, 8}

Max(10,10,8)** = 10
Max.K({10,10,8},2) = 10 'where K = 2, which means the second highest value
Max.K({10,10,8},3) = 8  'where K = 3, which means the third highest value

另一方面...

 row/column     A    B

    1           10   =RANK(A:A,A1) 'returns 1
    2           10   =RANK(A:A,A2) 'returns 1
    3           8    =RANK(A:A,A3) 'returns 3

现在是不是更容易理解了?

这与 Max 无关(现在您已经编辑了问题)。 Max 只是 returns 值(因为它们都是相同的)并且您的 Match 函数正在寻找 完全匹配 因此它会扫描范围直到找到第一个匹配项,然后将该位置传递给索引。

在您更新的示例中,您的 testWinner 函数中发生以下情况:

  1. 最大 已确定:在示例 1 中为 15(在示例 2 中为 14)。请注意,只有值而不是对任何单元格的引用是 returned
  2. MATCH 函数通过 D2:D3 搜索值 15 (14)。它是自上而下的,并且 return 第一个完全匹配。 IE。在第一个示例中,结果为 1(在第二个示例中,结果为 2
  3. INDEX 将 return D2:D3 的第 2 个元素(第二个示例中的 1st),即单元格 D2(示例 2 中的 D3)
  4. OFFSET return 向左三个单元格

因此,您的问题的答案不是 MAX 函数的 return - 而是 MATCH 函数 - 它从上到下直到找到符合您条件的第一个元素,在您的例子中是 max .

与此无关:为什么为此使用用户定义函数?如果您使用正常的 Excel 函数构建它,性能会更高 - 非 VBA 用户仍然可以理解它。使用 =INDEX($A:$A,MATCH(MAX($D:$D),$D:$D,0)) 您将保存 OFFSET - 并使其不易出错,因为您现在可以在 A 和 D 之间插入列而不会破坏您的模型!