在JavaScript和其他面向对象语言中,您可以实例化类的新实例,并在同一行中使用类实例的方法。例如:
class customClass {
method(){
return "hello"
}
}
var s = (new customClass).method() // s = "hello"
如果我在VBA中尝试相同的操作:
s = (new customClass).method()
我得到Compile error
:Expected: end of statement
,同时在.
之后突出显示customClass)
。
如果您愿意,可以执行以下操作:
Dim c as new customClass: s=c.method()
然而在这种情况下,在我看来,并不清楚s
是否一直在设置使代码更难以管理。
是否有一种替代方法可以使线条清晰易懂,同时仍然可以快速轻松地编写?
答案 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)
答案 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的问题比方法本身更多。