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),Min、Max 和平均函数将是相同的: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 中为
15
(在示例 2 中为 14
)。请注意,只有值而不是对任何单元格的引用是 returned
- MATCH 函数通过 D2:D3 搜索值 15 (14)。它是自上而下的,并且 return 第一个完全匹配。 IE。在第一个示例中,结果为
1
(在第二个示例中,结果为 2
)
- INDEX 将 return D2:D3 的第
2
个元素(第二个示例中的 1
st),即单元格 D2(示例 2 中的 D3)
- OFFSET return 向左三个单元格
因此,您的问题的答案不是 MAX 函数的 return - 而是 MATCH 函数 - 它从上到下直到找到符合您条件的第一个元素,在您的例子中是 max .
与此无关:为什么为此使用用户定义函数?如果您使用正常的 Excel 函数构建它,性能会更高 - 非 VBA 用户仍然可以理解它。使用 =INDEX($A:$A,MATCH(MAX($D:$D),$D:$D,0))
您将保存 OFFSET - 并使其不易出错,因为您现在可以在 A 和 D 之间插入列而不会破坏您的模型!
当被比较的值相等时,此函数的行为是什么? 如果
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),Min、Max 和平均函数将是相同的: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 中为
15
(在示例 2 中为14
)。请注意,只有值而不是对任何单元格的引用是 returned - MATCH 函数通过 D2:D3 搜索值 15 (14)。它是自上而下的,并且 return 第一个完全匹配。 IE。在第一个示例中,结果为
1
(在第二个示例中,结果为2
) - INDEX 将 return D2:D3 的第
2
个元素(第二个示例中的1
st),即单元格 D2(示例 2 中的 D3) - OFFSET return 向左三个单元格
因此,您的问题的答案不是 MAX 函数的 return - 而是 MATCH 函数 - 它从上到下直到找到符合您条件的第一个元素,在您的例子中是 max .
与此无关:为什么为此使用用户定义函数?如果您使用正常的 Excel 函数构建它,性能会更高 - 非 VBA 用户仍然可以理解它。使用 =INDEX($A:$A,MATCH(MAX($D:$D),$D:$D,0))
您将保存 OFFSET - 并使其不易出错,因为您现在可以在 A 和 D 之间插入列而不会破坏您的模型!