Vba 所需变量can';t用括号指定此表达式
我正在用VBA开发一个宏,出于某种原因,我需要在调用函数时为变量添加括号。 我这样做是为了使我的代码与MAC上的VBA交叉,并与C++库进行数据交换。 我有一个复制错误的代码示例Vba 所需变量can';t用括号指定此表达式,vba,excel,Vba,Excel,我正在用VBA开发一个宏,出于某种原因,我需要在调用函数时为变量添加括号。 我这样做是为了使我的代码与MAC上的VBA交叉,并与C++库进行数据交换。 我有一个复制错误的代码示例 Private Type S0 x As Double End Type Private Type S1 s_0 As S0 End Type Private Type S2 s_1() As S1 End Type
Private Type S0
x As Double
End Type
Private Type S1
s_0 As S0
End Type
Private Type S2
s_1() As S1
End Type
Private Sub RunMe()
Dim l As S2
ReDim l.s_1(1 To 2)
'no error
Call Display(l.s_1(1).s_0)
'compilation error : variable required can't assign to this expression
Call Display((l.s_1(1).s_0))
End Sub
Private Sub Display(d As S0)
MsgBox d.x
End Sub
如您所见,用附加括号调用函数Display是不符合逻辑的,但我不知道为什么,在基本情况下是这样工作的
如果我只使用基本类型,它就可以工作。我认为这与用户定义类型有关
因此,我有两个问题:
- 在我的示例中添加括号时,VBA组件是什么
- 如何避免编译错误并保持相同的组件
非常感谢您阅读我的文章并帮助我 在
VBA
中,默认的变量传递方法是ByRef
。但“即使被调用的过程已将其参数声明为ByRef,也可以通过将每个参数括在括号内来强制将其参数声明为ByVal。”请参阅
因此,您的调用显示((l.s_1(1).s_0))
尝试将(l.s_1(1.s_0)
作为用户定义的类型S0
ByVal
但是。这就是错误的原因。在
VBA
中,默认的变量传递方法是ByRef
。但“即使被调用的过程已将其参数声明为ByRef,也可以通过将每个参数括在括号内来强制将其参数声明为ByVal。”请参阅
Private Type S0
x As Double
End Type
Private Type S1
s_0 As S0
End Type
Private Type S2
s_1() As S1
End Type
Private Sub RunMe()
Dim l As S2
ReDim l.s_1(1 To 2)
'no error
Call Display(l.s_1(1).s_0)
'compilation error : variable required can't assign to this expression
Call Display((l.s_1(1).s_0))
End Sub
Private Sub Display(d As S0)
MsgBox d.x
End Sub
因此,您的调用显示((l.s_1(1).s_0))
尝试将(l.s_1(1.s_0)
作为用户定义的类型S0
ByVal
但是。这就是错误的原因。对于您的第一个问题:查看我的答案。关于你的第二个问题:不要用括号括起来。为什么你需要它们?在MAC上,如果在显示调用之后从库调用C++函数,我就无法检索数组Sy1。我只有一个指向数据内存地址的空指针(SAFEARRAY*类型和pvData)。它在PC机下工作得很好,因为VBA数组是一个安全的,它是本地的(Windows框架),并且易于在C++上使用。但是在MAC上,我必须重新定义C++中的这个结构,除非我把数组的一个子部分传递给C++函数之前的函数,否则它工作得很好。关于你的第二个问题:不要用括号括起来。为什么你需要它们?在MAC上,如果在显示调用之后从库调用C++函数,我就无法检索数组Sy1。我只有一个指向数据内存地址的空指针(SAFEARRAY*类型和pvData)。它在PC机下工作得很好,因为VBA数组是一个安全的,它是本地的(Windows框架),并且易于在C++上使用。但是在MAC上,我必须重新定义C++中的这个结构,而且它的工作效果很好,除非我把数组的一个子部分传递给C++函数之前的函数。谢谢。我很明白括号后面的意思。所以,我需要为我的案子找到解决办法。谢谢。我很明白括号后面的意思。所以,我需要为我的案子找到解决办法。最好的
Private Type S0
x As Double
End Type
Private Type S1
s_0 As S0
End Type
Private Type S2
s_1() As S1
End Type
Private Sub RunMe()
Dim l As S2
ReDim l.s_1(1 To 2)
'no error
Call Display(l.s_1(1).s_0)
'compilation error : variable required can't assign to this expression
Call Display((l.s_1(1).s_0))
End Sub
Private Sub Display(d As S0)
MsgBox d.x
End Sub