2014-03-31 28 views
1

所以我從我的Excel文件中用VBA和ExcelPython引用調用python腳本。該Python腳本工作正常,除了Excel中不斷告訴我,我有注意的行類型不匹配:ExcelPython返回類型不匹配問題

Function calcCapValue(times As Range, fRates As Range, strike As Range, vol As Range, delta As Double, pv As Range) As Variant 

    Set methods = PyModule("PyFunctions", AddPath:=ThisWorkbook.Path) 
    Set result = PyCall(methods, "CalculateCapValue", KwArgs:=PyDict("times", times.Value2, "fwdRates", fRates.Value2, "strike", strike.Cells(1, 1).Value2, "flatVol", vol.Cells(1, 1).Value2, "delta", delta, "pv", pv.Cells(1, 1).Value2)) 

    calcCapValue = PyVar(PyGetItem(result, "res")) ' <--- TYPE MISMATCH HERE 

    Exit Function 

End Function 

想不通爲什麼,我在下面從這裏示例代碼:https://sourceforge.net/p/excelpython/wiki/Putting%20it%20all%20together/ 這裏:http://www.codeproject.com/Articles/639887/Calling-Python-code-from-Excel-with-ExcelPython

仍然得到這種類型不匹配,我不明白爲什麼。

這裏的python腳本:

#imports 
import numpy as np 
from scipy.stats import norm 

# 
# Cap Price Calculation 
# 
def CalculateCapValue(times, fwdRates, strike, flatVol, delta, pv): 

    capPrice = 0; 


    #Iterate through each time for caplet price 

    for i in range(0, len(times)): 

     ifr = float(fwdRates[i][0]) 
     iti = float(times[i][0]) 

     d1 = (np.log(ifr/strike)+((flatVol**2)*iti)/2)/(flatVol*np.sqrt(iti)) 
     d2 = d1 - (flatVol*np.sqrt(iti)) 
     Nd1 = norm.cdf(d1) 
     Nd2 = norm.cdf(d2) 

     capPrice += pv*delta*(ifr*Nd1 - strike*Nd2) 

    return {"res": capPrice} 

謝謝!

+0

我不Python的工作,但無論是'PyVar'或'PyGetItem'期待特定類型的輸入,它是沒有得到這。因此輸入不匹配錯誤。 –

+1

有趣。就在你從Python函數返回之前,你能找出'type(capPrice)'是什麼嗎?雖然我不會說'PyVar'正在等待一個*特定的*類型(畢竟,它正在嘗試創建一個VBA變體),但它可能仍然會變成VBA無法理解的類型。阻力最小的路徑是在Python返回之前對Python進行一些額外的處理,將數據轉換爲VBA *可以理解的內容。 –

回答