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 那一段為加減因功率因數所產生應增收或是減少的電費
儲存格上的錯誤是 #VALUE!
錯誤的值,我有打開 fx看計算結果,是空白的
請知道哪邊錯的大大,跟我說一下囉
感謝各位的意見
最後我用 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 畢竟是變通方法,
用正常取陣列值的方式如上即可 ~
- WayArBellLv 71 十年前
問題好像不是兩個 Variant 的關係, 兩個 Variant 不會出問題,
WorksheetFunction.MMult(PDate, Lv1) 要做陣列相乘, 需要兩個 Range,
它執行的結果會傳回一個 range, 然後你把它和 Lv1Dag 相乘,
問題是一個 Lv1Dag 究竟是什麼型態? 一個 Range 物件可以直接和 Lv1Dag 相乘???