Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.10.2010, 11:14   #1
Volodymyr
Пользователь
 
Регистрация: 28.02.2008
Сообщений: 70
По умолчанию про сравнение ячеек

добрый день!
Я хочу сравнить каждую ячейку на странице 1 в диапазоне "C:E" со столбцом "A:A" на странице 2, 3 и 4. При этом, в случае совпадения, ячейку на странице 1 я хочу перекрасить в определенный цвет.
Я пытался делать так:
Код:
Sub checktotal()
Dim i, i1 As Long
Dim x As Range
Application.ScreenUpdating = False
Range("C:E").Select
With Selection
For i1 = 1 To 3
Select Case i1
    Case 1
  Page = "2"
  Color1 = RGB(255, 0, 0)
   Case 2
    Page = "3"
  Color1 = RGB(0, 0, 40)
  Case 3
      Page = "4"
  Color1 = RGB(0, 40, 0)
End Select
For i = 2 To .Range("A" & Rows.Count).End(xlUp).Row
If Worksheets(Page).Columns(1).Find(.Cells(i), LookIn:=xlValues, LookAt:=xlWhole) Is Nothing And .Cells(i).Interior.Pattern = xlNone Then
a1 = 0 ' я не знак, как указать (ничего с этой ячейкой не делать)
Else
.Cells(i).Interior.Color = Color1
End If
    Next i
    Next i1
End With
End Sub
но результат не верный
также макрос работает долго, а как сделать, чтобы сравнивались массивы?
всем спасибо за помощь
Volodymyr вне форума Ответить с цитированием
Старый 26.10.2010, 15:01   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,858
По умолчанию

Всё просто.

1) Убираем нафиг весь код
2) Читаем про условное форматирование: http://www.planetaexcel.ru/tip.php?aid=121
(обращая внимание на пример №7)
3) Задаём имя диапазонам A:A на нужных листах
4) Пишем формулу для УФ: типа =счётесли(ИмяДиапазона;A1)>0
EducatedFool вне форума Ответить с цитированием
Старый 26.10.2010, 19:48   #3
Volodymyr
Пользователь
 
Регистрация: 28.02.2008
Сообщений: 70
По умолчанию

да, Вы правы!
Это быстрее и проще того, что я пытался сделать.
спасибо.
Volodymyr вне форума Ответить с цитированием
Старый 27.10.2010, 00:35   #4
vikttur
Участник клуба
 
Регистрация: 16.05.2010
Сообщений: 1,249
По умолчанию

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Пишем формулу для УФ: типа =счётесли(ИмяДиапазона;A1)>0
При отсутствии значения в диапазоне работает так же, при наличии скорость обработки быстрее:
=ЕЧИСЛО(ПОИСКПОЗ(A1;ИмяДиапазона;0) )
vikttur вне форума Ответить с цитированием
Старый 27.10.2010, 10:13   #5
Volodymyr
Пользователь
 
Регистрация: 28.02.2008
Сообщений: 70
По умолчанию

тогда макрос можно оставить так? или можно сделать перебор параметров автофильтра циклом?
Код:
 Application.ScreenUpdating = False: On Error Resume Next
    Columns("C:E").Select
        Selection.FormatConditions.Add Type:=xlExpression, Formula1:= _
        "=ISNUMBER(MATCH(C1,page1!$A:$A,0) )"
   Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
    With Selection.FormatConditions(1).Interior
        .PatternColorIndex = xlAutomatic
        .Color = 255
        .TintAndShade = 0
    End With
    '
        Selection.FormatConditions.Add Type:=xlExpression, Formula1:= _
     "=ISNUMBER(MATCH(C1,page2!$A:$A,0) )"
    Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
    With Selection.FormatConditions(1).Interior
        .PatternColorIndex = xlAutomatic
        .Color = 5296274
        .TintAndShade = 0
    End With
    '
    Selection.FormatConditions.Add Type:=xlExpression, Formula1:= _
  "=ISNUMBER(MATCH(C1,page3!$A:$A,0) )"
    Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
    With Selection.FormatConditions(1).Interior
        .PatternColorIndex = xlAutomatic
        .Color = 15773696
        .TintAndShade = 0
    End With
    Selection.FormatConditions(1).StopIfTrue = True
    Range("A1").Select
End Sub
Volodymyr вне форума Ответить с цитированием
Старый 27.10.2010, 11:29   #6
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,858
По умолчанию

Цитата:
или можно сделать перебор параметров автофильтра циклом?
При чём тут вообще автофильтр?

Перебор значений автофильтра не реализовать - надо макросом получать список уникальных значений из диапазона, и потом перебирать их в цикле.

Может, вы всё же подробно опишите, что вам надо, и прикрепите пример файла (как это рекомендуется в правилах раздела)
EducatedFool вне форума Ответить с цитированием
Старый 27.10.2010, 13:56   #7
Volodymyr
Пользователь
 
Регистрация: 28.02.2008
Сообщений: 70
По умолчанию

вот файл с примером таблицы.

я хочу проверить каждый непустой элемент из диапазона C:E на строгое соответствие со списками в столбце А на страницах
page1, page2 и page3

если значение совпадает со значением в столбце А:А на странице page1, то ячейку перекрасить в красный
если значение совпадает со значением в столбце А:А на странице page2, то ячейку перекрасить в зеленый
если значение совпадает со значением в столбце А:А на странице page3, то ячейку перекрасить в синий
в противном случае ячейку оставить без заливки

реальная таблица имеет более 1000 строк
Вложения
Тип файла: zip probe1.zip (4.9 Кб, 14 просмотров)
Volodymyr вне форума Ответить с цитированием
Старый 01.11.2010, 20:42   #8
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,858
По умолчанию

Цитата:
если значение совпадает со значением в столбце А:А на странице page1, то
А если некоторое значение присутствует и на странице page1, и на странице page3?
В какой цвет красить?
А если на всех страницах присутствует?


Можно сделать макросами - если не хотите тормозов из-за большого объёма данных:
Код:
Function MyRange() As Range
    Dim sh As Worksheet: Set sh = Worksheets("form")
    Set MyRange = sh.Range(sh.[A2], sh.Range("A" & sh.Rows.Count).End(xlUp))
    Set MyRange = MyRange.Offset(, 2).Resize(, 3)
    On Error Resume Next: Set MyRange = MyRange.SpecialCells(xlCellTypeConstants)
End Function

Sub Окраска()
    Dim cell As Range: Application.ScreenUpdating = False
    For Each cell In MyRange.Cells
        Select Case False
            Case [page1!a:a].Find(cell, , , xlWhole) Is Nothing
                cell.Interior.Color = vbRed
            Case [page2!a:a].Find(cell, , , xlWhole) Is Nothing
                cell.Interior.Color = vbGreen
            Case [page3!a:a].Find(cell, , , xlWhole) Is Nothing
                cell.Interior.Color = vbBlue
        End Select
    Next cell
End Sub

Sub Очистка()
    MyRange.Interior.ColorIndex = 0
End Sub
Пример - в файле: http://excelvba.ru/XL_Files/Sample__...__22-41-53.zip
EducatedFool вне форума Ответить с цитированием
Старый 02.11.2010, 08:22   #9
Volodymyr
Пользователь
 
Регистрация: 28.02.2008
Сообщений: 70
По умолчанию

EducatedFool, спасибо
Цитата:
А если некоторое значение присутствует и на странице page1, и на странице page3?
В какой цвет красить?
А если на всех страницах присутствует?
значения на страницах page1-3 не должны повторяться, если они есть дубликаты, наверно их надо выделить отдельным цветом.
большое спасибо за помощь. До этого я пользовался автофильтром, но при закрытии файла, он пропадал.
спасибо.
Volodymyr вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
сравнение ячеек Михаил2261 Microsoft Office Excel 6 29.09.2010 02:55
сравнение ячеек Михаил2261 Microsoft Office Excel 1 06.07.2010 19:29
Сравнение ячеек xxxxx0111 Microsoft Office Excel 4 12.02.2010 17:29
и опять сравнение ячеек skoda Microsoft Office Excel 1 18.12.2008 15:52
сравнение ячеек emc2 Microsoft Office Excel 6 18.10.2008 21:08