iT邦幫忙

1

函數寫成VBA

U2儲存格函數如下,I2為動態數字
=IF(I2<=-4000,"1",
IF(I2<=-2000,"2",
IF(I2<=-1000,"3",
IF(I2>=4000,"4",
IF(I2>=2000,"5",
IF(I2>=1000,"6",
IF(AND(I2>=500,I2<=-500),"","000")))))))

我想轉換成VBA方式來完成,可以怎麼寫呢!

2 個回答

0
pcw
iT邦研究生 3 級 ‧ 2019-03-24 09:51:49

可是試試用select case statement

revised on 2019-03-24 11:36

function udf_myCompare(myNum as double) as variant
    select case myNum
    case is <= -4000
        udf_myCompare = 1
    case is <= -2000
        udf_myCompare = 2
    case is <= -1000
        udf_myCompare = 3
    case is >= 4000
        udf_myCompare = 4
    case is >= 2000
        udf_myCompare = 5
    case is >= 1000
        udf_myCompare = 6
    case else
        udf_myCompare = "'000"
    end select
end function

U2寫下=udf_myCompare(i2)即可。

看更多先前的回應...收起先前的回應...
小魚 iT邦高手 1 級 ‧ 2019-03-24 10:10:58 檢舉

說真的, 這跟if不是差不多....
打的字好像也沒有比較少...
(想一想, 好像少了變數名稱)

pcw iT邦研究生 3 級 ‧ 2019-03-24 11:25:31 檢舉

在comparison operator(>, < , >=,...)中用 is keyword,可以讓Range("I2")少打很多次。

https://docs.microsoft.com/zh-tw/dotnet/visual-basic/language-reference/statements/select-case-statement

其實這種情況我會在excel試著用Vlookup函數(最後一個參數為True)。

小魚 iT邦高手 1 級 ‧ 2019-03-24 12:07:36 檢舉

少打很多次我覺得還好,
不過我通常會先用變數來接Range("I2"),
這樣子太長了,
另外其實我都是複製貼上的,
所以不會打很多次.
/images/emoticon/emoticon39.gif

goodnight iT邦研究生 4 級 ‧ 2019-03-29 22:26:01 檢舉

寫程式時, 不一定是為了少打字, 而是為了靈活的擴充性以及閱讀性
像你這樣, 我寧可寫程運算式, 未來數值改變或增加, 都不用再改寫程式
以你的巢狀 if , 不如看 case 來得清爽

0
海綿寶寶
iT邦超人 1 級 ‧ 2019-03-24 10:43:26
Sub Macro1()
    If Range("I2") <= -4000 Then
        Range("U2") = "1"
    ElseIf Range("I2") <= -2000 Then
        Range("U2") = "2"
    ElseIf Range("I2") <= -1000 Then
        Range("U2") = "3"
    ElseIf Range("I2") >= 4000 Then
        Range("U2") = "4"
    ElseIf Range("I2") >= 2000 Then
        Range("U2") = "5"
    ElseIf Range("I2") >= 1000 Then
        Range("U2") = "6"
    Else
        Range("U2") = "'000"
    End If
End Sub
erwinho iT邦新手 5 級 ‧ 2019-03-25 14:36:00 檢舉

Excel2016版以後的ifs,用法比if簡潔多了,跟寫select很像。

我要發表回答

立即登入回答