4

像 C/CPP/CSharp/JScript 一样,我们如何在 VBA 中进行链式赋值?换句话说,VBA 是否具有赋值运算符的右结合性?

例如在 C-sharp 和 JavaScript 中,我们可以使用:

var alpha, bravo, charlie;
alpha = bravo = charlie = "hello";

现在在 VBA 中编写这个表达式必须:

Dim alpha, bravo, charlie
alpha = "hello"
bravo = "hello"
charlie = "hello"

但我们不能使用:

Dim alpha, bravo, charlie
alpha = bravo = charlie = "hello"

VBA 不允许折叠表达式。有没有其他方法可以做到这一点?

4

4 回答 4

5

不,VBA 没有赋值运算符的右结合性。但是,VBA 确实具有其他逻辑运算符的右关联性或链接操作。考虑以下表达式:

alpha = 3
bravo = 5
charlie = 4

alpha = bravo < charlie

MsgBox(alpha) 'would display false

alpha = 3
bravo = 5
charlie = 4

alpha = bravo > charlie < alpha

MsgBox(alpha) 'would display ture .. because (bravo > charlie) is true 
                                      'and true (or 1) less than alpha

但是,VBA 解释器优先于比较运算符而不是赋值运算符,两者都由=. 以机智,

alpha = bravo = "hello"
MsgBox(alpha) 'would display false, because bravo <> "hello"

因此,您需要显式地使用多个语句进行赋值。

于 2012-07-20T04:20:23.053 回答
1

而不是下面的分配功能,我会使用

Public Sub Assign(ParamArray varsAndValue() As Variant)
    Dim idx As Long
    Dim value As Variant

    If UBound(varsAndValue) < 1 Then
        Err.Raise 999, "Invalid call to «Assign»: Last argument should be the value to set, first upto one but last should be the variables"
    ElseIf UBound(varsAndValue) < 2 Then
        Err.Raise 999, "Why don't you use a normal assignment when you only need to assign one variable?"
    Else
        value = varsAndValue(UBound(varsAndValue))
        For idx = 0 To UBound(varsAndValue) - 1
            varsAndValue(idx) = value
        Next idx
    End If
End Sub
于 2013-07-10T13:49:57.227 回答
0

不是你想做的。这个问题表明 VB.net 中也不存在该功能。

正如所写,VBA 使用最左边的 = 符号将值分配给 alpha 和所有其他值以进行比较。

一次分配多个变量的唯一选择是使用数组。

这些例子来自这里

Dim myarray As Variant

myarray = Array("Cat", "Dog", "Rabbit")

或者

Dim MyStringArr() As String
MyStringArr = Split("Text1,Text2,Text3", ",")
于 2012-07-20T04:13:10.770 回答
0

你总是可以用这样的函数来做到这一点:

Private Function assign(var As Variant, value As Variant) As Variant
    var = value
    assign = value
End Function

Private Sub Form_Load()
    Dim alpha, bravo, charlie
    Call assign(alpha, assign(bravo, assign(charlie, "hello")))
    Debug.Print alpha, bravo, charlie
End Sub

...但它很快变得丑陋。

于 2012-07-20T11:34:03.987 回答