2012-10-16 52 views
0

我可以做以下獲得中位數的值的範圍,不包括在Excel負和非數字值:平均剔除負值和非數值優於

=MEDIAN(IF(ISNUMBER(B1:B8),IF(B1:B8>0,ROUND(B1:B8,2)))) 

如何完成上述但在VBBA Excel?

數據可以是,數字, 「N/A」 的短語,和負值,

例如: 12,2,-4,N/A,3,4

+0

一些與這個公式並不加起來,它不計算值B1位數:B8,你似乎打算做的事。 – Jook

回答

1

作爲一個非常快的解決方案,您可以直接在vba中使用工作表函數。

這將是您的公式的一個例子是VBA

Dim myValue As Variant 
Dim myRange As Range 
Set myRange = Range("B1:B8") 
With Application.WorksheetFunction 
    myValue = 0 
    If .IsNumber(myRange(1, 1).Value) Then 
    If myRange(1, 1) > 0 Then 
     myValue = .Round(myRange(1, 1), 2) 
    End If 
    End If 
    Debug.Print .Median(myValue) 
End With 

不過,我不認爲,這是你的目標是相當的東西。也許你可以給出一個更好的數據例子,然後進行測試。

編輯:這個工程相當不錯

Sub jookCalc() 
    Dim myValues() As Variant 
    Dim myRange() As Variant 
    Dim i As Long 
    myRange = Range("B1:B8") 
    With Application.WorksheetFunction 
     ReDim myValues(LBound(myRange, 1) To LBound(myRange, 1)) 
     For i = LBound(myRange, 1) To UBound(myRange, 1) 
     If .IsNumber(myRange(i, 1)) Then 
      If myRange(i, 1) > 0 Then 
      myValues(UBound(myValues)) = .Round(myRange(i, 1), 2) 
      ReDim Preserve myValues(LBound(myRange, 1) To UBound(myValues) + 1) 
      End If 
     End If 
     Next i 
     Debug.Print .Median(myValues) 
    End With 
End Sub 
+0

Jook我在'if .isnumber(myRange)然後'得到一個類型不匹配,實際上,我試圖做同樣的事情,但得到相同的結果:( – Somebody

+0

啊 - doh - 當然'myRange'或更多顯式的'myRange.Value'是一個數組!你需要指定一個確切的值 – Jook

+0

,但你會發現,這就是爲什麼我懷疑你的公式沒有做到你期望的那樣,你應該創建一個數組或值的範圍,這符合你的標準,最終會得到像'.Median(myRange)' – Jook