Skip Navigation Links.
Expand VBAVBA
엑셀프로그래밍이 필요한 이유
Expand ExcelExcel
Expand External LibraryExternal Library
Expand SolutionSolution
Expand EssayEssay

Application_4|EnableEvents|End|SelectionChange|OnKey|
|MoveAfterReturnDirection|Intersect|End|EntireColumn|

셀을 선택할때 발생하는 이벤트

셀을 선택할때 발생하는 이벤트를 SelectionChange이벤트라고 한다
이런 것을 어디에 써먹을까??
아래의 그림과 같은 예를 하나 보자
언젠가 성격분석툴을 만들어준 적이 있다..그중에서
Worksheet오브젝트의 SelectionChange이벤트와
Application오브젝트의 EnableEvents속성을 활용한 소루션의 예로서 일부만
뜯어 내어 보도록 한다




아래와 같이 만들고 싶다

  • 회색부분의 체크할수 있는 셀만 선택가능하게 한다
  • 그 외의 범위는 선택해도 특정셀로 이동하게 강제한다
  • 각각의 문항의 최고와 최저열을 선택하면
  • 해당열은 모두 지워지고 새로 선택한 셀만 체크표시가 있도록 한다




아래와 같은 기능이 필요하다

  • WorkSheet오브젝트의 SelectionChange이벤트프로시져를 활용한다
  • 특정범위를 선택했는지 않했는지를 알기 위하여 Intersect메소드로
  • 특정범위와 선택한 셀의 교차범위를 찾아낸다
  • 유효한 범위를 선택한것이 확인되면 해당설문의 다른 체크를 지운다
  • 이때 EntireColumn속성등을 사용한후 Intersect메소드로 처리한다
  • 유효하지 않은 셀을 선택하였다면 A1셀을 선택하게 하고
  • 이때는 이벤트가 발생할 필요가 없으므로
  • Application오브젝트의 EnableEvents속성을 활용한다
  • 이벤트를 활용한 개발을 할때는 End명령을 중간에 임시로 작성하여
  • 개발중에는 이벤트가 발생하지 않도록 하는것이 좋다


Use SelectionChange Event

엔터키를 친후 선택위치의 방향을 상황에 따라서 바꾸기

프로그래밍은 목적한바 사용하기 편하게 하기 위함이다
정보를 입력하고 엔터키를 치면 기본적으로 셀의 이동은
아래 방향으로 이동한다
그러나 상황에 따라서 오른쪽으로 이동을 하고 싶기도 하고
또 어떤때는 왼쪽으로 이동을 하도록 하고 싶기도 하고



그림과 같이 수동으로 지정할수 있겠지만 상황에 따라서 방향을
바꾸게 하려면 프로그래밍을 하면 융통성이 있고 편리할것이다




아래와 같이 만들고 싶다

  • 체크박스를 체크하면 방향키를 전혀 쓸수없게 한다
  • 엔터키를 치면서 오른쪽으로 돌아서 마지막셀에서
  • 한칸내려와서 왼쪽으로 돌아서 다시 내려와서
  • 오른쪽으로 이동한다
  • 한바퀴 돈후에는 다시 처음셀로 돌아간다
  • 선택된 셀은 항상 색상을 다르게 한다




  • 유효한 범위에 셀이 선택되었는지 확인후 처리
  • 유효한 범위내에서 어떤 위치에 선택된 셀이 위치하는지..
  • 위치된 상태에 따라서
  • Application.MoveAfterReturnDirection속성을 준다
  • 속성값에 대한 상수는 xlUp|xlDown|xlToRight|xlToLeft 4개이다




어떤범위에서 선택된 셀의 위치를 추적하기 위하여서는
그림과 같이 기준되는 값들을 변수에 담고 처리한다
물론 SelectionChange이벤트프로시져에서 처리 한다
셀이 선택될때마다 위치를 확인하고 확인상태에 따라서
셀의 이동위치를
Application.MoveAfterReturnDirection속성값에 전달하면
엔터키를 치면 속성값의 지정에 따라서 이동하게 된다

Set rStage = Range("rStage")
iStartCol = rStage.Column
iEndCol = iStartCol + rStage.Columns.Count - 1
iStartRow = rStage.Row
iEndRow = iStartRow + rStage.Rows.Count - 1

대상범위를 rStage라고 이름을 짓고 범위의 Coloum,Columns속성등을
이럴때 써먹어서 원하는 값을 변수에 담고


Private Sub chkDirectionKey_Click()
With Application
    If Me.chkDirectionKey.Value = True Then
        .OnKey "{UP}", ""
        .OnKey "{DOWN}", ""
        .OnKey "{RIGHT}", ""
        .OnKey "{LEFT}", ""
    Else
        .OnKey "{UP}"
        .OnKey "{DOWN}"
        .OnKey "{RIGHT}"
        .OnKey "{LEFT}"
    End If
End With
Range("rStage").Cells(1).Select
End Sub

체크버튼을 체크하면 방향키의 기능이 중단되고
체크를 지우면 방향키가 다시 살아난다
Application오브젝트는 OnKey메소드를 제공하고
키에 연결된 기능을 죽이기도 하고 살리기도 하고
혹은 다른 원하는 프로시져를 작동하게 할수도 있다

Application.OnKey "{UP}","실행시키고 싶은 프로시져이름"

로 하여주면 원하는 프로시져가 실행된다
당초의 엑셀이 제공하는 단축키로 복구시키고 싶으면

Application.OnKey "{UP}"

와 같이 두번째 매개변수를 전달하지 않으면 된다


Application오브젝트에서 설정하는 옵션이나
자판의 키의 설정등은 엑셀전체 통합문서에
영향을 주게 된다
특정 통합문서나 특정시트을 위한 설정은 그곳을 벗어날때는
원상복귀시키는 습관을 갖는것이 좋다
체크박스등을 사용하여 체크를 지워주고 다른 통합문서나
시트로 이동하던가..
앞으로 계속 진행될 적당한 이벤트에서 원상복귀하는 장치를
하여야 할것이다..이런 작업을 얼마나 세심하게 잘하는가??
라는것인 경험있는 프로그래머인가..아닌가??를
결정하게 된다


Set MoveAfterReturnDirection Property