2017-01-17 2 views
4

Я пишу макрос, который проверяет листы данных на несколько лет, чтобы найти специально окрашенные ячейки. К сожалению, люди сосут и не всегда выбирали один и тот же цвет клеток на протяжении многих лет (все они могут быть одинаковыми для человеческого глаза, но имеют разные значения RGB).Создайте вектор цвета в VBA

Если у меня есть ячейка с внутренним цветом RGB (255,23,50), есть ли способ создать цветной вектор, чтобы увидеть, если на него падает цвет интерьера салона? Я хочу создать вектор с +/- 15 точками RGB, поэтому, если я ищу ячейки с RGB (255,23,50), я хочу вектор между RGB (255,38,65) и RGB (240,8 , 35).

Я знаю, что могу просто использовать оператор IF, чтобы увидеть, падает ли цвет между этими двумя значениями, но если бы я мог создать вектор цвета, я мог бы использовать его для большего количества приложений (и код будет легче модифицировать, если его нужно было изменить).

Это если оператор работает:

If ActiveWorkbook.Worksheets("Sheet1").Range("e5").Interior.Color >= RGB(240, 8, 35) And ActiveWorkbook.Worksheets("Sheet1").Range("e5").Interior.Color <= RGB(255, 38, 65) Then 
    MsgBox ("yes") 
Else 
    MsgBox ("no") 
End If 

Но я ищу что-то более по линиям:

dim redVector as long ' or other appropriate variable type 

' ***** code that defines the red vector ***** 

if range("e5").interior.color = redVector then 
    ' do stuff 
end if 
+0

Одна идея будет цикл от 1 до 255 для каждого r, g и b, преобразовать их в long и проверить корреляцию в изменении значения. – cyboashu

ответ

1

Это должно сделать:

Function IsInVector(srcColor, newColor, lOffset As Long) As Boolean 

    Dim lSrcColor As Long 
    Dim lNewColor As Long 
    Dim lTemp  As Long 

    lSrcColor = CLng(srcColor) 
    lNewColor = CLng(newColor) 

    lTemp = (lSrcColor - lNewColor)/65536 
    lTemp = Abs(Round(lTemp, 0)) 

    If lOffset <> lTemp Then 
     IsInVector = False 
    Else 
     IsInVector = True 
    End If 

End Function 

'/ Example usage:::: 
Sub test() 

    Debug.Print IsInVector(RGB(255, 23, 50), RGB(255, 38, 65), 15) '~~~> True 
    Debug.Print IsInVector(RGB(255, 23, 50), RGB(255, 43, 63), 15) '~~~> False 
    Debug.Print IsInVector(RGB(255, 23, 50), RGB(255, 38, 65), 15) '~~~> True 

End Sub 
+1

Спасибо @cyboashu. Я внес изменения, чтобы он читал 'If lOffset> lTemp then' – JonSnow

Смежные вопросы