[3] Принадлежность ячейки диапазону с именем в Excel
Модератор: Naeel Maqsudov
Как определить, принадлежит ли ячейка указанному поименнованному диапазону?
Получился такой вариант в виде пользовательской функции...
Код: Выделить всё
Public Function Cell_In_Range(Диапазон As Range, Ячейка As Range)
Cell_In_Range = 0
For Each iCell In Диапазон
If (iCell.Address = Ячейка.Address) And _
(iCell.Worksheet.Name = Ячейка.Worksheet.Name) Then Cell_In_Range = 1: Exit For
Next
End Function
Можно без цикла
Function InRange(rnd1,rng2) as Boolean
InRange=False
If rng1.Parent.Parent.Name=rng2.Parent.Parent.Name and rng1.Parent.Name=rng2.Parent.Name Then
If Union(rng1,rng2).address=rng2.address Then InRange=True
End If
End Function
Возвращает True, если rng1 является подмножеством rng2.
Function InRange(rnd1,rng2) as Boolean
InRange=False
If rng1.Parent.Parent.Name=rng2.Parent.Parent.Name and rng1.Parent.Name=rng2.Parent.Name Then
If Union(rng1,rng2).address=rng2.address Then InRange=True
End If
End Function
Возвращает True, если rng1 является подмножеством rng2.
Интересное решение определять принадлежность ячейки способом объединения диапазонов.
Не сразу разобрался и определил что rng1- это ячейка, а rng2 - диапазон в вашем варианте.
Планировал использовать эти функции для определения изменяемого диапазона на листе рабочей книги ...
Не сразу разобрался и определил что rng1- это ячейка, а rng2 - диапазон в вашем варианте.
Планировал использовать эти функции для определения изменяемого диапазона на листе рабочей книги ...
Код: Выделить всё
Private Sub Worksheet_Change(ByVal Target As Range)
d1 = Cell_In_Range(Диапазон, Target)
If d1 = 1 Then
'действие при изменении ячеек в диапазоне <Диапазон>
End If
End Sub
или так:
Function InRange(rnd1,rng2) as Boolean
If Intersect(rnd1,rng2) is nothing Then InRange=False else InRange=True
End Function
Function InRange(rnd1,rng2) as Boolean
If Intersect(rnd1,rng2) is nothing Then InRange=False else InRange=True
End Function
Ну вот еще вариант, правда не такой лаконичный
и отличается от начальной постановки вопроса.
Определение вхождения простого диапазона r1 (состоящего из одной области) в диапазон r2
(который может включать несколько областей) по номерам ограничивающих их строк/столцов.
и отличается от начальной постановки вопроса.
Определение вхождения простого диапазона r1 (состоящего из одной области) в диапазон r2
(который может включать несколько областей) по номерам ограничивающих их строк/столцов.
Код: Выделить всё
Public Function In_Range(Ячейка As Range, Диапазон As Range)
In_Range = False
Dim Start_C As Long
Dim Start_R As Long
Dim End_C As Long
Dim End_R As Long
If Ячейка.Areas.Count > 1 Then Exit Function
' Вывод информации по ячейке
Start_C = Ячейка.Column
Start_R = Ячейка.Row
End_C = Ячейка.Column + Ячейка.Columns.Count - 1
End_R = Ячейка.Row + Ячейка.Rows.Count - 1
Dim area_r1 As Range
' Вывод информации по областям диапазона
For Each area_r1 In Диапазон.Areas
i = i + 1
D_Start_C = area_r1.Column
D_Start_R = area_r1.Row
D_End_C = area_r1.Column + area_r1.Columns.Count - 1
D_End_R = area_r1.Row + area_r1.Rows.Count - 1
If D_Start_C <= Start_C And D_Start_R <= Start_R _
And D_End_C >= End_C And D_End_R >= End_R Then In_Range = True
Next
End Function
- Naeel Maqsudov
- Сообщения: 2570
- Зарегистрирован: 20 фев 2004, 19:17
- Откуда: Moscow, Russia
- Контактная информация:

=НЕ(ЕОШ(TheRange $B$30))
TheRange - это имя диапазона, а $B$30 - проверяемая ячейка. Трезультат ИСТИНА, если ячейка входит в диапазон.
Секрет фокуса:
ПРОБЕЛ используется для обозначения операции пересечения диапазонов. Если диапазоны не пересекаются, то возникает ошибка. Это как раз то, что на VBA выражается словом Intersect! Также как у MikeM этот пример проверяет вхождение не просто ячейки, а ПОДДИАПАЗОНА в ДИАПАЗОН.
Naeel Maqsudov,
Для ячейки ваши варианты действительно хороши.
Но для проверки полного вхождения поддиапазона в диапазон они не подходят,
так как используют операцию пересечения диапазонов.
Для ячейки ваши варианты действительно хороши.
Но для проверки полного вхождения поддиапазона в диапазон они не подходят,
так как используют операцию пересечения диапазонов.
- Naeel Maqsudov
- Сообщения: 2570
- Зарегистрирован: 20 фев 2004, 19:17
- Откуда: Moscow, Russia
- Контактная информация:
Упс... Извиняюсь... Погорячился. Если диапазоня пересекаются дает ИСТИНА если не пересекаются - ЛОЖЬ.
PS
Для диапазонов надо вводить как формулу-массив, т.е. с Ctrl+Enter.
PS
Для диапазонов надо вводить как формулу-массив, т.е. с Ctrl+Enter.
А как вывести в результате сколько раз встречается искомое значение?