2013-09-20 195 views
2

我所要做的就是保存對當前活動窗口的引用,但似乎並不奏效。它給了我最後一行的運行時錯誤。VBA:運行時錯誤'91'?

Dim SourceWindow As Window, QACheckWindow As Window 
SourceWindow = ActiveWindow 

我不完全確定爲什麼。 ActiveWindow是否應該返回當前活動的窗口?如果不是,我該如何參考它?

編輯:以上是對我的函數的開始,因此所有存在之前,它是Sub FuncName()

+3

不應該是'Set SourceWindow = ActiveWindow'嗎? –

+0

啊哈!是的,我不使用VB,因爲它似乎顯示。謝謝。 – supercheetah

+0

[VBA運行時錯誤91]的可能重複(http://stackoverflow.com/questions/9160483/vba-run-time-error-91) –

回答

7

在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分配既引用,而無需指定LetSet,因爲在.NET這種區分是非常薄線,如何給出最終一切從System.Object派生...包括System.ValueType。這就是爲什麼the Set keyword was also deprecated in VB.net,以及爲什麼用於定義屬性的VB.net語法降低了Let而支持Set

+1

+1很好的解釋! –

+0

謝謝。從其他語言來看,'Set'似乎有點冗長冗長。 – supercheetah