ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • VBA 유튜브 학습기 14 - 엑셀 마우스 오른쪽 버튼 클릭하면 차트가 나타나게 하는 법(RightClick 이벤트)
    공부하는 노예/VBA(유튜브 무료 강의) 2021. 4. 27. 08:02
    728x90

    youtu.be/77w2--MBQPc

     

     

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

    계속해서 엑셀 VBA의 이벤트 기능을 이것저것 배우고 있습니다.

     

     

     

     

    오늘은 이렇게 데이터가 있을 때.

    차트를 만들 데이터 범위를 지정한 후에 마우스 오른쪽 버튼 클릭하면 바로 차트가 뿅! 생기는 이벤트에 대해 배웠는데요.

     

    마우스 우클릭으로 차트를 만드는 기능은 실무에서 자주 쓸 일은 없겠지만.

    마우스 우클릭에 어떤 이벤트를 설정해 사용하는 건 실무에서 쓸 일이 있을 수도 있을 거 같기도 하고....😶

     

    포인트는 마우스 우클릭 시 이런 동작도 되게 할 수 있다! 그거니까요.

    열심히 배워 봅니다.

     

     

     

    먼저 Alt + F11 누른 다음에 늘상 하듯이 시트명에 대고 마우스 우클릭 - [삽입] - [모듈]을 순서대로 클릭해서 모듈을 하나 삽입해 주고요.

     

    코드를 작성해 줍니다.

     

    Sub Chart01()

         Dim rngD As Range
         Dim Cht As Object

         Set rngD = Selection
         Set Cht = ActiveSheet.Shapes.AddChart2

         Cht.Chart.SetSourceData Source:=rngD

    End Sub

     

    몇 가지는 배웠던 내용이어서 복습도 할 수 있겠네요.

     

    Sub Chart01()

    '먼저 Sub문을 Chart01 프로시저로 설정해 주고요.

     

    Dim rngD As Range

    Dim Cht As Object

    'rngD를 범위로, Cht를 오브젝트로 변수 지정을 합니다.

     

     

    Set rngD = Selection

    '선택된 범위(Selection)는 rngD에 대입합니다.

     

    * Range나 Object를 변수에 담을 때는 'Set' 구문을 사용합니다. (예전에 공부한 내용 복습)

     

     

    Set Cht = ActiveSheet.Shapes.AddChart2

    '차트 생성에 관련된 지정된 구문이라고 하네요. 대충 현재 활성화된 시트(ActiveSheet)에 차트를 생성하는데(AddChart) 차트의 모양은 2번(AddCahrt2) 차트라는 뜻....이겠죠? (서당개의 추측입니다.)

     

     

    Cht.Chart.SetSourceData Source:=rngD

    '차트의 소스 데이터(SetSourceData)는 rngD의 소스를 사용합니다.(Source:=rngD)

    위에서 rngD는 선택된 범위로 설정한 거 기억하시죠? (Set rngD = Selection)

     

     

    코드를 실행해 볼게요.

     

     

     

    차트로 만들 데이터의 범위를 지정하고, VBA에 창에 가서 매크로 실행해 보면

    차트가 생성되는 걸 확인할 수 있습니다.

     

     

     

    차트가 생성되는 건 확인했으니 이제 마우스 우클릭을 했을 때 VBA가 실행되도록 설정해 줘야겠죠?

     

    마우스 우클릭 했을 때 차트가 생성되도록 설정할 시트를 더블 클릭합니다.

     

     

     

    그럼 이런 창이 뜰 텐데요.

    '(일반)'을 'Worksheet'로 바꿔 주고요.

     

     

     

    오른쪽의 '(선언)'은 'BeforeRightClick'으로 바꿔 줍니다.

     

     

    그다음 코드를 추가해 주는데요.

     

    Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)

         If Target.Count > 1 Then
              If Target.Cells(1, 1) <> "" Then
                   Call Chart01
              End If
         End If

    End Sub

     

    If문 오랜만에 보네요. 왠지 반갑.

     

    If Target.Count > 1 Then

    '만약 선택된 셀(Target)이 1 이상이라면

     

    If Target.Cells(1,1) <> "" Then

    '그리고 선택된 셀(Target)의 1행 1열이 빈 셀이 아니라면

     

    Call Chart01

    'Cahrt 01 프로시저를 불러와라.

     

    * CALL : 다른 프로시저를 호출

     

     

     

    다 작성했으니 코드를 실행해 보겠습니다.

     

     

     

    셀을 하나만 선택하고 마우스 우클릭을 하거나 비어 있는 셀을 범위 지정하고 마우스 우클릭을 하면, 기존의 마우스 우클릭과 동일하게 마우스 우클릭 메뉴가 나타나는데요.

     

    비어 있지 않은 셀(데이터가 기록된 셀)을 범위 지정한 후 마우스 우클릭을 하면 해당 범위에 대한 차트가 뿅! 하고 나타납니다.

     

     

    여기서 거슬리는 게 있죠?

    비어 있지 않은 셀을 범위 지정한 후 기존 마우스 우클릭을 했을 때 차트가 생성되는 건 좋은데 기존에 나오던 우클릭 메뉴들이 나오지 않게 하고 싶었어요.

     

     

    엑사남 님이 바로 그 점을 짚어 주셨는데요.

     

    코드를 한 줄 추가하면 바로 해결되더라고요.

     

    Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)

         If Target.Count > 1 Then
              If Target.Cells(1, 1) <> "" Then
                   Call Chart01
                   Cancel = True
              End If
         End If

    End Sub

     

    Cancel = True

    '기존에 마우스 우클릭 시 실행되던 동작을 취소하느냐?(Cancel) = 취소한다(True)

     

     

    코드 한 줄 추가하고 다시 실행해 보면

     

     

    이렇게!

    차트를 만들 범위를 제대로 선택하고 마우스 우클릭하면 마우스 우클릭 메뉴들이 나타나지 않고 바로 차트가 뿅! 나타납니다.

     

    엑셀에 별 기능이 다 있네요.

    엑셀 개발하신 분 대단..... 👏👏👏👏

     

     

    여기까지가 14강에서 배운 내용이었고요.

    14강은 과제가 있었습니다!

     

     

    [과제]

     

    차트를 여러 개 생성한 상황에서 데이터가 들어 있지 않은 빈 셀을 우클릭하면 생성된 차트가 지워지게 하세요.

     

    뭐야... 어떻게 해야 돼... 감도 안 와....ㅋㅋㅋ 하는 중에

    힌트를 주셨습니다.

     

    힌트!!

     

    차트의 개수 파악하는 구문

    ActiveSheet.ChartObjects.Count

     

    차트를 삭제하는 구문

    ActiveSheet.ChartObjects.Delete

     

     

    음... 넵!

    해 보겠습니다.

     

    과제는 완료하고 올릴게요~

    반응형

    댓글

Designed by Tistory.