Для переменных объекта VB требуется назначить ключевое слово Set
. Объектные свойства, которые также являются объектами, также должны быть Set
. Ошибка выполнения 91 «объектная переменная не установлена» возникает, когда присвоение не использует это ключевое слово.
Это унаследовано от ключевого слова наследия Let
для присвоения значений и Set
, чтобы назначить ссылки ; Let
в конечном итоге был устаревшим (хотя все еще необходим для определения свойств), а остался Set
, оставив синтаксис присваивания значения VB6 / VBA, например [Let] variable = value
, где «Let» является необязательным.
In объявление и назначение:
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
. Вот почему ключевое слово Set
также устарело в VB.net , а также почему синтаксис VB.net для определения свойств сбросил Let
в пользу Set
.