如何将excel范围传递给期望双ptr的c ++函数

时间:2011-01-03 23:16:19

标签: c++ vba excel-vba excel

我是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

但是这不起作用(编译和运行,但产生虚假结果)。

感谢任何帮助

3 个答案:

答案 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)))