我创建了一个包含名为“koduj”的函数的DLL。在Excel工作表单元格中使用该函数调用会返回所需的结果。但是,从VBA调用“koduj”将返回错误的答案。
“koduj”需要两个参数:“string nr_id”和“integer x1”。它计算ASCII表示中
我遵循了在这里找到的说明。
以下是我的.cpp源文件:
“koduj”需要两个参数:“string nr_id”和“integer x1”。它计算ASCII表示中
nr_id
的字母总和,并添加x1
。然后返回计算出的总和。我遵循了在这里找到的说明。
以下是我的.cpp源文件:
#include<Windows.h>
#include<string>
using namespace std;
//Convert BSTR to wstring for convenience
wstring BSTR_to_wstring (BSTR text){
return wstring(text, SysStringLen(text));
}
//Calculate sum of letters in ASCII representation
int ASCII_sum (wstring ws){
int sum = 0;
for (unsigned int i = 0; i < ws.length(); i++)
sum += ws[i];
return sum;
}
//"koduj" function
int _stdcall koduj (BSTR nr_id, int & x1){
wstring ws_nr_id = BSTR_to_wstring(nr_id);
return ASCII_sum(ws_nr_id) + x1;
}
这是我的VBA函数声明:
Declare Function koduj _
Lib "<dll_directory_and_full_name>" (ByVal x As String, ByRef y As Integer) As Integer
通过编写:
=koduj("aaa";1)
在单元格内,我获得了期望的结果(292)。
调试这段VBA代码:
Sub test()
Dim a As Integer
a = koduj("aaa", 1)
End Sub
显示错误结果(a = 24930)
我相信我的C++代码没有问题,因为在从Excel的工作表中调用时它能正常工作。
a
定义为Variant类型 - 你得到了相同的结果吗? - enderlandDebug.Print koduj("Ab", 1) - koduj("Aa", 1)
,您会得到256,这让我感到非常奇怪。 - enderland