Yahoo 知識+ 將於 2021 年 5 月 4 日 (美國東岸時間) 停止服務,而 Yahoo 知識+ 網站現已轉為僅限瀏覽模式。其他 Yahoo 資產或服務,或你的 Yahoo 帳戶將不會有任何變更。你可以在此服務中心網頁進一步了解 Yahoo 知識+ 停止服務的事宜,以及了解如何下載你的資料。

Excel VBA 兩個Variant 變數運算時發生錯誤

以下是我的程式碼

Private Function PowerFee(PDate As Range, AllDay As Variant, PowerDag As Variant, PowerWork As Variant, Lv1Dag As Variant, Lv1 As Range, Lv2Dag As Variant, Lv2 As Range, Lv3Dag As Variant, Lv3 As Range, Lv4Dag As Variant, Lv4 As Range) As Variant

PowerFee = (WorksheetFunction.MMult(PDate, Lv1) * Lv1Dag + WorksheetFunction.MMult(PDate, Lv2) * Lv2Dag + WorksheetFunction.MMult(PDate, Lv3) * Lv3Dag + WorksheetFunction.MMult(PDate, Lv4) * (PowerDag - Lv4Dag)) / AllDay

If (PowerWork > 80) Then

PowerFee = PowerFee * (1 - 1 * (PowerWork - 80) * 0.0015)

Else

PowerFee = PowerFee * (1 + 1 * (80 - PowerWork) * 0.003)

End If

End Function

這是一個計算電費的公式( 營業用電 )

問題發生在最後的運算

當我要計算

WorksheetFunction.MMult(PDate, Lv1) * Lv1Dag

這兩個變數時發生錯誤(後面也是一樣的狀況)

這兩個變數型態都是Variant

為什麼無法相乘呢??

更新:

參數說明

PDate 為每月用電天數,通常會橫跨三月

AllDay為每期計價天數應為PDate相加之和

PowerDag 用電度數 PowerWork 用電功率

Lv1Dag ~ Lv4Dag 基本用電階層 ( 有四階 )

Lv1~Lv4 每一階在每一月的每度電之電費

IF 那一段為加減因功率因數所產生應增收或是減少的電費

更新 2:

儲存格上的錯誤是 #VALUE!

錯誤的值,我有打開 fx看計算結果,是空白的

請知道哪邊錯的大大,跟我說一下囉

更新 3:

感謝各位的意見

最後我用 SUM() 這個函數來對MMUL()在做運算一次

這樣就可以了

SUM可以對RANGE內所有的數做相加然後傳回一個數值

我的 PDATE 與 LV1 為 1*3 與 3*1 的陣列

相乘之後得到的是 1*1 的陣列 再用 SUM轉成數值

就可以在進行後面的運算

有點麻煩不過對VB來說還蠻合理的

2 個解答

評分
  • 匿名
    1 十年前
    最愛解答

    請提供檔案較易找問題 : http://www.funp.net/

    2009-03-17 02:08:43 補充:

    MMult 引數可以是 Range 或 陣列 ~

    2009-03-25 23:57:47 補充:

    以下寫法較有效率, 謹供參考 :

    WorksheetFunction.MMult(PDate, Lv1)(1,1)

    application.MMult(PDate, Lv1)(1,1)

    2009-03-26 01:11:25 補充:

    用 SUM 畢竟是變通方法,

    用正常取陣列值的方式如上即可 ~

  • 1 十年前

    問題好像不是兩個 Variant 的關係, 兩個 Variant 不會出問題,

    WorksheetFunction.MMult(PDate, Lv1) 要做陣列相乘, 需要兩個 Range,

    它執行的結果會傳回一個 range, 然後你把它和 Lv1Dag 相乘,

    問題是一個 Lv1Dag 究竟是什麼型態? 一個 Range 物件可以直接和 Lv1Dag 相乘???

還有問題嗎?立即提問即可得到解答。