2015-01-05 58 views
0

當被比較的值相等時,此函數的行爲是什麼? 如果Excel中的Visual Basic - WorksheetFunction.max

Cell1 = 10 
Cell2 = 11 

Debug.Print WorksheetFunction.max(Cell1,Cell2) 

將返回Cell2。但是,如果

Cell1 = 10 
Cell2 = 10 

它返回Cell1。

我在這裏錯過了什麼?

UPDATE:

我有一個標籤在偏移(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 

Result when one value is larger Result when values are equal

+2

當兩者的值相同時,您如何確定它正在返回「Cell1」,Max最終返回10?如果值相等,則「Max」將簡單地返回該值。 – Rory

回答

0

在更新後的例子下面你testWinner功能發生了:

  1. 的最大確定:例如,一個在這15(例如2這是14)。請注意,只返回值但不返回任何單元格的引用
  2. MATCH函數通過D2:D3搜索值15(14)。它自上而下返回第一個完全匹配。即在第一示例中,這導致1(在第二示例中的結果是2
  3. INDEX將返回D2的2第二元件:D3(該1 ST在第二個例子),即細胞D2(D3在離2)
  4. OFFSET返回小區三到左

因此,回答你的問題是不是MAX函數的返回 - 但MATCH函數 - 肚裏從上到下直到找到第一個元素符合你的標準,在你的情況下最大。

獨立於此:你爲什麼要爲此使用用戶定義函數?如果您使用普通的Excel函數構建它,性能會更高 - 而非VBA用戶仍然可以理解它。使用=INDEX($A$2:$A$3,MATCH(MAX($D$2:$D$3),$D$2:$D$3,0))您可以節省OFFSET - 並使其不易出錯,因爲您現在可以在A和D之間插入列而不會破壞模型!

+0

好問題。我使用了UDF,因爲我是VB新手,在我的谷歌搜索中,這是我能找到的最佳答案。 此外,範圍選擇是可變的,所以我需要輸入靈活性。 你的解釋很有幫助。就像Maciej Los一樣。 但是,您的回覆最有幫助。 –

+0

更好地使用沒有UDF的Excel公式!關於範圍:您可以簡單地引用整列('$ D:$ D'),使用[動態命名範圍](http://www.ozgrid.com/Excel/DynamicRanges.htm) - 甚至更好:將您的數據設置爲Excel表格(插入 - >表格),並在您之後建立公式時自動調整範圍/添加數據! –

+0

你爲什麼主張這個職位? 這不僅僅是獲得答案,我還想提高我在VBA編程方面的技能。 此外,我的數據的形狀可能不適合您的方法,除非這是比較兩個值並根據所選一個返回信息的問題的一般答案。 不確定什麼樣的設計模式是... –

1

WorksheetFunction.Max不返回小區/範圍。它返回一組值中的最大值。

順便說一句:在當兩個值相等(10,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$1:A$3,A1) 'returns 1 
    2   10 =RANK(A$1:A$3,A2) 'returns 1 
    3   8 =RANK(A$1:A$3,A3) 'returns 3 

是不是更容易理解,現在呢?

+0

我知道。這不是問題。 –

+0

@KenIngram,我回答了你的問題。函數返回最大值。在第二種情況下,兩個值都是相等的,所以它必須返回10.這就是全部。 –

+0

如果兩個值相等,Max(10,10),Min(10,10)和Average(10,10)的結果將是相同的:10. –

2

這與Max無關(現在您已編輯了您的問題)。 Max只是返回值(因爲它們都是相同的),並且您的Match函數正在查找完全匹配,所以它掃描範圍直到找到第一個匹配,然後該位置傳遞給Index。