Страница 1 из 2
[3] Принадлежность ячейки диапазону с именем в Excel
Добавлено: 15 ноя 2005, 08:31
Avsha
Как определить, принадлежит ли ячейка указанному поименнованному диапазону?
Добавлено: 19 ноя 2005, 14:45
Avsha
Получился такой вариант в виде пользовательской функции...
Код: Выделить всё
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
Добавлено: 19 ноя 2005, 18:33
Дмит
Можно без цикла
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.
Добавлено: 20 ноя 2005, 10:55
Avsha
Интересное решение определять принадлежность ячейки способом объединения диапазонов.
Не сразу разобрался и определил что rng1- это ячейка, а rng2 - диапазон в вашем варианте.
Планировал использовать эти функции для определения изменяемого диапазона на листе рабочей книги ...
Код: Выделить всё
Private Sub Worksheet_Change(ByVal Target As Range)
d1 = Cell_In_Range(Диапазон, Target)
If d1 = 1 Then
'действие при изменении ячеек в диапазоне <Диапазон>
End If
End Sub
Добавлено: 13 июн 2006, 10:53
MikeM
или так:
Function InRange(rnd1,rng2) as Boolean
If Intersect(rnd1,rng2) is nothing Then InRange=False else InRange=True
End Function
Добавлено: 13 июн 2006, 14:17
Avsha
Ну вот еще вариант, правда не такой лаконичный
и отличается от начальной постановки вопроса.
Определение вхождения простого диапазона 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
Добавлено: 14 июн 2006, 03:16
Naeel Maqsudov

Можно не только "без цикла" но и вообще без "велосипеда".
=НЕ(ЕОШ(TheRange $B$30))
TheRange - это имя диапазона, а $B$30 - проверяемая ячейка. Трезультат ИСТИНА, если ячейка входит в диапазон.
Секрет фокуса:
ПРОБЕЛ используется для обозначения операции пересечения диапазонов. Если диапазоны не пересекаются, то возникает ошибка. Это как раз то, что на VBA выражается словом Intersect! Также как у
MikeM этот пример проверяет вхождение не просто ячейки, а ПОДДИАПАЗОНА в ДИАПАЗОН.
Добавлено: 14 июн 2006, 11:08
Avsha
Naeel Maqsudov,
Для ячейки ваши варианты действительно хороши.
Но для проверки полного вхождения поддиапазона в диапазон они не подходят,
так как используют операцию пересечения диапазонов.
Добавлено: 17 июн 2006, 01:16
Naeel Maqsudov
Упс... Извиняюсь... Погорячился. Если диапазоня пересекаются дает ИСТИНА если не пересекаются - ЛОЖЬ.
PS
Для диапазонов надо вводить как формулу-массив, т.е. с Ctrl+Enter.
Добавлено: 17 июн 2006, 15:02
maxa
А как вывести в результате сколько раз встречается искомое значение?