Помогите пожалуйста понять логику работы эотй функции из Уокенбаха (цитата и код из книги ниже).
Непонятно, что такое в строке[vba]
Код
20 IsInCollection = Not Obj Is Nothing
[/vba] То есть, в случае , когда в строке 10 объектной переменной Obj не удалось присвоить объект например Workbook.Sheet1 , то оператор on error resume next запускает работу строки 20 где написано, что функция isincollection = not и переменная "Obj это ничего" Зачем писать , что переменная Obj is nothing , если это итак понятно , так как в 10й строке кода ей ничего не присвоилось?
И второе, что будет если ошибки не будет , то есть в 10й строке переменной Obj нормально присвоится объект Workbook.Sheet1 ? Судя по коду, в этом случае опять будет выполняться та же самая строка 20 , где функция isincollection = not и переменная "Obj это ничего"
Цитата из книги: Следующая функция представляет собой образец «групповой» функции, с помощью которой можно определить, является ли объект членом коллекции.
[vba]
Код
Private Function IsInCollection(Coln As Object, _ Item As String) As Boolean Dim Obj As Object On Error Resume Next 10 Set Obj = Coln(Item) 20 IsInCollection = Not Obj Is Nothing End Function
[/vba]
Эта функция имеет два аргумента: коллекцию (объект) и элемент (строка), который может быть либо не быть членом коллекции. Функция будет создавать объектную переменную, представляющую элемент коллекции. Если попытка увенчается успехом, функция возвратит True; иначе — False. Функцию IsInCollection можно использовать вместо трех других функций, приведенных выше. Чтобы определить, содержится ли в активной рабочей книге диапазон Data, вызовите функцию IsInCollection с помощью следующего оператора:
Помогите пожалуйста понять логику работы эотй функции из Уокенбаха (цитата и код из книги ниже).
Непонятно, что такое в строке[vba]
Код
20 IsInCollection = Not Obj Is Nothing
[/vba] То есть, в случае , когда в строке 10 объектной переменной Obj не удалось присвоить объект например Workbook.Sheet1 , то оператор on error resume next запускает работу строки 20 где написано, что функция isincollection = not и переменная "Obj это ничего" Зачем писать , что переменная Obj is nothing , если это итак понятно , так как в 10й строке кода ей ничего не присвоилось?
И второе, что будет если ошибки не будет , то есть в 10й строке переменной Obj нормально присвоится объект Workbook.Sheet1 ? Судя по коду, в этом случае опять будет выполняться та же самая строка 20 , где функция isincollection = not и переменная "Obj это ничего"
Цитата из книги: Следующая функция представляет собой образец «групповой» функции, с помощью которой можно определить, является ли объект членом коллекции.
[vba]
Код
Private Function IsInCollection(Coln As Object, _ Item As String) As Boolean Dim Obj As Object On Error Resume Next 10 Set Obj = Coln(Item) 20 IsInCollection = Not Obj Is Nothing End Function
[/vba]
Эта функция имеет два аргумента: коллекцию (объект) и элемент (строка), который может быть либо не быть членом коллекции. Функция будет создавать объектную переменную, представляющую элемент коллекции. Если попытка увенчается успехом, функция возвратит True; иначе — False. Функцию IsInCollection можно использовать вместо трех других функций, приведенных выше. Чтобы определить, содержится ли в активной рабочей книге диапазон Data, вызовите функцию IsInCollection с помощью следующего оператора:
Нужно обратить внимание на название функции "IsInCollection". Название переводится "Есть в коллекции". Если в Obj находится Nothing, то это выражение вернет True: [vba]
Код
Obj Is Nothing
[/vba] Если подставить True после текста "Есть в коллекции", то будет неправильно. Поэтому добавляется спереди "Not". Not переделывает True в False, а False в True.
Нужно обратить внимание на название функции "IsInCollection". Название переводится "Есть в коллекции". Если в Obj находится Nothing, то это выражение вернет True: [vba]
Код
Obj Is Nothing
[/vba] Если подставить True после текста "Есть в коллекции", то будет неправильно. Поэтому добавляется спереди "Not". Not переделывает True в False, а False в True.Karataev
Точно, Лена как всегда внимательна. Столько написал, жалко стирать. До исправления скрою пока. Открываю, исправления внесены
Еще вариант пояснения
Не будем смотреть на название функции - оно может быть любым, как захотим, так и назовем, пусть, например, будет не IsInCollection, а Вася, это непринципиально У функции есть 2 аргумента - объект (не обязательно коллекция, для понятности скажем, что Coln - это просто куча чего-то, ну, например, фруктов) и какой-то текст (например, "яблоко"). Сама функция заявлена как булева - может возвращать значение ИСТИНА или ЛОЖЬ Далее мы заявляем, что некая переменная Obj будет являться объектом Пишем пропуск возможной ошибки А потом пытаемся сказать, что пусть этот Obj будет яблоком из нашей кучи фруктов. Может быть два варианта - а) если в куче есть яблоко, то Coln приравняется к нему и станет обладать всеми свойствами яблока (в данном случае нас это не очень волнует, просто для информации); б) в куче яблок нет и тогда Coln ничем не будет, то есть Nothing (именно для этого случая мы и писали пропуск ошибки выше) Строку 20 разделим на несколько частей 1. Obj Is Nothing - мы утверждаем, что Obj есть Nothing (ничего), то есть вариант б) - яблоко в куче не нашлось. Если это на самом деле так, то это утверждение даст ИСТИНА, а если яблоко все-таки нашлось, то ЛОЖЬ 2. Not п.1 - переворачиваем пункт 1 наоборот - если было ИСТИНА, то станет ЛОЖЬ, если была ЛОЖЬ, то станет ИСТИНА. Другими словами, если яблоко не нашлось, то будет ЛОЖЬ, а если яблоко нашлось, то ИСТИНА 3. Присваиваем нашей функции то, что получили в пункте 2, это как раз то, что нам и нужно знать - есть ли яблоко в куче фруктов. ИСТИНА - есть, ЛОЖЬ - нет.
* ИСТИНА и ЛОЖЬ я писал просто для понятности, в VBA это конечно True и False
Точно, Лена как всегда внимательна. Столько написал, жалко стирать. До исправления скрою пока. Открываю, исправления внесены
Еще вариант пояснения
Не будем смотреть на название функции - оно может быть любым, как захотим, так и назовем, пусть, например, будет не IsInCollection, а Вася, это непринципиально У функции есть 2 аргумента - объект (не обязательно коллекция, для понятности скажем, что Coln - это просто куча чего-то, ну, например, фруктов) и какой-то текст (например, "яблоко"). Сама функция заявлена как булева - может возвращать значение ИСТИНА или ЛОЖЬ Далее мы заявляем, что некая переменная Obj будет являться объектом Пишем пропуск возможной ошибки А потом пытаемся сказать, что пусть этот Obj будет яблоком из нашей кучи фруктов. Может быть два варианта - а) если в куче есть яблоко, то Coln приравняется к нему и станет обладать всеми свойствами яблока (в данном случае нас это не очень волнует, просто для информации); б) в куче яблок нет и тогда Coln ничем не будет, то есть Nothing (именно для этого случая мы и писали пропуск ошибки выше) Строку 20 разделим на несколько частей 1. Obj Is Nothing - мы утверждаем, что Obj есть Nothing (ничего), то есть вариант б) - яблоко в куче не нашлось. Если это на самом деле так, то это утверждение даст ИСТИНА, а если яблоко все-таки нашлось, то ЛОЖЬ 2. Not п.1 - переворачиваем пункт 1 наоборот - если было ИСТИНА, то станет ЛОЖЬ, если была ЛОЖЬ, то станет ИСТИНА. Другими словами, если яблоко не нашлось, то будет ЛОЖЬ, а если яблоко нашлось, то ИСТИНА 3. Присваиваем нашей функции то, что получили в пункте 2, это как раз то, что нам и нужно знать - есть ли яблоко в куче фруктов. ИСТИНА - есть, ЛОЖЬ - нет.
* ИСТИНА и ЛОЖЬ я писал просто для понятности, в VBA это конечно True и False_Boroda_
Если подставить True после текста "Есть в коллекции", то будет неправильно. Поэтому добавляется спереди "Not". Not переделывает True в False, а False в True.
То есть, 20 строку можно переписать вот так? [vba]
Код
20 If Not Obj Is Nothing Then IsInCollection = True Else IsInCollection = False End If
Если подставить True после текста "Есть в коллекции", то будет неправильно. Поэтому добавляется спереди "Not". Not переделывает True в False, а False в True.
То есть, 20 строку можно переписать вот так? [vba]
Код
20 If Not Obj Is Nothing Then IsInCollection = True Else IsInCollection = False End If