Excel VBA – 재료 색상표

문제를 제거하기 위해 도구를 사용해보십시오

Excel VBA – 재료 색상표

안녕하세요,
이 문서는 Material Color Palette [ https://material.io/guidelines/style/color.html# ]를 VBA 코드로 변환하고 이를 처리하는 방법. 추가로, 재료 색상의 전체 그라디언트를 얻기 위한 색상 보간이라는 작은 특수 기능이 있습니다.

깃허브

내 repo에서 전체 코드 및 예제를 찾을 수 있습니다. https://github.com/inDeev/Material-Colors-in-Excel-VBA

sqlite를 mysql로 ​​변환

준비

매크로를 지원하는 Excel 파일을 준비해야 하므로 새 Excel 시트를 열고 MaterialColorPalette.xlsm으로 저장합니다. 시트가 열린 상태에서 [Alt+F11]로 VBA 창을 실행합니다.



매트컬러 함수

프로젝트 [메뉴->삽입->모듈]에 새 모듈을 삽입하고 속성 창에서 이름을 materialColors로 바꿉니다.
모듈 이름 바꾸기
이제 materialColor 모듈을 두 번 클릭하여 열고 아래에 붙여넣은 코드를 삽입합니다.

Option Explicit Public Function matColor(Name As String, Optional intensity As Integer = 500) As Long Dim colorValue As Long matColor = colorValue End Function

머티리얼 컬러 웹사이트를 보면 팔레트의 각 색상이 색상 명도와 색상 강도를 정의하는 번호(50, 100, 200, …, 900)로 정의되어 있음을 알 수 있습니다. 그 때문에 우리는 인자 Name(String)과 intensity(integer)를 사용하는데, 기본값은 500이고 선택 사항입니다(Google에서는 500가지 색상을 기본 색상으로 사용하는 것이 좋습니다). 우리 함수의 반환 유형은 Excel VBA의 색상이 표시되는 유형이기 때문에 Long입니다. colorValue는 함수에 의해 반환되기 전에 RGB 값을 할당할 수 있는 임시 변수입니다.

흑백 색상의 손잡이

If Name = 'White' Then matColor = RGB(255, 255, 255): Exit Function If Name = 'Black' Then matColor = RGB(0, 0, 0): Exit Function

색상 이름 정의

머티리얼 팔레트는 19가지 색상으로 제공됩니다. 많은 값의 경우 If-ElseIf-Else-End If 대신 Select Case-Case-End Select 조건을 사용합니다.

If Name = 'White' Then matColor = RGB(255, 255, 255): Exit Function If Name = 'Black' Then matColor = RGB(0, 0, 0): Exit Function Select Case Name ‘Requires exact color name e.g. Light Blue Case 'Red' Case 'Pink' Case 'Purple' Case 'Deep Purple' Case 'Indigo' Case 'Blue' Case 'Light Blue' Case 'Cyan' Case 'Teal' Case 'Green' Case 'Light Green' Case 'Lime' Case 'Yellow' Case 'Amber' Case 'Orange' Case 'Deep Orange' Case 'Brown' Case 'Grey' Case 'Blue Grey' End Select

이제 약간 수정하여 Name 인수 값을 수정하고 색상 이름 대소문자를 소문자로 변경하여 대소문자를 구분하지 않는 값으로 색상 이름을 호출할 수 있습니다.

Name = LCase(Name) If Name = 'white' Then matColor = RGB(255, 255, 255): Exit Function If Name = 'black' Then matColor = RGB(0, 0, 0): Exit Function Select Case Name ‘Allows case insensitive names e.g. Light blue, liGHt Blue Case 'red' Case 'pink' Case 'purple' Case 'deep purple' ... End Select

다음에 이름 인수 값과 색상 이름 대소문자를 수정하면(공백 제거) 공백이 있거나 없는 두 단어 이름을 입력할 수 있습니다.

Name = LCase(Replace(Name, ' ', '')) If Name = 'white' Then matColor = RGB(255, 255, 255): Exit Function If Name = 'black' Then matColor = RGB(0, 0, 0): Exit Function Select Case Name ‘Allows case insensitive names w/ or w/o spaces e.g. lIghtBlUe Case 'red' Case 'pink' Case 'purple' Case 'deeppurple' ... End Select

마지막으로 마지막 두 색상에 대해 회색/회색 값을 사용할 수 있습니다.

Case 'gray', 'grey' Case 'bluegray', 'bluegrey'

색상 할당 트리

여기 전체 기능에서 가장 지루한 부분인 색상 값의 수동 복사 및 붙여넣기가 있습니다. 그러나 약간의 문제가 있습니다. 색상은 16진수 코드로 설명되며 VBA에는 10진수 값으로 정의된 RGB가 필요합니다. 아래 코드는 RGB 명령에 의해 colorValue 변수에 변환되어 할당된 값입니다.

Name = LCase(Replace(Name, ' ', '')) If Name = 'white' Then matColor = RGB(255, 255, 255): Exit Function If Name = 'black' Then matColor = RGB(0, 0, 0): Exit Function Select Case Name ‘Allows case insensitive names w/ or w/o spaces e.g. lIghtBlUe Case 'red' Select Case intensity Case 50: colorValue = RGB(255, 235, 238) Case 100: colorValue = RGB(255, 205, 210) Case 200: colorValue = RGB(239, 154, 154) Case 300: colorValue = RGB(229, 115, 115) Case 400: colorValue = RGB(239, 83, 80) Case 500: colorValue = RGB(244, 67, 54) Case 600: colorValue = RGB(229, 57, 53) Case 700: colorValue = RGB(211, 47, 47) Case 800: colorValue = RGB(198, 40, 40) Case 900: colorValue = RGB(183, 28, 28) End Select Case 'pink' Select Case intensity Case 50: colorValue = RGB(252, 228, 236) Case 100: colorValue = RGB(248, 187, 208) Case 200: colorValue = RGB(244, 143, 177) Case 300: colorValue = RGB(240, 98, 146) Case 400: colorValue = RGB(236, 64, 122) Case 500: colorValue = RGB(233, 30, 99) Case 600: colorValue = RGB(216, 27, 96) Case 700: colorValue = RGB(194, 24, 91) Case 800: colorValue = RGB(173, 20, 87) Case 900: colorValue = RGB(136, 14, 79) End Select Case 'purple' Select Case intensity Case 50: colorValue = RGB(243, 229, 245) Case 100: colorValue = RGB(225, 190, 231) Case 200: colorValue = RGB(206, 147, 216) Case 300: colorValue = RGB(186, 104, 200) Case 400: colorValue = RGB(171, 71, 188) Case 500: colorValue = RGB(156, 39, 176) Case 600: colorValue = RGB(142, 36, 170) Case 700: colorValue = RGB(123, 31, 162) Case 800: colorValue = RGB(106, 27, 154) Case 900: colorValue = RGB(74, 20, 140) End Select Case 'deeppurple' Select Case intensity Case 50: colorValue = RGB(237, 231, 246) Case 100: colorValue = RGB(209, 196, 233) Case 200: colorValue = RGB(179, 157, 219) Case 300: colorValue = RGB(149, 117, 205) Case 400: colorValue = RGB(126, 87, 194) Case 500: colorValue = RGB(103, 58, 183) Case 600: colorValue = RGB(94, 53, 177) Case 700: colorValue = RGB(81, 45, 168) Case 800: colorValue = RGB(69, 39, 160) Case 900: colorValue = RGB(49, 27, 146) End Select Case 'indigo' Select Case intensity Case 50: colorValue = RGB(232, 234, 246) Case 100: colorValue = RGB(197, 202, 233) Case 200: colorValue = RGB(159, 168, 218) Case 300: colorValue = RGB(121, 134, 203) Case 400: colorValue = RGB(92, 107, 192) Case 500: colorValue = RGB(63, 81, 181) Case 600: colorValue = RGB(57, 73, 171) Case 700: colorValue = RGB(48, 63, 159) Case 800: colorValue = RGB(40, 53, 147) Case 900: colorValue = RGB(26, 35, 126) End Select Case 'blue' Select Case intensity Case 50: colorValue = RGB(227, 242, 253) Case 100: colorValue = RGB(187, 222, 251) Case 200: colorValue = RGB(144, 202, 249) Case 300: colorValue = RGB(100, 181, 246) Case 400: colorValue = RGB(66, 165, 245) Case 500: colorValue = RGB(33, 150, 243) Case 600: colorValue = RGB(30, 136, 229) Case 700: colorValue = RGB(25, 118, 210) Case 800: colorValue = RGB(21, 101, 192) Case 900: colorValue = RGB(13, 71, 161) End Select Case 'lightblue' Select Case intensity Case 50: colorValue = RGB(225, 245, 254) Case 100: colorValue = RGB(179, 229, 252) Case 200: colorValue = RGB(129, 212, 250) Case 300: colorValue = RGB(79, 195, 247) Case 400: colorValue = RGB(41, 182, 246) Case 500: colorValue = RGB(3, 169, 244) Case 600: colorValue = RGB(3, 155, 229) Case 700: colorValue = RGB(2, 136, 209) Case 800: colorValue = RGB(2, 119, 189) Case 900: colorValue = RGB(1, 87, 155) End Select Case 'cyan' Select Case intensity Case 50: colorValue = RGB(224, 247, 250) Case 100: colorValue = RGB(178, 235, 242) Case 200: colorValue = RGB(128, 222, 234) Case 300: colorValue = RGB(77, 208, 225) Case 400: colorValue = RGB(38, 198, 218) Case 500: colorValue = RGB(0, 188, 212) Case 600: colorValue = RGB(0, 172, 193) Case 700: colorValue = RGB(0, 151, 167) Case 800: colorValue = RGB(0, 131, 143) Case 900: colorValue = RGB(0, 96, 100) End Select Case 'teal' Select Case intensity Case 50: colorValue = RGB(224, 242, 241) Case 100: colorValue = RGB(178, 223, 219) Case 200: colorValue = RGB(128, 203, 196) Case 300: colorValue = RGB(77, 182, 172) Case 400: colorValue = RGB(38, 166, 154) Case 500: colorValue = RGB(0, 150, 136) Case 600: colorValue = RGB(0, 137, 123) Case 700: colorValue = RGB(0, 121, 107) Case 800: colorValue = RGB(0, 105, 92) Case 900: colorValue = RGB(0, 77, 64) End Select Case 'green' Select Case intensity Case 50: colorValue = RGB(232, 245, 233) Case 100: colorValue = RGB(200, 230, 201) Case 200: colorValue = RGB(165, 214, 167) Case 300: colorValue = RGB(129, 199, 132) Case 400: colorValue = RGB(102, 187, 106) Case 500: colorValue = RGB(76, 175, 80) Case 600: colorValue = RGB(67, 160, 71) Case 700: colorValue = RGB(56, 142, 60) Case 800: colorValue = RGB(46, 125, 50) Case 900: colorValue = RGB(27, 94, 32) End Select Case 'lightgreen' Select Case intensity Case 50: colorValue = RGB(241, 248, 233) Case 100: colorValue = RGB(220, 237, 200) Case 200: colorValue = RGB(197, 225, 165) Case 300: colorValue = RGB(174, 213, 129) Case 400: colorValue = RGB(156, 204, 101) Case 500: colorValue = RGB(139, 195, 74) Case 600: colorValue = RGB(124, 179, 66) Case 700: colorValue = RGB(104, 159, 56) Case 800: colorValue = RGB(85, 139, 47) Case 900: colorValue = RGB(51, 105, 30) End Select Case 'lime' Select Case intensity Case 50: colorValue = RGB(249, 251, 231) Case 100: colorValue = RGB(240, 244, 195) Case 200: colorValue = RGB(230, 238, 156) Case 300: colorValue = RGB(220, 231, 117) Case 400: colorValue = RGB(212, 225, 87) Case 500: colorValue = RGB(205, 220, 57) Case 600: colorValue = RGB(192, 202, 51) Case 700: colorValue = RGB(175, 180, 43) Case 800: colorValue = RGB(158, 157, 36) Case 900: colorValue = RGB(130, 119, 23) End Select Case 'yellow' Select Case intensity Case 50: colorValue = RGB(255, 253, 231) Case 100: colorValue = RGB(255, 249, 196) Case 200: colorValue = RGB(255, 245, 157) Case 300: colorValue = RGB(255, 241, 118) Case 400: colorValue = RGB(255, 238, 88) Case 500: colorValue = RGB(255, 235, 59) Case 600: colorValue = RGB(253, 216, 53) Case 700: colorValue = RGB(251, 192, 45) Case 800: colorValue = RGB(249, 168, 37) Case 900: colorValue = RGB(245, 127, 23) End Select Case 'amber' Select Case intensity Case 50: colorValue = RGB(255, 248, 225) Case 100: colorValue = RGB(255, 236, 179) Case 200: colorValue = RGB(255, 224, 130) Case 300: colorValue = RGB(255, 213, 79) Case 400: colorValue = RGB(255, 202, 40) Case 500: colorValue = RGB(255, 193, 7) Case 600: colorValue = RGB(255, 179, 0) Case 700: colorValue = RGB(255, 160, 0) Case 800: colorValue = RGB(255, 143, 0) Case 900: colorValue = RGB(255, 111, 0) End Select Case 'orange' Select Case intensity Case 50: colorValue = RGB(255, 243, 224) Case 100: colorValue = RGB(255, 224, 178) Case 200: colorValue = RGB(255, 204, 128) Case 300: colorValue = RGB(255, 183, 77) Case 400: colorValue = RGB(255, 167, 38) Case 500: colorValue = RGB(255, 152, 0) Case 600: colorValue = RGB(251, 140, 0) Case 700: colorValue = RGB(245, 124, 0) Case 800: colorValue = RGB(239, 108, 0) Case 900: colorValue = RGB(230, 81, 0) End Select Case 'deeporange' Select Case intensity Case 50: colorValue = RGB(251, 233, 231) Case 100: colorValue = RGB(255, 204, 188) Case 200: colorValue = RGB(255, 171, 145) Case 300: colorValue = RGB(255, 138, 101) Case 400: colorValue = RGB(255, 112, 67) Case 500: colorValue = RGB(255, 87, 34) Case 600: colorValue = RGB(244, 81, 30) Case 700: colorValue = RGB(230, 74, 25) Case 800: colorValue = RGB(216, 67, 21) Case 900: colorValue = RGB(191, 54, 12) End Select Case 'brown' Select Case intensity Case 50: colorValue = RGB(239, 235, 233) Case 100: colorValue = RGB(215, 204, 200) Case 200: colorValue = RGB(188, 170, 164) Case 300: colorValue = RGB(161, 136, 127) Case 400: colorValue = RGB(141, 110, 99) Case 500: colorValue = RGB(121, 85, 72) Case 600: colorValue = RGB(109, 76, 65) Case 700: colorValue = RGB(93, 64, 55) Case 800: colorValue = RGB(78, 52, 46) Case 900: colorValue = RGB(62, 39, 35) End Select Case 'gray', 'grey' Select Case intensity Case 50: colorValue = RGB(250, 250, 250) Case 100: colorValue = RGB(245, 245, 245) Case 200: colorValue = RGB(238, 238, 238) Case 300: colorValue = RGB(224, 224, 224) Case 400: colorValue = RGB(189, 189, 189) Case 500: colorValue = RGB(158, 158, 158) Case 600: colorValue = RGB(117, 117, 117) Case 700: colorValue = RGB(97, 97, 97) Case 800: colorValue = RGB(66, 66, 66) Case 900: colorValue = RGB(33, 33, 33) End Select Case 'bluegray', 'bluegrey' Select Case intensity Case 50: colorValue = RGB(236, 239, 241) Case 100: colorValue = RGB(207, 216, 220) Case 200: colorValue = RGB(176, 190, 197) Case 300: colorValue = RGB(144, 164, 174) Case 400: colorValue = RGB(120, 144, 156) Case 500: colorValue = RGB(96, 125, 139) Case 600: colorValue = RGB(84, 110, 122) Case 700: colorValue = RGB(69, 90, 100) Case 800: colorValue = RGB(55, 71, 79) Case 900: colorValue = RGB(38, 50, 56) End Select End Select

이제 응용 프로그램에서 호출하면 예를 들어

Range(A1).Interior.Color = matColor(Light blue, 700) Range(A1).Font.Color = matColor(white) Range(A1).Value = White on blue

시트의 첫 번째 셀은 Material Color Palette에서 정의한 올바른 색상을 얻습니다.
A1 파란색 바탕에 흰색

풀 컬러 그라디언트 사용 허용

이제 19가지 색상 각각에 대해 정확히 10가지 음영이 있습니다. 그러나 부드러운 그라디언트를 만들거나 미리 정의된 색상이 아닌 주어진 색상의 다른 음영을 사용해야 하는 경우에는 어떻게 해야 할까요? 이 경우 주어진 색상 값 사이에 선형 보간을 생성해야 합니다.
다음 단계에서는 0에서 1000까지의 Intensity 스케일을 만들 것입니다. 여기서 0은 흰색, 50은 Material Palette에서 지정한 첫 번째 밝은 색상, 900은 Material Palette의 어두운 색상, 1000은 검정색입니다.
먼저 모든 색상의 0 및 1000 강도 값에 해당하도록 흰색 및 검은색 조건 선을 수정합니다.

If Name = 'white' Or intensity = 1000 Then matColor = RGB(0, 0, 0): Exit Function

그런 다음 색상 할당을 Material Design Palette에 의해 지정된 강도를 가진 색상과 0, 50, 100, 200, 300, ..., 1000 값과 같지 않은 강도를 가진 색상의 두 부분으로 나눕니다.

If intensity Mod 100 = 0 Or intensity = 50 Then 'intensity equals to 50, 100, 200, ... Select Case Name Case red Select Case intensity Case 50 ... End Select ... ... End Select Else End If

이제 Material Design Palette에서 제공한 값 사이에 색상 값을 보간하는 함수를 만들어야 합니다. Long 유형 색상 값 사이를 직접 보간할 가능성은 없습니다. 해당 값은 빨강, 녹색 및 파랑 구성 요소로 분해한 다음 인수(1-99)로 보간하고 RGB 기능을 통해 Long 유형으로 다시 결합해야 합니다. 아래 함수 인수에서 Long이 아닌 Variant 유형으로 정의된 더 밝은 색상 입력이 있습니다. Long 유형 인수에 Long 유형 번호를 부여하려고 할 때 오류가 발생하는 일부 VBA 문제 때문입니다. 이 문제는 더 어두운 색상 인수에서는 발생하지 않습니다.

Public Function interpolateColor(lighter As Variant, darker As Long, factor As Integer) As Long Dim r1, g1, b1 As Integer r1 = lighter Mod 256 g1 = (lighter 256) Mod 256 b1 = (lighter 256 256) Mod 256 Dim r2, g2, b2 As Integer r2 = darker Mod 256 g2 = (darker 256) Mod 256 b2 = (darker 256 256) Mod 256 interpolateColor = RGB(Int(r1 - ((r1 - r2) * factor / 100)), _ Int(g1 - ((g1 - g2) * factor / 100)), _ Int(b1 - ((b1 - b2) * factor / 100))) End Function

이제 Material Color Palette에 의해 주어진 가장 가까운 더 큰 값과 가장 가까운 더 낮은 값을 찾아야 합니다. 예를 들어 우리는 강도가 234인 빨간색을 가져와야 합니다. 더 큰 강도 값은 300이고 더 낮은 값은 200입니다. Material Color Palette에는 값이 50인 강도가 포함되어 있으므로 처음 100개를 조건의 두 부분으로 나눈 다음 100에서 1000 사이의 값에 대해 한 부분으로 나누어야 합니다. 아래 코드는 위 조건의 Else 부분입니다.

Else Dim lighter, darker As Long Dim factor As Integer If intensity <50 Then ' 0-50 lighter = matColor(Name, 0) darker = matColor(Name, 50) factor = intensity * 2 ElseIf intensity < 100 Then ' 50-100 lighter = matColor(Name, 50) darker = matColor(Name, 100) factor = (intensity - 50) * 2 Else ' 100-1000 lighter = matColor(Name, Floor(intensity, 100)) ‘find closest lower intensity in Material Color Palette darker = matColor(Name, Ceiling(intensity, 100)) ‘find closest greater intensity in Material Color Palette factor = intensity - Floor(intensity, 100) End If End If

VBA는 수학 함수 Floor 및 Ceiling을 모르기 때문에 생성해야 합니다.

Public Function Ceiling(ByVal X As Double, Optional ByVal factor As Double = 1) As Double Ceiling = (Int(X / factor) - (X / factor - Int(X / factor) > 0)) * factor End Function Public Function Floor(ByVal X As Double, Optional ByVal factor As Double = 1) As Double Floor = Int(X / factor) * factor End Function

이제 Material Color Palette(밝게, 어둡게)에 있는 두 가지 색상을 요소별로 보간하여 최종 보간된 색상을 얻습니다.

Else Dim lighter, darker As Long Dim factor As Integer If intensity <50 Then ' 0-50 ... ElseIf intensity < 100 Then ' 50-100 ... Else ' 100-1000 ... End If colorValue = interpolateColor(lighter, darker, factor) End If

그게 다야, 이제 Material Color Palette의 모든 음영을 호출할 수 있습니다.

something = matColor(lime, 842)

그리고 우리는 Lime 800보다 더 어둡고 Lime 900보다 더 밝은 색상을 얻습니다.
문제가 없는지 쉽게 확인하기 위해 Excel 시트를 모든 Material Palette Colors 그라디언트로 채우는 Function을 만들어 보겠습니다. 1000행보다 한 번에 50행의 값을 화면에서 보는 것이 더 쉽기 때문에 20단계로 강도를 높입니다. 1단계는 이 기사 제목에서 볼 수 있습니다. 해당 테스트 사례의 경우 Worksheet의 SelectionChange 이벤트를 사용합니다.

Private Sub Worksheet_SelectionChange(ByVal Target As Range) Range('A:S').Interior.color = RGB(255, 255, 255) Dim i As Integer Dim j As Integer: j = 1 Dim cVal As Long For i = 0 To 1000 Step 20 cVal = matColor('red', i) Range('A' & j).Interior.color = cVal cVal = matColor('Pink', i) Range('B' & j).Interior.color = cVal cVal = matColor('Purple', i) Range('C' & j).Interior.color = cVal cVal = matColor('DeepPurple', i) Range('D' & j).Interior.color = cVal cVal = matColor('Indigo', i) Range('E' & j).Interior.color = cVal cVal = matColor('blue', i) Range('F' & j).Interior.color = cVal cVal = matColor('Lightblue', i) Range('G' & j).Interior.color = cVal cVal = matColor('Cyan', i) Range('H' & j).Interior.color = cVal cVal = matColor('Teal', i) Range('I' & j).Interior.color = cVal cVal = matColor('Green', i) Range('J' & j).Interior.color = cVal cVal = matColor('LightGreen', i) Range('K' & j).Interior.color = cVal cVal = matColor('Lime', i) Range('L' & j).Interior.color = cVal cVal = matColor('Yellow', i) Range('M' & j).Interior.color = cVal cVal = matColor('Amber', i) Range('N' & j).Interior.color = cVal cVal = matColor('Orange', i) Range('O' & j).Interior.color = cVal cVal = matColor('deepOrange', i) Range('P' & j).Interior.color = cVal cVal = matColor('Brown', i) Range('Q' & j).Interior.color = cVal cVal = matColor('Grey', i) Range('R' & j).Interior.color = cVal cVal = matColor('blueGrey', i) Range('S' & j).Interior.color = cVal j = j + 1 Next i End Sub

그리고 당신은 간다
그라디언트 STEP 20

#VBA #엑셀 #소재 #디자인 #색상

배열 자바 스크립트에 값 추가

또한보십시오: