我在这里要做的就是保存对当前事件窗口的引用,但它似乎不起作用。它在最后一行给了我一个运行时错误。
Dim SourceWindow As Window, QACheckWindow As Window
SourceWindow = ActiveWindow
我不确定为什么。不是
ActiveWindow
应该返回当前事件的窗口?如果没有,我如何引用它?编辑:上面是我函数的开头,所以在它之前是
Sub FuncName()
最佳答案
在 VB 对象变量中需要 Set
要分配的关键字。作为对象的对象属性也需要是 Set
.当赋值不使用该关键字时,会引发运行时错误 91“未设置对象变量”。
这是从旧版 Let
继承而来的用于赋值的关键字,以及 Set
分配引用的关键字; Let
最终被弃用(尽管仍然需要定义属性)和 Set
保留,保留 VB6/VBA 赋值语法,如 [Let] variable = value
,其中“让”是可选的。
在声明和赋值中:
Dim SourceWindow As Window, QACheckWindow As Window
'this is like saying "Let SourceWindow = ActiveWindow":
SourceWindow = ActiveWindow
SourceWindow
是一个对象,就好像它是一个值一样分配 - 这会导致 VBA 尝试通过默认成员调用进行 let-coercion。如果对象未初始化,则成员调用失败并返回错误 91。如果对象已初始化但没有默认成员,则会引发错误 438。因此,在这种情况下,由于隐式成员调用而引发错误 91; .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
- 因为无参数默认成员在 VB.NET 中是非法的,所以这种模棱两可的 let-coercion 不会发生。
关于VBA:运行时错误 '91' ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18927297/