我是vba和excel编程的新手,所以请原谅我这是一个愚蠢的问题。
我有一个带有函数的c ++ dll
double foo(int n_bar, double* bar);
我想使用vba从excel调用。我已将vba中的函数声明为
Declare Function foo Lib "mylib" (ByVal n_bar As Long, bar As Double) As Double
我在vba中有另一个包装函数,我将从电子表格中调用
Function wrapper(a As Range) As Double
包装函数的主体必须看起来像调用c ++函数一样?我最好的猜测是
Function wrapper(a As Range) As Double
Dim retval As Double
'after making sure there is only one column...
retval = foo(a.Rows.Count, a.Cells(1,1))
End Function
但是这不起作用(编译和运行,但产生虚假结果)。
感谢任何帮助
答案 0 :(得分:1)
声明双参数时需要使用byref。或者甚至更好地定义C函数以接收double值作为值参数。
答案 1 :(得分:0)
好的,我弄清楚了,但它并不漂亮:
Function wrapper(a As Range) As Double
Dim tmp() as Double
Redim tmp(a.Rows.Count -1)
For Counter = 1 To a.Rows.Count
tmp(Counter-1) = a.Cells(Counter,1).Value
Next Counter
wrapper = foo(a.Rows.Count, hist(0))
End Function
为什么范围从1开始,但数组从0开始? 为什么数组定义为
Dim a(5) as Double
有6个要素?
如果有人有更好的方法,请告诉我
答案 2 :(得分:-1)
a.Cells(1,1)可以是String,变种,等等。所以为了确保类型安全,请尝试
foo(Cdbl(a.cells(1,1)))