[3] Принадлежность ячейки диапазону с именем в Excel

Весь MS Office, программирование на Visual Basic for Applications и MS VB

Модератор: Naeel Maqsudov

Avsha
Сообщения: 665
Зарегистрирован: 08 сен 2005, 13:47
Откуда: KZ

Как определить, принадлежит ли ячейка указанному поименнованному диапазону?
Avsha
Сообщения: 665
Зарегистрирован: 08 сен 2005, 13:47
Откуда: KZ

Получился такой вариант в виде пользовательской функции...

Код: Выделить всё

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
Дмит
Сообщения: 145
Зарегистрирован: 27 ноя 2004, 22:23
Контактная информация:

Можно без цикла
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.
Avsha
Сообщения: 665
Зарегистрирован: 08 сен 2005, 13:47
Откуда: KZ

Интересное решение определять принадлежность ячейки способом объединения диапазонов.
Не сразу разобрался и определил что rng1- это ячейка, а rng2 - диапазон в вашем варианте.

Планировал использовать эти функции для определения изменяемого диапазона на листе рабочей книги ...

Код: Выделить всё

Private Sub Worksheet_Change(ByVal Target As Range)
    d1 = Cell_In_Range(Диапазон, Target)
    If d1 = 1 Then
      'действие при изменении ячеек в диапазоне <Диапазон>
    End If
End Sub
MikeM
Сообщения: 23
Зарегистрирован: 25 апр 2005, 12:13

или так:

Function InRange(rnd1,rng2) as Boolean
If Intersect(rnd1,rng2) is nothing Then InRange=False else InRange=True
End Function
Avsha
Сообщения: 665
Зарегистрирован: 08 сен 2005, 13:47
Откуда: KZ

Ну вот еще вариант, правда не такой лаконичный
и отличается от начальной постановки вопроса.
Определение вхождения простого диапазона 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 этот пример проверяет вхождение не просто ячейки, а ПОДДИАПАЗОНА в ДИАПАЗОН.
Avsha
Сообщения: 665
Зарегистрирован: 08 сен 2005, 13:47
Откуда: KZ

Naeel Maqsudov,
Для ячейки ваши варианты действительно хороши.

Но для проверки полного вхождения поддиапазона в диапазон они не подходят,
так как используют операцию пересечения диапазонов.
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

Упс... Извиняюсь... Погорячился. Если диапазоня пересекаются дает ИСТИНА если не пересекаются - ЛОЖЬ.

PS
Для диапазонов надо вводить как формулу-массив, т.е. с Ctrl+Enter.
maxa
Сообщения: 59
Зарегистрирован: 15 июн 2006, 21:00

А как вывести в результате сколько раз встречается искомое значение?
Ответить