2013-09-20 4 views
2

Все, что я пытаюсь сделать, это сохранить ссылку на текущее активное окно, но оно, похоже, не работает. Это дает мне ошибку времени выполнения на последней строке.VBA: ошибка времени выполнения '91'?

Dim SourceWindow As Window, QACheckWindow As Window 
SourceWindow = ActiveWindow 

Я не совсем уверен, почему. Разве не ActiveWindow должен возвращать текущее активное окно? Если нет, как я могу сделать ссылку на него?

EDIT: Выше находится в самом начале моей функции, так что все есть, прежде чем она Sub FuncName()

+3

Не должно быть 'Set SourceWindow = ActiveWindow'? –

+0

Aha! Да, я не использую 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 назначает оба значения и ссылки, без необходимости указывать Let или ее Set, потому что в .net это различие гораздо тоньше линия, учитывая то, как все в конечном счете происходит от System.Object ... включая System.ValueType. Вот почему the Set keyword was also deprecated in VB.net, а также почему синтаксис VB.net для определения свойств упал Let в пользу Set.

+1

+1 отличное объяснение! –

+0

Спасибо. Исходя из других языков, 'Set' выглядит немного излишне подробным. – supercheetah

Смежные вопросы