在同一行

时间:2017-12-14 17:00:52

标签: vba

在JavaScript和其他面向对象语言中,您可以实例化类的新实例,并在同一行中使用类实例的方法。例如:

class customClass {
    method(){
        return "hello"
    }
}
var s = (new customClass).method() // s = "hello"

如果我在VBA中尝试相同的操作:

s = (new customClass).method()

我得到Compile errorExpected: end of statement,同时在.之后突出显示customClass)

如果您愿意,可以执行以下操作:

Dim c as new customClass: s=c.method()

然而在这种情况下,在我看来,并不清楚s是否一直在设置使代码更难以管理。

是否有一种替代方法可以使线条清晰易懂,同时仍然可以快速轻松地编写?

3 个答案:

答案 0 :(得分:3)

当然可以。

With New Collection: .Add 42: Debug.Print .Count: End With

我可能想要把那个放在生产代码中的人嚼掉,但确定你可以

并不意味着你应该

请注意,出于某种原因,您无法在此类内联With块中获取With块变量引用的IntelliSense。

可能与 VBA代码有关或可能没有关系

如果要调用的方法不会改变全局或实例状态,请考虑在类上指定VB_PredeclaredId模块属性(导出模块,在记事本中编辑其标题,重新导入模块)

这样,这段代码变得合法,并且看起来更像VBA惯用语:

SomeCustomClass.SomeMethod

当人们UserForm1.Show离开默认实例而没有创建New对象时,这些机制与所涉及的相同。

答案 1 :(得分:2)

您可以将类的新实例传递给CallByName Function,并让它为您访问该方法。

Dim s As String: s = CallByName(New customClass, "method", VbMethod)

enter image description here

答案 2 :(得分:1)

目前我已经想到了解决这个问题的两种方法。

我提出的第一种方法有点笨拙,但它可以解决问题:

s = Array(new someClass)(0).method()

然而,一般来说这种方法非常混乱且难以阅读......所以我认为你可以改为使用辅助函数:

function proxy(a as variant) as variant
    if isObject(a) then
        set proxy = a
    else
        proxy = a
    end if
end function

sub textProxy()
    s = proxy(new someClass).method()
    debug.print s
end sub

然而,在这两个例子中你都失去了知识分子是一种耻辱......但我认为VBE的问题比方法本身更多。