Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Программирование под Windows > Visual Basic
Перезагрузить страницу Именованный диапазон
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
Mizar Mizar вне форума
Новичок
 
Сообщений: 7
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 06.03.2006
По умолчанию Именованный диапазон - 04.04.2006, 14:20

Всем привет.
Есть на листе несколько именновыных диапазонов, можно как-нибудь узнать какому диапазону принадлежит конкретная ячейка? Напимер принадлежит ли Cells(5, 3) диапазону "рабочие"?
Заранее спасибо.
Ответить с цитированием
  (#2 (permalink)) Старый
pashulka pashulka вне форума
Member
 
Сообщений: 1,872
Сказал(а) спасибо: 2
Поблагодарили 57 раз(а) в 53 сообщениях
Регистрация: 11.03.2005
По умолчанию 04.04.2006, 15:07

Вариант I

Код:
If Not Intersect(Range("A5"), Range("Рабочие")) Is Nothing Then
   MsgBox "Искомая ячейка входит в нужный диапазон", , ""
End If
Код:
If Not Intersect(Cells(5, 1), Range("Рабочие")) Is Nothing Then
   MsgBox "Искомая ячейка входит в нужный диапазон", , ""
End If
Код:
If Not Intersect(Cells(5, 1), Names("Рабочие").RefersToRange) Is Nothing Then
   MsgBox "Искомая ячейка входит в нужный диапазон", , ""
End If
Вариант II

Код:
If Range(Range("A5"), Range("Рабочие")).Address = _
   Range("Рабочие").Address Then
   MsgBox "Искомая ячейка входит в нужный диапазон", , ""
End If
Код:
If Range(Cells(5, 1), Range("Рабочие")).Address = _
   Range("Рабочие").Address Then
   MsgBox "Искомая ячейка входит в нужный диапазон", , ""
End If
Код:
If Range(Cells(5, 1), Names("Рабочие").RefersToRange).Address = _
   Names("Рабочие").RefersToRange.Address Then
   MsgBox "Искомая ячейка входит в нужный диапазон", , ""
End If
Вариант III

Код:
With Range("Рабочие")
     If .Row <= Range("A5").Row And _
        .Row + .Rows.Count - 1 >= Range("A5").Row Then
        If .Column <= Range("A5").Column And _
           .Column + .Columns.Count - 1 >= Range("A5").Column Then
           MsgBox "Искомая ячейка входит в нужный диапазон", , ""
        End If
     End If
End With
Код:
With Range("Рабочие")
     If .Item(1).Row <= Range("A5").Row And _
        .Item(.Cells.Count).Row >= Range("A5").Row Then
        If .Item(1).Column <= Range("A5").Column And _
           .Item(.Cells.Count).Column >= Range("A5").Column Then
           MsgBox "Искомая ячейка входит в нужный диапазон", , ""
        End If
     End If
End With
и т.п.

Примечание : Предполагается, что диапазон с именем "Рабочие" действительно существует.
Ответить с цитированием
  (#3 (permalink)) Старый
Mizar Mizar вне форума
Новичок
 
Сообщений: 7
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 06.03.2006
По умолчанию 04.04.2006, 15:23

Ну и ну, сколько вариантов!
Спасибо pashulka !
Счас попробую...
Ответить с цитированием
  (#4 (permalink)) Старый
pashulka pashulka вне форума
Member
 
Сообщений: 1,872
Сказал(а) спасибо: 2
Поблагодарили 57 раз(а) в 53 сообщениях
Регистрация: 11.03.2005
По умолчанию 04.04.2006, 16:14

Одно, но существенное дополнение : на мой взгляд, имеет смысл добавить проверку на принадлежность именованного диапазона конкретному листу, в данном случае активному, хотя в принципе это может быть любой другой лист.
Ответить с цитированием
  (#5 (permalink)) Старый
Mizar Mizar вне форума
Новичок
 
Сообщений: 7
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 06.03.2006
По умолчанию 10.04.2006, 12:14

Цитата:
Originally posted by pashulka
[b]имеет смысл добавить проверку на принадлежность именованного диапазона конкретному листу
Действительно возникла такая необходимость.
вот что получилось
Код:
 Function WorkSheet_Diapason(sName As String, rName As String) As Boolean
Dim c As Object

 On Error GoTo errНandle:
'   Set c = ActiveWorkbook.Sheets(sName).Range(rName)
 Worksheets(sName).Range(rName) = Worksheets(sName).Range(rName)
   WorkSheet_Diapason = True
 Exit Function
errНandle:
   WorkSheet_Diapason = False
 End Function
Может можно проще?
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
pashulka pashulka вне форума
Member
 
Сообщений: 1,872
Сказал(а) спасибо: 2
Поблагодарили 57 раз(а) в 53 сообщениях
Регистрация: 11.03.2005
По умолчанию 10.04.2006, 14:04

Если Вы уверены, что именованный диапазон действительно существует и имеет уровень рабочей книги, то :

Код:
WorkSheet_Diapason = (sName = Application.Range(rName).Parent.Name)
Если таковой уверенности нет, то можно перебрать в цикле все имена рабочей книги, и проверять принадлежность всех имён конкретному листу, но здесь есть один нюанс, кроме именованных диапазонов существуют ещё и именованные формулы, а определять является ли об'ект Name - диапазоном или формулой, лично мне, без инструкции On Error ... к сожалению, так и не удалось.
Затем нужно сравнивать имя именованного об'екта с "образцом", причём обязательно анализируя уровень имени, так как имя уровня рабочего листа [локальное] будет выглядеть как "Лист1!Рабочие", а имя уровня рабочей книги [глобальное], как "Рабочие"
И на мой взгляд, подобный алгоритм нельзя назвать более простым, чем первоначальный.
Ответить с цитированием
  (#7 (permalink)) Старый
Mizar Mizar вне форума
Новичок
 
Сообщений: 7
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 06.03.2006
По умолчанию 10.04.2006, 18:17

Объясите разницу, ибо я не понял, в параметрах....
Вопрос может и глупый , но на будующее пригодится....
Просто я с таким объявление не сталкивался.
Я уточню вопрос - разница в параметрах существенна?
Ответить с цитированием
  (#8 (permalink)) Старый
pashulka pashulka вне форума
Member
 
Сообщений: 1,872
Сказал(а) спасибо: 2
Поблагодарили 57 раз(а) в 53 сообщениях
Регистрация: 11.03.2005
По умолчанию 10.04.2006, 19:17

Если под параметрами подразумевается уровень имени, то судите сами :

Когда Вы создаёте имя, то оно автоматически принадлежит конкретной рабочей книге и имеет уровень рабочей книги, т.е. присвоив ячейке или диапазону имя, например, через поле имени, расположенное слева от строки формул, Вы тем самым даёте возможность использовать это имя в любом рабочем листе этой книге. Оно также будет наличествовать в выпадающем списке поля имени, любого рабочего листа.

Если Вы создаёте имя уровня рабочей книги, а для этого достаточно просто ввести имя_листа!имя_диапазона, то это имя Вы сможете увидеть в поле имени только активного листа. Для того, чтобы получить значения ячеек такового диапазона Вам придётся вместо =СУММ(имя_диапазона) писать =СУММ(имя_листа!имя_диапазона) во всех рабочих листах, кроме того, которому принадлежит это имя. На самом деле, в этом рабочем листе также допускается подобный синтаксис, но в отличии от других листов, он не обязателен.

Перебрать в цикле все имена можно используя ActiveWorkbook.Names/ThisWorkbook.Names, а имена только уровня рабочего листа ActiveSheet.Names/Worksheets(...).Names

Вкратце всё, но в дополнение ко всему вышеизложенному, можно почитать help, там наверняка есть и другая информация, можно поэкспериментировать с подобными именами, в т.ч. используя меню Вставка - пункт Имя.
Ответить с цитированием
  (#9 (permalink)) Старый
Mizar Mizar вне форума
Новичок
 
Сообщений: 7
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 06.03.2006
По умолчанию 10.04.2006, 19:42

Мдя...
Насчет справки - сколько раз возникала ситуация, когда (как та собака ПАВЛОВА), вроде объясняют, и даже вроде понял, но....!
Ответить с цитированием
  (#10 (permalink)) Старый
pashulka pashulka вне форума
Member
 
Сообщений: 1,872
Сказал(а) спасибо: 2
Поблагодарили 57 раз(а) в 53 сообщениях
Регистрация: 11.03.2005
По умолчанию 10.04.2006, 20:32

Mizar, Это только на первый взгляд сложно, на мой взгляд, это скорее нудно, но если не копать в самые истоки, то Вы быстро разберётесь. Если же речь идёт о программном поиске соответствия ячейки именованному диапазону, причём любому, то здесь можно использовать инструкцию On Error ... и первоначальные варианты, например :

Код:
On Error GoTo ErrHandler

With ThisWorkbook.Worksheets(1)
     If Not Intersect(.Range("A5"), .Range("Рабочие")) Is Nothing Then
        MsgBox "Искомая ячейка входит в нужный диапазон", , ""
     End If
End With: Exit Sub

ErrHandler:
MsgBox "Не срослось : или не пересекаются или нет имени", , ""
ThisWorkbook/ActiveWorkbook

Код:
On Error GoTo ErrHandler

If Not Intersect(ThisWorkbook.Worksheets(1).Range("A5"), _
   ThisWorkbook.Worksheets(1).Range("Рабочие")) Is Nothing Then _
   MsgBox "Искомая ячейка входит в нужный диапазон", , "": Exit Sub

ErrHandler:
MsgBox "Не срослось : или не пересекаются или нет имени", , ""
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ссылка на диапазон в другом файле shalun Вопросы начинающих программистов 2 06.12.2010 18:16
Как вставить диапазон в конкретную строку листа Excel со сдвигом вниз имеющихся imported_malor Visual Basic 1 17.01.2010 18:48
Диапазон из ячеек одного цвета NhiNick Visual Basic 2 05.11.2009 21:48
Диапазон копирования в VBA Excel SAS888 Visual Basic 13 10.03.2009 11:43
Диапазон содержит либо текст, либо цифры bank_notes Visual Basic 3 06.10.2008 21:46
Именованный диапазон как обратиться к первой ячейки VictorM Visual Basic 2 05.06.2008 10:35
определить диапазон скрытого списка Алек_Л Visual Basic 15 19.02.2007 15:47
как задать изменяемый диапазон проверки Алек_Л Visual Basic 3 26.08.2006 17:36
Как передать двухмерный массив в диапазон ячеек Baytic C++ Builder 2 26.11.2005 08:48
надо вставить выделенный диапазон ячеек из EXCEL в WORD djonis Visual Basic 1 12.03.2005 03:29
HELP! Как сортировать выделенный диапазон в Excel vipkursk Visual Basic 1 09.09.2004 16:41
Диапазон Anonymous Visual Basic 1 25.09.2003 11:57



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов