Страница 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
А как вывести в результате сколько раз встречается искомое значение?