Страницы: 1
RSS
Принадлежность ячейки диапазону
 
Доброго времени суток, уважаемые!  
Голову уже сломал - какую инструкцию в VBA применить, чтобы понять, является ли проверяемая ячейка частью определенного диапазона.  
Например, на листе проверяю все ячейки в используемом диапазоне, и, если они попадают в диапазон А5:В5, то надо эти ячейки закрасить красным.  
Соответственно пишу:  
Dim objR as range  
For each objR in Worksheets(1).UsedRange.Cells  
If objR (ВОТ КАКОЙ ТУТ ОПЕРАТОР ДОЛЖЕН БЫТЬ, чтоб выдал принадлежит ячейка диапазону или нет?!!!!) Worksheets(1).Range("A5:B5").Cells Then  
objR.Interior.Color ну и т.д.  
 
Используемый диапазон на листе заранее неизвестен.  
Файл пример приложу по хотению общества (хотя какой там пример? Кусок неудавшегося кода?)  
Спасибо за внимание.
Кому решение нужно - тот пример и рисует.
 
Пытливый, почитайте справку по intersect
Я сам - дурнее всякого примера! ...
 
Читал. Там надо Range передавать как аргументы. Если один аргумент Cell, другой Range -  ошибка Global method failed и далее непечатно...  
И Union пробовал, и Intersect и пытался запихнуть objR.Parent туда (потом, кончено, одумался) - никакого позитива.
Кому решение нужно - тот пример и рисует.
 
Значит неверно передаете range. Попробуйте в модуль листа:  
Private Sub Worksheet_SelectionChange(ByVal Target As Range)  
If Not Intersect(Target, [a1:a10]) Is Nothing Then MsgBox "Bingo!"
End Sub  
А теперь так:  
Private Sub Worksheet_SelectionChange(ByVal Target As Range)  
If Not Intersect([a2], [a1:a10]) Is Nothing Then MsgBox "Bingo!"
End Sub
Я сам - дурнее всякого примера! ...
 
Или с cells:  
Private Sub www()  
If Not Intersect(Cells(2, 1), [a1:a10]) Is Nothing Then MsgBox "Bingo!"
End Sub
Я сам - дурнее всякого примера! ...
 
.
 
> Например, на листе проверяю все ячейки в используемом диапазоне, и, если они попадают в диапазон А5:В5, то надо эти ячейки закрасить красным.  
 
А тут даже цикл не нужен:  
 
On Error Resume Next  
Application.Intersect(Worksheets(1).UsedRange, Worksheets(1).Range("A5:B5")).Interior.Color = vbYellow
 
Это все понятно. Я привел не тот пример.    
У меня задача - снять заливку со всех ячеек на всех листах в книге, кроме ячеек А5:В5 листа1. Где залитые ячейки - никто не знает. Какой размер используемого диапазона на каждом листе - тоже никто не знает.  
Думал решить вложенными циклами - на каждом листе, для каждой ячейки используемого диапазона проверяем - попадает ячейка в диапазон ячеек листа1.[a5:b5] - если да, не трогаем, иначе, снимаем заливку.
Intersect тут прямо напрашивался - ан нет...    
Примерчик с неудачным кодом в модуле1 - прилагается  
Существует оператор который может дать ответ на вопрос - принадлежит ли проверяемая ячейка (cell) к семейству "неприкасаемых ячеек" Worksheets(1).Range("A5:B5").Cells или как-то еще это определить можно?
Кому решение нужно - тот пример и рисует.
 
Так что ли?  
 
Sub RemoveColor()  
   Dim objWh As Worksheet, Color1 As Long, Color2 As Long  
   With Worksheets("Лист1")  
       Color1 = [A5].Interior.Color
       Color2 = [B5].Interior.Color
   End With  
   For Each objWh In ThisWorkbook.Worksheets  
       objWh.Cells.Interior.Color = xlNone  
   Next  
   With Worksheets("Лист1")  
        [A5].Interior.Color = Color1
        [B5].Interior.Color = Color2
   End With  
End Sub
lev
 
Аргументами Intersect должны быть диапазоны одного листа!
 
И "снять заливку" - это все-таки  
 
objWh.Cells.Interior.ColorIndex = xlColorIndexNone
 
а вы думаете xlNone заливку не снимает?
lev
 
Ребята, спасибо. Кажись, до меня дошло (ув Казанский ткнул носом в очевидное).  
Вариант ув.Student'а - тоже интересен.  
Полез разбираться дальше.  
 
Еще раз - всем большое русское MERCIE! :О)
Кому решение нужно - тот пример и рисует.
 
.
 
С интерсектом:  
Sub RemoveColor()  
   Dim objWh As Worksheet  
   Dim objR As Range, a()  
   For Each objWh In ThisWorkbook.Worksheets  
       If objWh.Name = Worksheets(1).Name Then  
           For Each objR In objWh.UsedRange.Cells  
               If Intersect(objR, objWh.Range("A5:B5")) _  
                  Is Nothing Then  
                   objR.Interior.ColorIndex = xlNone  
               End If  
           Next  
       Else  
           objWh.UsedRange.Interior.ColorIndex = xlNone  
       End If  
   Next  
End Sub
Я сам - дурнее всякого примера! ...
 
Андрей, у тебя остальные листы не тронет, а там надо все чистить.
Я сам - дурнее всякого примера! ...
 
Хозяин просил только первый!
 
И еще раз всем спасибо, до листинга KukLP додумался самостоятельно буквально сек 30 назад. :О)  
Вопрос закрыт.
Кому решение нужно - тот пример и рисует.
 
{quote}{login=RAN}{date=20.11.2011 01:46}{thema=}{post}Хозяин просил только первый!{/post}{/quote}"У меня задача - снять заливку со всех ячеек на всех листах в книге, кроме ячеек А5:В5 листа1"
Я сам - дурнее всякого примера! ...
 
Значит я прочитал криво.:)
 
вот вам не спится ))
lev
 
На случай если раскраска посложней, лучше так.
Я сам - дурнее всякого примера! ...
 
{quote}{login=KukLP}{date=20.11.2011 02:10}{thema=}{post}На случай если раскраска посложней, лучше так.{/post}{/quote}  
 
Клёво!  
Переписал в книжечку...  
Спасибо.  
:О)
Кому решение нужно - тот пример и рисует.
 
\еще вариант  
 
Sub io()  
Dim x As Object, i() As Long, j As Long  
With Sheets(1).Range("A5:B5").Cells: ReDim i(.Count - 1)  
   For Each x In .Cells: i(j) = x.Interior.Color: j = j + 1: Next  
   For Each x In Sheets: x.Cells.Interior.ColorIndex = xlColorIndexNone: Next: j = 0  
   For Each x In .Cells: x.Interior.Color = i(j): j = j + 1: Next  
End With  
End Sub
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
Страницы: 1
Наверх