В переменных объекта 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
.
Не должно быть 'Set SourceWindow = ActiveWindow'? –
Aha! Да, я не использую VB так, как кажется. Благодарю. – supercheetah
Возможный дубликат [Ошибка времени выполнения VBA 91] (http://stackoverflow.com/questions/9160483/vba-run-time-error-91) –