Vba 所需变量can';t用括号指定此表达式

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

我正在用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 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