ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • VBA 유튜브 학습기 11 - 선택한 셀, 범위, 행의 컬러(채우기 색) 바뀌게 하는 방법
    공부하는 노예/VBA(유튜브 무료 강의) 2021. 4. 15. 08:54
    728x90

    youtu.be/RYWWPZkCbVw

     

     

    엑사남 님 강의 11강 듣고 왔습니다.

    오늘은 뭔가 데이터를 확인할 때 유용하게 쓸 수 있을 것 같은 코드를 배웠습니다.

     

    왜 엑셀 데이터 쭉 작성돼 있는 걸 보다 보면 내가 지금 보고 있는 행이 처음에 보던 행이 맞는 건지....

    막 줄이 헷갈리잖아요.

     

     

    이런 식으로 행이나 열 전체를 선택해서 확인할 때도 있지만, 이게 또 단점이 있죠.

    다른 파일이 활성화가 되면 엑셀에 행이나 열 선택한 게 안 보여....😤(경험해 보신 분들은 무슨 상황인지 아실 거예요.)

     

    이럴 때 선택한 셀이나 범위, 행에 자동으로 컬러가 바뀌면 데이터 확인이 한결 편하겠죠.

    11강은 그런 것에 대한 내용입니다.

     


    Step 1. 선택한 셀 컬러 바꾸기

     

     

    먼저 Alt + F11은 이제 그냥 엑셀 켜자마자 누릅니다.

     

     

    '시트명'을 더블 클릭

     

     

    그리고 왼쪽 프로젝트 목록에서 코드를 적용할 시트명을 더블 클릭합니다.

     

    즉, Sheet1에서 셀을 선택하거나 범위를 선택하거나 행을 선택했을 때 컬러가 바뀌게 하고 싶다! 하면 Sheet1을 더블 클릭하는 거예요.

     

     

     

     

    그럼 이렇게 익숙한 창이 자동으로 나타나는데요.

     

     

     

     

    여기서 '(일반)' 부분을 클릭한 다음에 'Worksheet'를 선택을 합니다.

    그럼 오른쪽 드롭 다운 메뉴 부분이 자동으로 SelectionChange로 바뀝니다.

     

    * SelectionChange : 선택한 곳에 이벤트를 적용한다는 뜻

     

     

    이렇게 세팅이 됐다면 이제 코드를 작성해 넣습니다.

     

    Private Sub Worksheet_SelectionChange(ByVal Target As Range)

         Target.Interior.ColorIndex = 3

    End Sub

     

    Target.Interior.ColorIndex = 3          '타깃(선택한 셀)의 채우기 컬러 값을 3으로 적용하라.

     

     

    기억이 희미하지만 초반에 Interior.ColorIndex는 배웠던 적이 있어요.

    '채우기 컬러 값'을 의미합니다.

    언제 배웠냐면 이때 배웠어요.

    funnyatoz.tistory.com/9

     

    VBA 유튜브 학습기 4 - IF문 + For문 (feat. 파워 문과 기획자)

    "여러분들한테 너무 많은 걸 한꺼번에 알려드리면 포기하게 되잖아." -엑사남 님- 네.... 맞아요. 배우는 자의 심리를 너무 잘 아시는 엑사남 님 덕분에 부담 없이 4강 달려 봅니다. youtu.be/l08dQIprW9I

    funnyatoz.tistory.com

     

     

     

    * Interior.ColorIndex : 채우기 컬러 값

     

    ColorIndex = 3은 컬러를 무슨 색으로 할지를 지정한 것인데, 3은 빨간색입니다.

     

     

     

    엑셀 시트로 가서 아무 셀이나 선택해 봅니다.

     

     

     

    그럼 이렇게 선택한 셀들이 빨간색(ColorIndex = 3)으로 바뀌는 걸 볼 수 있어요.

    셀 하나를 선택해도, 범위를 선택해도 모두 적용됩니다.

     

     

    빨강탈트가 올 거 같아서 다시 선택한 셀들을 흰색으로 바꿀 수 있도록 코드를 수정해 봅니다.

     

    Private Sub Worksheet_SelectionChange(ByVal Target As Range)

         Target.Interior.ColorIndex = 0

    End Sub

     

    처음 코드와 동일하고 ColorIndex 값만 0으로 바뀌었습니다.

     

    ColorIndex = 0은 '흰색'을 의미합니다.

     

     

    다시 시트로 돌아가서 빨간색이었던 셀들을 선택해 봅니다.

     

     

     

     

    이렇게 다시 셀들이 흰색으로 바뀝니다.

     

     


    Step 2. 선택한 셀에 컬러 적용하고, 다시 선택하면 흰색으로 원복하기

     

    그동안 열심히 배웠던 IF문을 이용해서,

     

    셀 채우기 컬러가 빨간색인 셀을 선택하면 흰색으로, 흰색인 셀을 선택하면 빨간색으로 바뀌게 코드를 새로 작성해 봅니다.

     

     

    Private Sub Worksheet_SelectionChange(ByVal Target As Range)

         If Target.Interior.ColorIndex = 3 Then
              Target.Interior.ColorIndex = 0
         Else
              Target.Interior.ColorIndex = 3
         End If

    End Sub

     

    좀 레벨업해서 이제 IF문 정도는 가볍게 이해할 수 있게 됐어요. 아침을 갈아넣은 보람을 느낍니다.ㅋㅋㅋ

    뿌듯💜

     

     

    If Target.Interior.ColorIndex = 3 Then     

    '셀(Target)의 채우기 컬러 값이(Interior.ColorIndex) 빨간색(3)이라면

     

         Target.Interior.ColorIndex = 0         

         '셀(Target)의 채우기 컬러 값을(Interior.ColorIndex) 흰색(0)으로 적용하라.

     

    Else         

    '그렇지 않다면. 즉, 셀의 채우기 컬러 값이 빨간색이 아니라면

         Target.Interior.ColorIndex = 3          

         '셀(Target)의 채우기 컬러 값을(Interior.ColorIndex) 빨간색(3)으로 적용하라.

     

     

    이런 내용입니다.

     

     

    작성해 놓고 보니 뭔가 같은 구문이 반복되는 게 눈에 띄죠?

     

    구문마다 Target.Interior 라는 구문이 반복됩니다.

     

     

    일기로 치면 

     

    나는 밥을 먹었다.

    나는 학원에 갔다.

    나는 숙제를 했다.

    나는 잠을 잤다.

     

    이런 느낌 쯤 될 거 같아요. 

     

     

    이걸 이제 쓸데 없는 반복을 생략하고

     

    나는 밥을 먹었고, 학원에 갔고, 숙제를 했고, 잠을 잤다. 

     

    이쯤으로 바꿔 주려고 합니다.

     

     

     

    예전에 반복되는 구문은 With로 묶을 수 있다고 배웠었잖아요?

    기억이 안 난다면 여길 다녀옵니다....저도 갔다왔어요 사실 ㅋㅋㅋ

    funnyatoz.tistory.com/11

     

    VBA 유튜브 학습기 6 - 입력된 값이 변할 때마다 테이터에서 해당 값을 찾아 서식 적용하기

    엑사남 님 강의 6강! 오늘 드디어 제가 엑셀에서 써 보고 싶었던 내용을 배웠습니다. youtu.be/KjsMiokI3GM 실무에서 이런 경우가 많은 거 같아요. 특정 조건에 맞는 데이터만 찾아서 표시해야 하는 경

    funnyatoz.tistory.com

     

     

    With문을 활용해 코드를 이렇게 수정해 봅니다.

     

    Private Sub Worksheet_SelectionChange(ByVal Target As Range)

         With Target.Interior

              If .ColorIndex = 3 Then
                   .ColorIndex = 0
              Else
                   .ColorIndex = 3
              End If

         End With

    End Sub

     

     

    With문으로 반복되는 구문인 Tartget.Interior를 묶어 주고요.

    If문에는 Target.Interior를 뺀 구문만 남깁니다.

     

    Witha문을 썼으니 End With로 닫아 주는 것도 기억해야겠죠.

    맨날 IF문 안 닫아서 디버그 오류 창 보는 애가 바로 접니다.

     

     

    코드 정리를 마쳤으니 시트로 돌아가서 테스트를 해 볼게요.

     

     

     

     

    이렇게 흰색 셀들을 클릭하면 빨간색으로 채우기 색이 바뀌고요.

     

     

     

     

    빨간색 셀들을 선택하면 다시 이렇게 흰색으로 바뀝니다.

     

     

    이렇게 해 놓고 보니 인간의 욕심은 끝이 없는지라...

    아무 데나 선택했을 때 바뀌는 거 말고.... 데이터가 있는 범위에서만 이 동작이 되게 하고 싶죠?

     


     

    Step 3. 데이터가 있는 범위를 선택했을 때만 셀 컬러 바뀌게 하기

     

     

    데이터가 작성돼 있는 범위 내를 선택했을 때만 셀 컬러가 바뀌게 코드를 작성해 봅니다.

     

    코드는 이렇습니다.

     

    Private Sub Worksheet_SelectionChange(ByVal Target As Range)

         If Intersect(Target, Range("F7:L25")) Is Nothing Then Exit Sub

         Target.Interior.ColorIndex = 6

    End Sub

     

    1일 1 낯섦......

    생소하네요.

     

    Intersect라는 걸 처음보는데.

    영어 뜻 그대로 교집합이라는 뜻입니다.

     

    * Intersect : 두 개의 인자 값 중에 겹치는 부분. 즉, 교집합

     

    사전 지식을 깔아 두고 코드를 볼게요.

     

    If Intersect(Target, Range("F7:L25")) Is Nothing Then Exit Sub

    '선택한 셀(Target)이 F7 셀부터 L25 셀의 범위 내에(Range("F7:L25")) 있지 않다면(Is Nothing)

    서브문을 빠져나가라.(Exit Sub)

     

    Target.Interior.ColorIndex = 6

    '그게 아닌 경우엔(범위 내에 있을 경우엔) 선택한 셀의(Target) 채우기 컬러 값을(Interior.ColorIndex) 노란색(6)으로 적용하라.

     

     

    이렇게 코드를 작성하고 시트에 가서 테스트를 해 보면

     

    합계, 평균 값은 대충 입력했습니다. 이번 강의에서 중요한 값이 아니라서요.

     

     

    F7 셀부터 L25 셀의 범위를 벗어난 곳은 아무리 선택해도 아무런 변화가 없습니다.

     

     

     

     

    범위 내의 셀을 선택하면 이렇게 노란색으로 셀이 노란색으로 바뀝니다.

     

     


     

    Step 4. 범위 내에 선택한 셀에 컬러 적용하고, 다시 선택하면 흰색으로 원복하기

     

    Step 2에서 했던 내용을 Step 3에 버무리는 코드입니다.

     

    Private Sub Worksheet_SelectionChange(ByVal Target As Range)

         If Intersect(Target, Range("F7:L26")) Is Nothing Then Exit Sub

         With Target.Interior

              If .ColorIndex = 6 Then
                   .ColorIndex = 0
              Else
                   .ColorIndex = 6
              End If

         End With

    End Sub

     

    바로 앞에서 공부한 거니까 설명을 패스하고

     

     

    시트로 가서 코드를 테스트해 봅니다.

     

     

     

    이렇게 범위 내에서는 셀을 선택하든 드래그해서 일정 범위를 선택하든 기존에 흰색 셀들은 노란색으로 바뀌고요.

     

     

     

     

    노란색인 셀이나 범위를 다시 선택하면 흰색으로 다시 바뀝니다.

     

     

     

    번외. 셀 하나하나 선택 시에만 컬러 변경하기(드래그해 여러 셀 선택했을 때는 변화 없음)

     

    그런데

    인간의 욕심은 끝이 없으니까.

     

    드래그해서 범위를 잡았을 때 말고.

    셀을 하나하나 선택했을 때만 컬러가 바뀌게 하고 싶다!

    그럴 수 있잖아요?

     

    퇴근 시간 다 돼 가면 의미 없음 드래그를 하곤 하니까요.

     

     

    뭐 대략 이렇게

     

    그런 경우를 미연에 방지하기 위한 코드 쯤 될 거 같네요. 🤣🤣

     

     

    다른 코드는 모두 동일하고 코드 한 줄만 추가하면 됩니다.

     

    Private Sub Worksheet_SelectionChange(ByVal Target As Range)

         If Intersect(Target, Range("F7:L26")) Is Nothing Then Exit Sub
         If Target.Count > 1 Then Exit Sub

         With Target.Interior

              If .ColorIndex = 6 Then
                   .ColorIndex = 0
              Else
                   .ColorIndex = 6
              End If

         End With

    End Sub

     

    * Tartget.Count : 선택한 셀의 개수

     

    사전 지식 깔아 두고 코드를 보면.

     

    If Target.Count > 1 Then Exit Sub

    '선택한 셀의 개수(Target.Count)가 1개보다 많다면(>1) 서브문을 빠져나가라.(Exit Sub)

     

     

    시트로 가서 테스트를 해 볼게요.

     

     

     

    셀을 하나하나 선택할 땐 컬러가 노란색ㅇ로 변하는데

    범위를 잡으면 컬러가 변하지 않습니다.

     

     


     

    이번 강의에도 과제가 있었어요.

     

     

     

    [과제]

     

     

    성명을 선택했을 때 성명 셀의 컬러가 바뀌도록 설정한 후, 해당 성명에 해당하는 데이터 값들(행)의 색상이 함께 변경되게 하세요.

    단, 이때 성명 외에 다른 열을 선택했을 때는 셀의 컬러가 바뀌어선 안 됩니다.

    (배운 적은 없지만 resize 라는 걸 활용하면 된다고 힌트를 주셨어요.)

     

    그리고 [지우기] 버튼을 클릭하면 셀 컬러가 모두 원복(흰색)이 되도록 만드세요.

     


    너무 복잡한데요 선생님.........🙄

     

    좀 복잡해 보이지만 차근차근 스텝별로 해 보겠습니다.

     

     

    <Step 1>

     

    시트에서 '성명'에 해당하는 열을 선택했을 때 '성명' 열의 셀만 컬러가 바뀌게 먼저 해 볼게요.

     

    Private Sub Worksheet_SelectionChange(ByVal Target As Range)

         Dim lngR As Long

         lngR = Range("F10000").End(xlUp).Row


         If Intersect(Target, Range("F7:F" & lngR)) Is Nothing Then Exit Sub

         With Target.Interior
              If .ColorIndex = 6 Then
                   .ColorIndex = 0
              Else
                   .ColorIndex = 6
              End If
         End With

    End Sub

     

    lngR = Range("F10000").End(xlUp).Row

    예전 강의에서 배웠던 걸 활용했습니다.

    나중에 데이터가 아래 행에 추가 입력될 수도 있으니까

    '데이터가 입력된 마지막 행을 자동으로 찾을 수 있도록' lngR을 따로 변수로 설정해 줬습니다.

     

    F열 10000번째 셀까지의 범위 중에 데이터가 있는 마지막 행을 찾는 코드입니다.

     


     

    If Intersect(Target, Range("F7:F" & lngR)) Is Nothing Then Exit Sub

    성명이 F열이니 선택된 셀이 F일 경우, 해당 셀에 아무 내용이 없다면 Sub문을 빠져나가게 코드를 수정했어요.

    F열의 범위는 데이터 입력이 시작된 F7 셀부터 F열의 lngR 행까지(데이터가 입력된 마지막 행까지)로 설정했습니다.

     

    코드를 실행해 보면

     

     

    이렇게!

    F열을 선택하면 셀 채우기 컬러가 노란색으로 바뀌지만 다른 열은 클릭해도 아무 변화가 일어나지 않습니다.

     

    데이터가 추가되면 자동으로 마지막 행을 찾을 수 있도록 lngR이라는 변수를 따로 설정해 놓았으니까

    26행에 새로운 데이터를 추가해 볼게요.

     

     

    데이터가 없는 지금은 26행을 선택해도 아무런 변화가 일어나지 않습니다.

     

     

     

    26행에 데이터를 추가하고 셀을 선택해 보면 이렇게!

    셀 채우기 컬러가 바뀌는 걸 확인할 수 있어요.

     

     

     

    <Step 2>

     

    이제 성명을 선택했을 때 해당 성명에 해당하는 데이터 값들(행)의 색상이 함께 변경되게 코드를 추가해 볼게요.

     

    Private Sub Worksheet_SelectionChange(ByVal Target As Range)

         Dim lngR As Long

         lngR = Range("F10000").End(xlUp).Row

         If Intersect(Target, Range("F7:F" & lngR)) Is Nothing Then Exit Sub

         With Target
              If .Interior.ColorIndex = 6 Then
                   .Resize(1,7).Interior.ColorIndex = 0
              Else
                   .Resize(1,7).Interior.ColorIndex = 6
              End If
         End With

    End Sub

     

    다른 부분은 바뀐 건 없고요.

    컬러가 바뀌도록 명령하는 부분만 조금 수정하였습니다.

     

    With Target

    With문에 'Target Interior'가 묶여 있었는데 코드를 수정하다 보니, 이제 공통되는 구문이 'Target' 밖에 없어서 With문을 좀 수정했어요.

     

     

     If .Interior.ColorIndex = 6 Then

    이 부분은 계속 반복돼서 이제 쉽죠?

    셀의 채우기 컬러를 노랑(6)이라면~ 이런 뜻입니다.

     

    더 정확하게는

    With문에 따로 빼낸 Target 문구까지 함께 보면 선택된 셀의 채우기 컬러가 노랑이라면~ 이런 뜻이죠.

     

     

    .Resize(1,7).Interior.ColorIndex = 0

    그렇다면 그 셀을 기준으로 1행 7열을 새롭게 영역을 잡아서(Resize(1,7)

    셀 채우기 컬러를 흰색(0)으로 바꿔라.

     

    이런 뜻이 되겠습니다.

     

    * Resize(행 개수, 열 개수) : 현재 셀 기준으로 행과 열 개수만큼의 범위를 지정해라.

     

     

     

     

    코드를 실행해 보면

     

     

    이렇게 성명 열의 셀만 선택해도 해당 성명의 데이터 행의 채우기 컬러가 모두 바뀝니다.

     

    다시 해당 셀들은 선택해 보면

     

     

    이런 식으로 셀의 컬러가 다시 흰색으로 바뀌고요.

     

     

    <Step 3>

     

    이제 [지우기] 버튼을 누르면 셀 컬러가 모두 흰색으로 원복이 되도록 만들어 볼게요.

     

    모듈을 하나 만들어 주고요.

     

     

    코드를 이렇게 작성해 줍니다.

     

    Sub clear_btn()

         Dim lngR As Long

         lngR = Range("F10000").End(xlUp).Row

         Range("F7:L" & lngR).Interior.ColorIndex = 0

    End Sub

     

    나머지는 위에서 설명했던 내용이고....

    지울 때는 데이터가 입력된 범위 모두를 지울 거니까

     

    셀 채우기 컬러를 흰색(0)으로 설정할 범위를 F7 셀부터 L열의 마지막 행(lngR)까지 설정해 주면 끝!

     

     

     

    이제 버튼을 만들어 줘야겠죠?

     

     

     

     

    이렇게 [개발 도구] - [삽입]을 누르면 버튼을 만들 수 있는 메뉴가 나타납니다.

     

    선택해 주고

     

     

     

    적당한 위치에 대충 버튼을 넣은 다음에 

    버튼에 마우스 대고 마우스 오른쪽 버튼 클릭 - [텍스트 편집] 클릭해서 버튼명을 '지우기'로 바꿔 줍니다.

     

     

    이제 매크로를 연결해 줘야죠.

     

     

     

    다시 버튼에 대고 마우스 오른쪽 버튼 클릭 - [매크로 지정]을 누르고요.

     

     

     

     

    작성한 매크로를 선택하고 [확인]을 눌러 줍니다.

     

     

    이제 거의 다 왔어요!!!! 🙌🙌🙌🙌🙌 호우!

     

     

     

    이렇게 노란 줄이 쭉쭉 가 있는 상태에서 [지우기] 버튼 눌러 볼게요.

     

     

     

     

    이렇게!!! 노란색이던 셀들이 흰색으로 바뀌었습니다.

     

     

    후~ 숙제 끝났네요 ㅠㅠ  마음이 가볍습니다!

     

    이제 12강 들으러 가야겠네요ㅎㅎ

    반응형

    댓글

Designed by Tistory.