我所要做的就是保存對當前活動窗口的引用,但似乎並不奏效。它給了我最後一行的運行時錯誤。VBA:運行時錯誤'91'?
Dim SourceWindow As Window, QACheckWindow As Window
SourceWindow = ActiveWindow
我不完全確定爲什麼。 ActiveWindow
是否應該返回當前活動的窗口?如果不是,我該如何參考它?
編輯:以上是對我的函數的開始,因此所有存在之前,它是Sub FuncName()
我所要做的就是保存對當前活動窗口的引用,但似乎並不奏效。它給了我最後一行的運行時錯誤。VBA:運行時錯誤'91'?
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
,其中「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
。
+1很好的解釋! –
謝謝。從其他語言來看,'Set'似乎有點冗長冗長。 – supercheetah
不應該是'Set SourceWindow = ActiveWindow'嗎? –
啊哈!是的,我不使用VB,因爲它似乎顯示。謝謝。 – supercheetah
[VBA運行時錯誤91]的可能重複(http://stackoverflow.com/questions/9160483/vba-run-time-error-91) –