我在这里要做的只是保存对当前活动窗口的引用,但它似乎不起作用。它在最后一行给了我一个运行时错误。
Dim SourceWindow As Window, QACheckWindow As Window
SourceWindow = ActiveWindow
我不确定为什么。不ActiveWindow
应该返回当前活动的窗口吗?如果没有,我该如何引用它?
编辑:以上内容正好在我的功能的开头,所以之前的所有内容Sub FuncName()
我在这里要做的只是保存对当前活动窗口的引用,但它似乎不起作用。它在最后一行给了我一个运行时错误。
Dim SourceWindow As Window, QACheckWindow As Window
SourceWindow = ActiveWindow
我不确定为什么。不ActiveWindow
应该返回当前活动的窗口吗?如果没有,我该如何引用它?
编辑:以上内容正好在我的功能的开头,所以之前的所有内容Sub FuncName()
在 VB 中,对象变量需要指定Set
关键字。作为对象的对象属性也需要是Set
. 当分配不使用该关键字时,会引发运行时错误 91“未设置对象变量”。
这是继承自legacy Let
key to assign values,和Set
keyword to assign references;最终被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
是一个对象,就像它是一个值一样分配 - 这会导致 VBA通过默认成员调用尝试强制强制。如果对象未初始化,则成员调用失败并出现错误 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 分配了values和references,而无需指定 aLet
或 a Set
,因为在 .net 中,考虑到所有事物最终如何派生自System.Object
...包括System.ValueType
. 这就是为什么关键字在 VB.net 中也被弃用的原因,Set
也是为什么用于定义属性的 VB.net 语法放弃了Let
支持Set
- 因为无参数默认成员在 VB.NET 中是非法的,所以这种模棱两可的 let-coercion不会发生。