Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Проверка принадлежности к коллекции (функция) - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Проверка принадлежности к коллекции (функция) (Макросы/Sub)
Проверка принадлежности к коллекции (функция)
t330 Дата: Четверг, 14.02.2019, 22:17 | Сообщение № 1
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 147
Репутация: 0 ±
Замечаний: 20% ±

Excel 2016
Помогите пожалуйста понять логику работы эотй функции из Уокенбаха (цитата и код из книги ниже).

Непонятно, что такое в строке[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]
Код
MsgBox IsInCollection(ActiveWorkbook.Names, "Data")
[/vba]
Для того чтобы определить, открыта ли рабочая книга с названием Budget, используйте следующий оператор:

[vba]
Код
MsgBox IsInCollection(Workbooks, "budget.xlsx")
[/vba]

Чтобы узнать, содержит ли активная рабочая книга рабочий лист Лист1, используйте следующий оператор:

[vba]
Код
MsgBox IsInCollection(ActiveWorkbook.Worksheets, "Лист1")
[/vba]


Сообщение отредактировал t330 - Пятница, 15.02.2019, 01:00
 
Ответить
СообщениеПомогите пожалуйста понять логику работы эотй функции из Уокенбаха (цитата и код из книги ниже).

Непонятно, что такое в строке[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]
Код
MsgBox IsInCollection(ActiveWorkbook.Names, "Data")
[/vba]
Для того чтобы определить, открыта ли рабочая книга с названием Budget, используйте следующий оператор:

[vba]
Код
MsgBox IsInCollection(Workbooks, "budget.xlsx")
[/vba]

Чтобы узнать, содержит ли активная рабочая книга рабочий лист Лист1, используйте следующий оператор:

[vba]
Код
MsgBox IsInCollection(ActiveWorkbook.Worksheets, "Лист1")
[/vba]

Автор - t330
Дата добавления - 14.02.2019 в 22:17
Karataev Дата: Четверг, 14.02.2019, 22:48 | Сообщение № 2
Группа: Проверенные
Ранг: Старожил
Сообщений: 1334
Репутация: 533 ±
Замечаний: 0% ±

Excel
Нужно обратить внимание на название функции "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
Дата добавления - 14.02.2019 в 22:48
Pelena Дата: Пятница, 15.02.2019, 00:05 | Сообщение № 3
Группа: Админы
Ранг: Местный житель
Сообщений: 19165
Репутация: 4412 ±
Замечаний: ±

Excel 365 & Mac Excel
t330, тегами надо оформлять ВСЕ строчки кода в сообщении. Исправьте


"Черт возьми, Холмс! Но как??!!"
Ю-money 41001765434816
 
Ответить
Сообщениеt330, тегами надо оформлять ВСЕ строчки кода в сообщении. Исправьте

Автор - Pelena
Дата добавления - 15.02.2019 в 00:05
_Boroda_ Дата: Пятница, 15.02.2019, 00:15 | Сообщение № 4
Группа: Модераторы
Ранг: Местный житель
Сообщений: 16666
Репутация: 6478 ±
Замечаний: 0% ±

2003; 2007; 2010; 2013 RUS
Точно, Лена как всегда внимательна. Столько написал, жалко стирать. До исправления скрою пока.
Открываю, исправления внесены

Еще вариант пояснения

Не будем смотреть на название функции - оно может быть любым, как захотим, так и назовем, пусть, например, будет не 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_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
СообщениеТочно, Лена как всегда внимательна. Столько написал, жалко стирать. До исправления скрою пока.
Открываю, исправления внесены

Еще вариант пояснения

Не будем смотреть на название функции - оно может быть любым, как захотим, так и назовем, пусть, например, будет не 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_
Дата добавления - 15.02.2019 в 00:15
t330 Дата: Пятница, 15.02.2019, 01:13 | Сообщение № 5
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 147
Репутация: 0 ±
Замечаний: 20% ±

Excel 2016
Если подставить True после текста "Есть в коллекции", то будет неправильно. Поэтому добавляется спереди "Not". Not переделывает True в False, а False в True.


То есть, 20 строку можно переписать вот так?
[vba]
Код

20  If Not Obj Is Nothing Then
     IsInCollection = True
     Else
     IsInCollection = False
     End If
[/vba]


Сообщение отредактировал t330 - Пятница, 15.02.2019, 01:14
 
Ответить
Сообщение
Если подставить True после текста "Есть в коллекции", то будет неправильно. Поэтому добавляется спереди "Not". Not переделывает True в False, а False в True.


То есть, 20 строку можно переписать вот так?
[vba]
Код

20  If Not Obj Is Nothing Then
     IsInCollection = True
     Else
     IsInCollection = False
     End If
[/vba]

Автор - t330
Дата добавления - 15.02.2019 в 01:13
_Boroda_ Дата: Пятница, 15.02.2019, 02:06 | Сообщение № 6
Группа: Модераторы
Ранг: Местный житель
Сообщений: 16666
Репутация: 6478 ±
Замечаний: 0% ±

2003; 2007; 2010; 2013 RUS
Открыл свой пост выше
То есть, 20 строку можно переписать вот так?

Да, можно и так


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
СообщениеОткрыл свой пост выше
То есть, 20 строку можно переписать вот так?

Да, можно и так

Автор - _Boroda_
Дата добавления - 15.02.2019 в 02:06
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Проверка принадлежности к коллекции (функция) (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!