繁体   English   中英

Excel或VBA的异常行为

[英]Strange behavior of Excel or VBA

我正在C / C ++中为VBA创建一个.dll库。 它包含通过RS232串行端口进行通信的功能,并且数据将在Excel中处理。 一切正常,但是我对在Excel下工作的VBA的奇怪行为感到困惑。 我有2个功能。 一用于写入,一用于读取。 当我从VBA向其中一个发送端口号(例如3)时,不管哪个端口,并在函数接收到端口号后将其打印出来,它都会显示十进制值3正确。 但是,当我将完全相同的包含数字3的变量发送到第二个变量时,函数接收到51,这是十进制值“ 3”的字符。 因此,首先VBA发送整数,然后以某种方式更改并发送十进制值“ 3” char。 在我的函数中打印可以更改值的接收变量之前没有代码。

这是我的功能的简化代码,仅供参考。

int __stdcall PortRead(short int & Port){
   printf("%d   %c\n",Port,Port);
   return 0;
}

int __stdcall PortWrite(short int & Port, BSTR & Message){
   printf("%d   %c\n",Port,Port);
   return 0;
}

这是VBA代码:

Declare Function PortRead Lib "rs232_r.dll" (ByRef x As Integer) As Integer
Declare Function PortWrite Lib "rs232_w.dll" (ByRef x As Integer, ByRef y As String) As Integer
Dim Message As String
Dim PortNumber As Integer

Sub Example()
PortNumber = 3
Message = ":trac:data?"
aa = PortWrite(PortNumber, Message)
Debug.Print aa
xx = PortRead(PortNumber)
Debug.Print xx
End Sub

就像我说的那样,当我向两个函数发送一个变量时,传递的值将不同,但是当我像下一个示例一样更改它时,两个函数将接收相同的正确值。

Declare Function PortRead Lib "rs232_r.dll" (ByRef x As Integer) As Integer
Declare Function PortWrite Lib "rs232_w.dll" (ByRef x As Integer, ByRef y As String) As Integer
Dim Message As String
Dim PortNumber1 As Integer
Dim PortNumber2 As Integer
Dim Number As Integer

Sub Example()
Number = 3
PortNumber1 = Number
PortNumber2 = Number
Message = ":trac:data?"
aa = PortWrite(PortNumber1, Message)
Debug.Print aa
xx = PortRead(PortNumber2)
Debug.Print xx
End Sub

如果已经问过这个问题,或者对于幼儿园的程序员来说,我很抱歉,但是我很好奇。 谢谢。

在VBA中,尝试将ByRef更改为ByVal

发布的代码映射“ integer = int”和“ integer = short int”。 哪有 (您是编译32位cpp还是64位cpp?)。

如果您的声明无效,Excel将修复堆栈,并且Excel不会崩溃,因此您不应依赖崩溃的Excel来查找无效的声明。

当您从VBA ByRef调用C ++函数时,您可能希望在C ++函数中收到一个引用,例如

short int & Port

但是VBA中的ByRef在C ++中的意思是“ ByPointer”。

所以我发现了一个问题。 如您所建议,我仔细研究了发送给函数ByRef的参数。 经过几次实验,我发现了我的错误。 我通过引用向函数发送了一个数字,这意味着我仅发送了内存地址而不是一个值。 然后我的第一个函数由于转换为char和创建字符串而进行了很少的计算,并且由于对先前的内存地址进行了计算而保存了新的更改值。 因此,当我也通过引用将变量发送到第二个函数时,保存在内存地址中的值已被第一个函数更改。 所以我自己重写变量的值。 在解决此问题时,我对微软对其产品的粗鲁言论表示歉意。 :)谢谢队友

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM