我在这里尝试做的就是保存对当前活动窗口的引用,但它似乎不起作用。它在最后一行给出了运行时错误。
Dim SourceWindow As Window, QACheckWindow As Window
SourceWindow = ActiveWindow
我不确定为什么。是不是ActiveWindow
应该返回当前活动的窗口?如果没有,我该如何引用它?
编辑:上面的内容正好在我的函数开头,所以在Sub FuncName()
答案 0 :(得分:22)
在VB对象变量中,需要分配Set
关键字。作为对象的对象属性也需要为Set
。当赋值不使用该关键字时,将引发运行时错误91“对象变量未设置”。
这是继承遗留的Let
关键字,用于分配值,Set
关键字用于分配引用; Let
最终被弃用(虽然仍然需要定义属性)并且Set
仍然存在,留下VB6 / VBA值赋值语法如[Let] variable = value
,其中“Let”是可选的。
在声明和作业中:
Dim SourceWindow As Window, QACheckWindow As Window
'this is like saying "Let SourceWindow = ActiveWindow":
SourceWindow = ActiveWindow
SourceWindow
是对象,分配好像是值 - 因此错误。
当访问非设置对象时,也会引发此错误; .net等价物将是NullReferenceException
:
Dim SourceWindow As Window, Dim WindowTitle As String
'"SourceWindow" reference isn't set, the object can't be accessed yet:
WindowTitle = SourceWindow.Caption
我在这里会有点过分,但遗留的Let
语句不应与Let
子句混淆(在VB.net中,在LINQ 查询语法(在VB.net中),计算一个值并将其分配给一个新的查询范围变量(例如取自MSDN) :
From p In products
Let Discount = p.UnitPrice*0.1 '"Discount" is only available within the query!
Where Discount >= 50
Select p.ProductName, p.UnitPrice, Discount
VB.net分配值和引用,而无需指定Let
或Set
,因为在.net中鉴于所有事物最终都来自System.Object
......包括System.ValueType
,所以区别是一条更细的界限。这就是为什么the Set
keyword was also deprecated in VB.net,以及定义属性的VB.net语法为什么放弃了Let
以支持Set
。